diff --git a/.gitignore b/.gitignore index 514dd716..48acde5a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,5 +27,9 @@ bin/ # fabric run/ +run-client/ output/ -*.log +*.getBlock("log") +Convert.class +ModelPart.class +libs/ diff --git a/Convert.java b/Convert.java new file mode 100644 index 00000000..77a1705d --- /dev/null +++ b/Convert.java @@ -0,0 +1,161 @@ +class ModelPart { + static java.util.ArrayList parts = new java.util.ArrayList<>(20); + final String name; + ModelPart parent = null; + boolean mirror = false; + + float x = 0, y = 0, z = 0, rx = 0, ry = 0, rz = 0; + int u = 0, v = 0; + float bx = 0, by = 0, bz = 0, ba = 0, bb = 0, bc = 0; + float scale = 1; + static int wd = 64; + static int hg = 32; + + + boolean hadBox = false; + + ModelPart(Convert c, String name) { + this(c, 0, 0, name); + + } + + ModelPart(Convert c, int u, int v, String name) { + this.name = name; + this.u = u; + this.v = v; + parts.add(this); + } + + ModelPart(int wd, int hg, int u, int v, String name) { + this.name = name; + this.u = u; + this.v = v; + ModelPart.wd = wd; + ModelPart.hg = hg; + parts.add(this); + } + + ModelPart setPos(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + + ModelPart setRotationAngle(float x, float y, float z) { + this.rx = x; + this.ry = y; + this.rz = z; + return this; + } + + ModelPart addChild(ModelPart p) { + p.parent = this; + return this; + } + + ModelPart texOffs(int u, int v) { + this.u = u; + this.v = v; + return this; + } + + ModelPart addBox(float x, float y, float z, float a, float b, float c) { + return addBox(x, y, z, a, b, c, 1); + } + + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d) { + bx = x; + by = y; + bz = z; + ba = a; + bb = b; + bc = c; + scale = _d; + hadBox = true; + return this; + } + + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d, boolean mirror) { + this.mirror = mirror; + bx = x; + by = y; + bz = z; + ba = a; + bb = b; + bc = c; + hadBox = true; + return this; + } + + public String toString() { + String s = ""; + String pName = parent == null ? "modelPartData" : parent.name; + if (scale != 1) { + s += "CubeDeformation deformation_" + name + " = new CubeDeformation(" + scale + "f);\n"; + } + s += "PartDefinition " + name + " = "; + s += pName + ".addOrReplaceChild(\"" + name + "\", CubeListBuilder.create()\n"; + if (this.mirror) s += ".mirror()\n"; + s += ".texOffs(" + u + ", " + v + ")"; + if (this.hadBox) { + s += "\n"; + if (scale != 1) + s += ".addBox(" + bx + "f, " + by + "f, " + bz + "f, " + ba + "f, " + bb + "f, " + bc + "f, deformation_" + name + "),\n"; + else s += ".addBox(" + bx + "f, " + by + "f, " + bz + "f, " + ba + "f, " + bb + "f, " + bc + "f),\n"; + } + else { + s += ",\n"; + } + + if (x == 0 && y == 0 && z == 0 && rx == 0 && ry == 0 && rz == 0) { + s += "PartPose.ZERO"; + } + else if (rx == 0 && ry == 0 && rz == 0) { + s += "PartPose.offset(" + x + "f, " + y + "f, " + z + "f)"; + } + else { + s += "PartPose.offsetAndRotation(" + x + "f, " + y + "f, " + z + "f, \n" + rx + "f, " + ry + "f, " + rz + "f)"; + } + s += ");"; + + return s; + } + + public static void print() { + System.out.println("public static LayerDefinition getTexturedModelData() {"); + System.out.println(" MeshDefinition modelData = new MeshDefinition();"); + System.out.println(" PartDefinition modelPartData = modelData.getRoot();"); + for (ModelPart p : parts) { + System.out.println(p); + System.out.println(); + } + System.out.println("return LayerDefinition.create(modelData, " + wd + ", " + hg + ");"); + System.out.println("}"); + + System.out.println(); + System.out.println(); + + for (ModelPart p : parts) { + String pName = p.parent == null ? "modelPart" : p.parent.name; + System.out.println(p.name + " = " + pName + ".getChild(\"" + p.name + "\");"); + } + } +} + + ModelPart.print(); + } + void setRotationAngle(ModelPart p, float x, float y, float z){ + p.setRotationAngle(x, y, z); + } + public void c (){ + float scale = 1; + ModelPart[] SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4, "SHARDS[0]").addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4, "SHARDS[1]").addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4, "SHARDS[2]").addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4, "SHARDS[3]").addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + ModelPart CORE = new ModelPart(16, 16, 0, 0, "CORE"); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + } +} diff --git a/README.md b/README.md index a3ff811f..633b9ac2 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,19 @@ [![](https://jitpack.io/v/paulevsGitch/BetterEnd.svg)](https://jitpack.io/#paulevsGitch/BetterEnd) + # Better End -Better End Mod for Fabric, MC 1.16.4 + +Better End Mod for Fabric, MC 1.18 Importing: + * Clone repo * Edit gradle.properties if necessary -* Run command line in folder: gradlew genSources eclipse (or Another-IDE-Name) +* Run command line in folder: gradlew genSources idea (or eclipse) * Import project to IDE Building: + * Clone repo * Run command line in folder: gradlew build * Mod .jar will be in ./build/libs -Mappings: -* https://modmuss50.me/fabric.html?&version=1.16.4 diff --git a/build.gradle b/build.gradle index 83414897..93c749ef 100644 --- a/build.gradle +++ b/build.gradle @@ -1,114 +1,135 @@ buildscript { - dependencies { - classpath 'org.kohsuke:github-api:1.114' - } + dependencies { + classpath 'org.kohsuke:github-api:1.114' + } } plugins { - id 'idea' - id 'eclipse' - id 'fabric-loom' version '0.7-SNAPSHOT' - id 'maven-publish' + id 'idea' + id 'eclipse' + id 'fabric-loom' version "${loom_version}" + id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group +def local_bclib = findProject(':BCLib') != null repositories { maven { url "https://maven.dblsaiko.net/" } - maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" } - maven { url "https://maven.fabricmc.net/" } - maven { url 'https://maven.blamejared.com' } - maven { url "https://maven.shedaniel.me/" } - maven { url 'https://jitpack.io' } + maven { url "https://maven.fabricmc.net/" } + maven { url 'https://maven.blamejared.com' } + maven { url "https://maven.shedaniel.me/" } + maven { url 'https://jitpack.io' } + maven { url 'https://maven.terraformersmc.com/releases' } + flatDir { + dirs 'libs' + } +} + +loom { + accessWidenerPath = file("src/main/resources/betterend.accesswidener") } dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings minecraft.officialMojangMappings() - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - - useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" - useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}" + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" - useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" - //useOptional "grondag:canvas-mc116:${project.canvas_version}" + // useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}" + println "Using local BCLib: ${local_bclib}" + if (local_bclib){ + implementation( project(path:":BCLib", configuration: 'dev') ) + } else { + modImplementation "com.github.paulevsGitch:BCLib:${project.bclib_version}" + } + + useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" + useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}" + //useOptional "grondag:canvas-mc116:${project.canvas_version}" } def useOptional(String dep) { - dependencies.modRuntime (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" - if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" - } - } - dependencies.modCompileOnly (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" - if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" - } - } + dependencies.modRuntime(dep) { + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' + if (!dep.contains("me.shedaniel")) { + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' + } + } + dependencies.modCompileOnly(dep) { + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' + if (!dep.contains("me.shedaniel")) { + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' + } + } } def useApi(String dep) { - dependencies.modApi (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" - if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" - } - } + dependencies.modApi(dep) { + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' + exclude group: 'com.terraformersmc' + if (!dep.contains("me.shedaniel")) { + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' + } + } } processResources { - inputs.property "version", project.version - duplicatesStrategy = 'WARN' + inputs.property "version", project.version + duplicatesStrategy = 'WARN' - from(sourceSets.main.resources.srcDirs) { - include "fabric.mod.json" - expand "version": project.version - } + from(sourceSets.main.resources.srcDirs) { + include "fabric.mod.json" + expand "version": project.version + } + + from(sourceSets.main.resources.srcDirs) { + exclude "fabric.mod.json" + } } // ensure that the encoding is set to UTF-8, no matter what the system default is // this fixes some edge cases with special characters not displaying correctly // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html tasks.withType(JavaCompile) { - options.encoding = "UTF-8" + options.encoding = "UTF-8" } javadoc { - options.tags = ["reason"] + options.tags = ["reason"] } task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir + classifier = 'javadoc' + from javadoc.destinationDir } // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. // If you remove this task, sources will not be generated. task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource + classifier = 'sources' + from sourceSets.main.allSource } jar { - from "LICENSE" + from "LICENSE" } artifacts { - archives sourcesJar - archives javadocJar + archives sourcesJar + archives javadocJar } def env = System.getenv() @@ -117,24 +138,24 @@ import org.kohsuke.github.GHReleaseBuilder import org.kohsuke.github.GitHub task release(dependsOn: [remapJar, sourcesJar, javadocJar]) { - onlyIf { - env.GITHUB_TOKEN - } + onlyIf { + env.GITHUB_TOKEN + } - doLast { - def github = GitHub.connectUsingOAuth(env.GITHUB_TOKEN as String) - def repository = github.getRepository("paulevsGitch/BetterEnd") + doLast { + def github = GitHub.connectUsingOAuth(env.GITHUB_TOKEN as String) + def repository = github.getRepository("paulevsGitch/BetterEnd") - def releaseBuilder = new GHReleaseBuilder(repository, version as String) - releaseBuilder.name("${archivesBaseName}-${version}") - releaseBuilder.body("A changelog can be found at https://github.com/paulevsGitch/BetterEnd/commits") - releaseBuilder.commitish("master") + def releaseBuilder = new GHReleaseBuilder(repository, version as String) + releaseBuilder.name("${archivesBaseName}-${version}") + releaseBuilder.body("A changelog can be found at https://github.com/paulevsGitch/BetterEnd/commits") + releaseBuilder.commitish("master") - def ghRelease = releaseBuilder.create() - ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar"), "application/java-archive"); - ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}-sources.jar"), "application/java-archive"); - ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}-javadoc.jar"), "application/java-archive"); - } + def ghRelease = releaseBuilder.create() + ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}.jar"), "application/java-archive"); + ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}-sources.jar"), "application/java-archive"); + ghRelease.uploadAsset(file("${project.buildDir}/libs/${archivesBaseName}-${version}-javadoc.jar"), "application/java-archive"); + } } // configure the maven publication @@ -155,4 +176,4 @@ task release(dependsOn: [remapJar, sourcesJar, javadocJar]) { // // uncomment to publish to the local maven // // mavenLocal() // } -//} +//} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f902a279..026a0650 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,24 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx2G - -# Fabric Properties -# check these on https://fabricmc.net/use -minecraft_version=1.16.5 -yarn_mappings=6 -loader_version=0.11.3 - -# Mod Properties -mod_version = 0.9.8-pre -maven_group = ru.betterend -archives_base_name = better-end - -# Dependencies -# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -patchouli_version = 50-FABRIC -fabric_version = 0.32.9+1.16 -canvas_version = 1.0.+ -bclib_version = 0.1.38 -rei_version = 5.8.10 \ No newline at end of file +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx2G + +# Fabric Properties +# check these on https://fabricmc.net/use +minecraft_version=1.18.1 +fabric_version = 0.44.0+1.18 +loader_version=0.12.12 + +#Loom +loom_version=0.10-SNAPSHOT + +# Mod Properties +mod_version=1.0.1 +maven_group=ru.betterend +archives_base_name=better-end + +# Dependencies +# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api + +patchouli_version = 55-FABRIC-SNAPSHOT +bclib_version = 1.2.5 +rei_version = 7.0.343 +canvas_version = 1.0.+ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda85..7454180f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..e750102e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d..1b6c7873 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 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. @@ -17,78 +17,113 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# 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/master/subprojects/plugins/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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +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 -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +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 - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -105,79 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, 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. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + 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 + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# 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" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9109989e..ac1b06f9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 00000000..e8af8cfd --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,6 @@ +# From https://github.com/jitpack/jitpack.io/issues/4506#issuecomment-864562270 +before_install: + - source "$HOME/.sdkman/bin/sdkman-init.sh" + - sdk update + - sdk install java 17.0.1-tem + - sdk use java 17.0.1-tem \ No newline at end of file diff --git a/json/block/%name%.json b/json/block/%name%.json index 10f7880a..d129f585 100644 --- a/json/block/%name%.json +++ b/json/block/%name%.json @@ -1,6 +1,6 @@ { - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/%name%" - } + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_half_slab.json b/json/block/%name%_brick_half_slab.json index 4a5be990..0db32a8f 100644 --- a/json/block/%name%_brick_half_slab.json +++ b/json/block/%name%_brick_half_slab.json @@ -1,8 +1,8 @@ { - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/%name%_bricks", - "side": "betterend:block/%name%_bricks", - "top": "betterend:block/%name%_bricks" - } + "parent": "block/slab", + "textures": { + "bottom": "betterend:block/%name%_bricks", + "side": "betterend:block/%name%_bricks", + "top": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_inner_stairs.json b/json/block/%name%_brick_inner_stairs.json index 98c27d1f..6f04c892 100644 --- a/json/block/%name%_brick_inner_stairs.json +++ b/json/block/%name%_brick_inner_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/%name%_bricks", - "side": "betterend:block/%name%_bricks", - "top": "betterend:block/%name%_bricks" - } + "parent": "block/inner_stairs", + "textures": { + "bottom": "betterend:block/%name%_bricks", + "side": "betterend:block/%name%_bricks", + "top": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_outer_stairs.json b/json/block/%name%_brick_outer_stairs.json index 5fe881ad..481b896d 100644 --- a/json/block/%name%_brick_outer_stairs.json +++ b/json/block/%name%_brick_outer_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/%name%_bricks", - "side": "betterend:block/%name%_bricks", - "top": "betterend:block/%name%_bricks" - } + "parent": "block/outer_stairs", + "textures": { + "bottom": "betterend:block/%name%_bricks", + "side": "betterend:block/%name%_bricks", + "top": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_stairs.json b/json/block/%name%_brick_stairs.json index ee695265..94e5512c 100644 --- a/json/block/%name%_brick_stairs.json +++ b/json/block/%name%_brick_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/%name%_bricks", - "side": "betterend:block/%name%_bricks", - "top": "betterend:block/%name%_bricks" - } + "parent": "block/stairs", + "textures": { + "bottom": "betterend:block/%name%_bricks", + "side": "betterend:block/%name%_bricks", + "top": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_wall_inventory.json b/json/block/%name%_brick_wall_inventory.json index f5616dc9..7f16d3b4 100644 --- a/json/block/%name%_brick_wall_inventory.json +++ b/json/block/%name%_brick_wall_inventory.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/%name%_bricks" - } + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_wall_post.json b/json/block/%name%_brick_wall_post.json index 3e23f8a3..a7fdb47e 100644 --- a/json/block/%name%_brick_wall_post.json +++ b/json/block/%name%_brick_wall_post.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_post", - "textures": { - "wall": "betterend:block/%name%_bricks" - } + "parent": "minecraft:block/template_wall_post", + "textures": { + "wall": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_wall_side.json b/json/block/%name%_brick_wall_side.json index e95d0502..bf16dc33 100644 --- a/json/block/%name%_brick_wall_side.json +++ b/json/block/%name%_brick_wall_side.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_side", - "textures": { - "wall": "betterend:block/%name%_bricks" - } + "parent": "minecraft:block/template_wall_side", + "textures": { + "wall": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_brick_wall_side_tall.json b/json/block/%name%_brick_wall_side_tall.json index 7323cbfb..d0f4d3fc 100644 --- a/json/block/%name%_brick_wall_side_tall.json +++ b/json/block/%name%_brick_wall_side_tall.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_side_tall", - "textures": { - "wall": "betterend:block/%name%_bricks" - } + "parent": "minecraft:block/template_wall_side_tall", + "textures": { + "wall": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_bricks.json b/json/block/%name%_bricks.json index 5f68cf77..3566742f 100644 --- a/json/block/%name%_bricks.json +++ b/json/block/%name%_bricks.json @@ -1,6 +1,6 @@ { - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/%name%_bricks" - } + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/%name%_bricks" + } } \ No newline at end of file diff --git a/json/block/%name%_button.json b/json/block/%name%_button.json index 4a465cf5..bc35f8cb 100644 --- a/json/block/%name%_button.json +++ b/json/block/%name%_button.json @@ -1,6 +1,6 @@ { - "parent": "block/button", - "textures": { - "texture": "betterend:block/%name%" - } + "parent": "block/button", + "textures": { + "texture": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_button_inventory.json b/json/block/%name%_button_inventory.json index e04a286b..a16f6271 100644 --- a/json/block/%name%_button_inventory.json +++ b/json/block/%name%_button_inventory.json @@ -1,6 +1,6 @@ { - "parent": "block/button_inventory", - "textures": { - "texture": "betterend:block/%name%" - } + "parent": "block/button_inventory", + "textures": { + "texture": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_button_pressed.json b/json/block/%name%_button_pressed.json index 5afc1c34..ad08effa 100644 --- a/json/block/%name%_button_pressed.json +++ b/json/block/%name%_button_pressed.json @@ -1,6 +1,6 @@ { - "parent": "block/button_pressed", - "textures": { - "texture": "betterend:block/%name%" - } + "parent": "block/button_pressed", + "textures": { + "texture": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_half_slab.json b/json/block/%name%_half_slab.json index afe17edd..365ca375 100644 --- a/json/block/%name%_half_slab.json +++ b/json/block/%name%_half_slab.json @@ -1,8 +1,8 @@ { - "parent": "block/slab", - "textures": { - "bottom": "betterend:block/%name%", - "side": "betterend:block/%name%", - "top": "betterend:block/%name%" - } + "parent": "block/slab", + "textures": { + "bottom": "betterend:block/%name%", + "side": "betterend:block/%name%", + "top": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_inner_stairs.json b/json/block/%name%_inner_stairs.json index f7f22430..5fbdd28b 100644 --- a/json/block/%name%_inner_stairs.json +++ b/json/block/%name%_inner_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/inner_stairs", - "textures": { - "bottom": "betterend:block/%name%", - "side": "betterend:block/%name%", - "top": "betterend:block/%name%" - } + "parent": "block/inner_stairs", + "textures": { + "bottom": "betterend:block/%name%", + "side": "betterend:block/%name%", + "top": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_outer_stairs.json b/json/block/%name%_outer_stairs.json index 2c6740d1..6e0a7437 100644 --- a/json/block/%name%_outer_stairs.json +++ b/json/block/%name%_outer_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/outer_stairs", - "textures": { - "bottom": "betterend:block/%name%", - "side": "betterend:block/%name%", - "top": "betterend:block/%name%" - } + "parent": "block/outer_stairs", + "textures": { + "bottom": "betterend:block/%name%", + "side": "betterend:block/%name%", + "top": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_pressure_plate_down.json b/json/block/%name%_pressure_plate_down.json index 0836b6f5..32039660 100644 --- a/json/block/%name%_pressure_plate_down.json +++ b/json/block/%name%_pressure_plate_down.json @@ -1,6 +1,6 @@ { - "parent": "block/pressure_plate_down", - "textures": { - "texture": "betterend:block/%name%" - } + "parent": "block/pressure_plate_down", + "textures": { + "texture": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_pressure_plate_up.json b/json/block/%name%_pressure_plate_up.json index 655f909b..65ff46e0 100644 --- a/json/block/%name%_pressure_plate_up.json +++ b/json/block/%name%_pressure_plate_up.json @@ -1,6 +1,6 @@ { - "parent": "block/pressure_plate_up", - "textures": { - "texture": "betterend:block/%name%" - } + "parent": "block/pressure_plate_up", + "textures": { + "texture": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_small_tiles.json b/json/block/%name%_small_tiles.json index b81bf3b0..4f31a369 100644 --- a/json/block/%name%_small_tiles.json +++ b/json/block/%name%_small_tiles.json @@ -1,6 +1,6 @@ { - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/%name%_small_tiles" - } + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/%name%_small_tiles" + } } \ No newline at end of file diff --git a/json/block/%name%_stairs.json b/json/block/%name%_stairs.json index 1aee442b..1e4dd106 100644 --- a/json/block/%name%_stairs.json +++ b/json/block/%name%_stairs.json @@ -1,8 +1,8 @@ { - "parent": "block/stairs", - "textures": { - "bottom": "betterend:block/%name%", - "side": "betterend:block/%name%", - "top": "betterend:block/%name%" - } + "parent": "block/stairs", + "textures": { + "bottom": "betterend:block/%name%", + "side": "betterend:block/%name%", + "top": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_tile.json b/json/block/%name%_tile.json index 211afd9d..de0b467d 100644 --- a/json/block/%name%_tile.json +++ b/json/block/%name%_tile.json @@ -1,6 +1,6 @@ { - "parent": "block/cube_all", - "textures": { - "all": "betterend:block/%name%_tile" - } + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/%name%_tile" + } } \ No newline at end of file diff --git a/json/block/%name%_wall_inventory.json b/json/block/%name%_wall_inventory.json index 35d05c72..27cd062b 100644 --- a/json/block/%name%_wall_inventory.json +++ b/json/block/%name%_wall_inventory.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/wall_inventory", - "textures": { - "wall": "betterend:block/%name%" - } + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_wall_post.json b/json/block/%name%_wall_post.json index f668ca4b..dd01a06a 100644 --- a/json/block/%name%_wall_post.json +++ b/json/block/%name%_wall_post.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_post", - "textures": { - "wall": "betterend:block/%name%" - } + "parent": "minecraft:block/template_wall_post", + "textures": { + "wall": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_wall_side.json b/json/block/%name%_wall_side.json index 6fc8de4b..e997817b 100644 --- a/json/block/%name%_wall_side.json +++ b/json/block/%name%_wall_side.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_side", - "textures": { - "wall": "betterend:block/%name%" - } + "parent": "minecraft:block/template_wall_side", + "textures": { + "wall": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/block/%name%_wall_side_tall.json b/json/block/%name%_wall_side_tall.json index 9570ac1a..fe040d22 100644 --- a/json/block/%name%_wall_side_tall.json +++ b/json/block/%name%_wall_side_tall.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:block/template_wall_side_tall", - "textures": { - "wall": "betterend:block/%name%" - } + "parent": "minecraft:block/template_wall_side_tall", + "textures": { + "wall": "betterend:block/%name%" + } } \ No newline at end of file diff --git a/json/blockstates/%name%.json b/json/blockstates/%name%.json index ef978798..f230067b 100644 --- a/json/blockstates/%name%.json +++ b/json/blockstates/%name%.json @@ -1,7 +1,7 @@ { - "variants": { - "": { - "model": "betterend:block/%name%" - } - } + "variants": { + "": { + "model": "betterend:block/%name%" + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_brick_slab.json b/json/blockstates/%name%_brick_slab.json index d5a6bf3e..f548c186 100644 --- a/json/blockstates/%name%_brick_slab.json +++ b/json/blockstates/%name%_brick_slab.json @@ -1,15 +1,15 @@ { - "variants": { - "type=bottom": { - "model": "betterend:block/%name%_brick_half_slab" - }, - "type=double": { - "model": "betterend:block/%name%_bricks" - }, - "type=top": { - "model": "betterend:block/%name%_brick_half_slab", - "uvlock": true, - "x": 180 - } - } + "variants": { + "type=bottom": { + "model": "betterend:block/%name%_brick_half_slab" + }, + "type=double": { + "model": "betterend:block/%name%_bricks" + }, + "type=top": { + "model": "betterend:block/%name%_brick_half_slab", + "uvlock": true, + "x": 180 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_brick_stairs.json b/json/blockstates/%name%_brick_stairs.json index 97fbabb4..16dbadc5 100644 --- a/json/blockstates/%name%_brick_stairs.json +++ b/json/blockstates/%name%_brick_stairs.json @@ -1,209 +1,209 @@ { - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/%name%_brick_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/%name%_brick_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/%name%_brick_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/%name%_brick_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs" + }, + "facing=east,half=bottom,shape=straight": { + "model": "betterend:block/%name%_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "betterend:block/%name%_brick_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "betterend:block/%name%_brick_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "betterend:block/%name%_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_brick_wall.json b/json/blockstates/%name%_brick_wall.json index 17f3910d..346ac2f1 100644 --- a/json/blockstates/%name%_brick_wall.json +++ b/json/blockstates/%name%_brick_wall.json @@ -1,90 +1,90 @@ { - "multipart": [ - { - "when": { - "up": "true" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_post" - } - }, - { - "when": { - "north": "low" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side", - "uvlock": true - } - }, - { - "when": { - "east": "low" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "low" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "low" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side", - "y": 270, - "uvlock": true - } - }, - { - "when": { - "north": "tall" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side_tall", - "uvlock": true - } - }, - { - "when": { - "east": "tall" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side_tall", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "tall" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side_tall", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "tall" - }, - "apply": { - "model": "betterend:block/%name%_brick_wall_side_tall", - "y": 270, - "uvlock": true - } - } - ] + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/%name%_brick_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] } \ No newline at end of file diff --git a/json/blockstates/%name%_bricks.json b/json/blockstates/%name%_bricks.json index d55de86c..1851167f 100644 --- a/json/blockstates/%name%_bricks.json +++ b/json/blockstates/%name%_bricks.json @@ -1,7 +1,7 @@ { - "variants": { - "": { - "model": "betterend:block/%name%_bricks" - } - } + "variants": { + "": { + "model": "betterend:block/%name%_bricks" + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_button.json b/json/blockstates/%name%_button.json index f0a946f9..60701fd4 100644 --- a/json/blockstates/%name%_button.json +++ b/json/blockstates/%name%_button.json @@ -1,118 +1,118 @@ { - "variants": { - "face=ceiling,facing=east,powered=false": { - "model": "betterend:block/%name%_button", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=east,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "x": 180, - "y": 270 - }, - "face=ceiling,facing=north,powered=false": { - "model": "betterend:block/%name%_button", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=north,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "x": 180, - "y": 180 - }, - "face=ceiling,facing=south,powered=false": { - "model": "betterend:block/%name%_button", - "x": 180 - }, - "face=ceiling,facing=south,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "x": 180 - }, - "face=ceiling,facing=west,powered=false": { - "model": "betterend:block/%name%_button", - "x": 180, - "y": 90 - }, - "face=ceiling,facing=west,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "x": 180, - "y": 90 - }, - "face=floor,facing=east,powered=false": { - "model": "betterend:block/%name%_button", - "y": 90 - }, - "face=floor,facing=east,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "y": 90 - }, - "face=floor,facing=north,powered=false": { - "model": "betterend:block/%name%_button" - }, - "face=floor,facing=north,powered=true": { - "model": "betterend:block/%name%_button_pressed" - }, - "face=floor,facing=south,powered=false": { - "model": "betterend:block/%name%_button", - "y": 180 - }, - "face=floor,facing=south,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "y": 180 - }, - "face=floor,facing=west,powered=false": { - "model": "betterend:block/%name%_button", - "y": 270 - }, - "face=floor,facing=west,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "y": 270 - }, - "face=wall,facing=east,powered=false": { - "model": "betterend:block/%name%_button", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=east,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "uvlock": true, - "x": 90, - "y": 90 - }, - "face=wall,facing=north,powered=false": { - "model": "betterend:block/%name%_button", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=north,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "uvlock": true, - "x": 90 - }, - "face=wall,facing=south,powered=false": { - "model": "betterend:block/%name%_button", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=south,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "uvlock": true, - "x": 90, - "y": 180 - }, - "face=wall,facing=west,powered=false": { - "model": "betterend:block/%name%_button", - "uvlock": true, - "x": 90, - "y": 270 - }, - "face=wall,facing=west,powered=true": { - "model": "betterend:block/%name%_button_pressed", - "uvlock": true, - "x": 90, - "y": 270 - } - } + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "betterend:block/%name%_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "betterend:block/%name%_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "betterend:block/%name%_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "betterend:block/%name%_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "betterend:block/%name%_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "betterend:block/%name%_button" + }, + "face=floor,facing=north,powered=true": { + "model": "betterend:block/%name%_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "betterend:block/%name%_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "betterend:block/%name%_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "betterend:block/%name%_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "betterend:block/%name%_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "betterend:block/%name%_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "betterend:block/%name%_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "betterend:block/%name%_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_pillar.json b/json/blockstates/%name%_pillar.json index 27ec0347..5ff8dab2 100644 --- a/json/blockstates/%name%_pillar.json +++ b/json/blockstates/%name%_pillar.json @@ -1,7 +1,16 @@ { - "variants": { - "axis=x": { "model": "betterend:block/%name%_pillar", "x": 90, "y": 90 }, - "axis=y": { "model": "betterend:block/%name%_pillar" }, - "axis=z": { "model": "betterend:block/%name%_pillar", "x": 90 } - } + "variants": { + "axis=x": { + "model": "betterend:block/%name%_pillar", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "betterend:block/%name%_pillar" + }, + "axis=z": { + "model": "betterend:block/%name%_pillar", + "x": 90 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_plate.json b/json/blockstates/%name%_plate.json index 4060f8da..f7c1e4bd 100644 --- a/json/blockstates/%name%_plate.json +++ b/json/blockstates/%name%_plate.json @@ -1,10 +1,10 @@ { - "variants": { - "powered=false": { - "model": "betterend:block/%name%_pressure_plate_up" - }, - "powered=true": { - "model": "betterend:block/%name%_pressure_plate_down" - } - } + "variants": { + "powered=false": { + "model": "betterend:block/%name%_pressure_plate_up" + }, + "powered=true": { + "model": "betterend:block/%name%_pressure_plate_down" + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_slab.json b/json/blockstates/%name%_slab.json index 17875e4c..e99a19da 100644 --- a/json/blockstates/%name%_slab.json +++ b/json/blockstates/%name%_slab.json @@ -1,15 +1,15 @@ { - "variants": { - "type=bottom": { - "model": "betterend:block/%name%_half_slab" - }, - "type=double": { - "model": "betterend:block/%name%" - }, - "type=top": { - "model": "betterend:block/%name%_half_slab", - "uvlock": true, - "x": 180 - } - } + "variants": { + "type=bottom": { + "model": "betterend:block/%name%_half_slab" + }, + "type=double": { + "model": "betterend:block/%name%" + }, + "type=top": { + "model": "betterend:block/%name%_half_slab", + "uvlock": true, + "x": 180 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_small_tiles.json b/json/blockstates/%name%_small_tiles.json index 5a84411b..f4f1f62a 100644 --- a/json/blockstates/%name%_small_tiles.json +++ b/json/blockstates/%name%_small_tiles.json @@ -1,7 +1,7 @@ { - "variants": { - "": { - "model": "betterend:block/%name%_small_tiles" - } - } + "variants": { + "": { + "model": "betterend:block/%name%_small_tiles" + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_stairs.json b/json/blockstates/%name%_stairs.json index 685e1861..54b129ce 100644 --- a/json/blockstates/%name%_stairs.json +++ b/json/blockstates/%name%_stairs.json @@ -1,209 +1,209 @@ { - "variants": { - "facing=east,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs" - }, - "facing=east,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=east,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs" - }, - "facing=east,half=bottom,shape=straight": { - "model": "betterend:block/%name%_stairs" - }, - "facing=east,half=top,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=east,half=top,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=east,half=top,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=north,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=bottom,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "y": 270 - }, - "facing=north,half=top,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=north,half=top,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180 - }, - "facing=north,half=top,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=south,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs" - }, - "facing=south,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs" - }, - "facing=south,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=bottom,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "y": 90 - }, - "facing=south,half=top,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=south,half=top,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=south,half=top,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "x": 180, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 90 - }, - "facing=west,half=bottom,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=bottom,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "y": 180 - }, - "facing=west,half=top,shape=inner_left": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=inner_right": { - "model": "betterend:block/%name%_inner_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=outer_left": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 180 - }, - "facing=west,half=top,shape=outer_right": { - "model": "betterend:block/%name%_outer_stairs", - "uvlock": true, - "x": 180, - "y": 270 - }, - "facing=west,half=top,shape=straight": { - "model": "betterend:block/%name%_stairs", - "uvlock": true, - "x": 180, - "y": 180 - } - } + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs" + }, + "facing=east,half=bottom,shape=straight": { + "model": "betterend:block/%name%_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "betterend:block/%name%_inner_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "betterend:block/%name%_outer_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "betterend:block/%name%_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_tile.json b/json/blockstates/%name%_tile.json index b9f56911..7608ad47 100644 --- a/json/blockstates/%name%_tile.json +++ b/json/blockstates/%name%_tile.json @@ -1,7 +1,7 @@ { - "variants": { - "": { - "model": "betterend:block/%name%_tile" - } - } + "variants": { + "": { + "model": "betterend:block/%name%_tile" + } + } } \ No newline at end of file diff --git a/json/blockstates/%name%_wall.json b/json/blockstates/%name%_wall.json index 3d81eb45..e2107bcd 100644 --- a/json/blockstates/%name%_wall.json +++ b/json/blockstates/%name%_wall.json @@ -1,90 +1,90 @@ { - "multipart": [ - { - "when": { - "up": "true" - }, - "apply": { - "model": "betterend:block/%name%_wall_post" - } - }, - { - "when": { - "north": "low" - }, - "apply": { - "model": "betterend:block/%name%_wall_side", - "uvlock": true - } - }, - { - "when": { - "east": "low" - }, - "apply": { - "model": "betterend:block/%name%_wall_side", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "low" - }, - "apply": { - "model": "betterend:block/%name%_wall_side", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "low" - }, - "apply": { - "model": "betterend:block/%name%_wall_side", - "y": 270, - "uvlock": true - } - }, - { - "when": { - "north": "tall" - }, - "apply": { - "model": "betterend:block/%name%_wall_side_tall", - "uvlock": true - } - }, - { - "when": { - "east": "tall" - }, - "apply": { - "model": "betterend:block/%name%_wall_side_tall", - "y": 90, - "uvlock": true - } - }, - { - "when": { - "south": "tall" - }, - "apply": { - "model": "betterend:block/%name%_wall_side_tall", - "y": 180, - "uvlock": true - } - }, - { - "when": { - "west": "tall" - }, - "apply": { - "model": "betterend:block/%name%_wall_side_tall", - "y": 270, - "uvlock": true - } - } - ] + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/%name%_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/%name%_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/%name%_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/%name%_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/%name%_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/%name%_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/%name%_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/%name%_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/%name%_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] } \ No newline at end of file diff --git a/json/item/%name%.json b/json/item/%name%.json index 82508cd3..fa3a6fe2 100644 --- a/json/item/%name%.json +++ b/json/item/%name%.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%" + "parent": "betterend:block/%name%" } \ No newline at end of file diff --git a/json/item/%name%_brick_slab.json b/json/item/%name%_brick_slab.json index c148cf65..99e58c89 100644 --- a/json/item/%name%_brick_slab.json +++ b/json/item/%name%_brick_slab.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_brick_half_slab" + "parent": "betterend:block/%name%_brick_half_slab" } \ No newline at end of file diff --git a/json/item/%name%_brick_stairs.json b/json/item/%name%_brick_stairs.json index 24b61896..532344a8 100644 --- a/json/item/%name%_brick_stairs.json +++ b/json/item/%name%_brick_stairs.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_brick_stairs" + "parent": "betterend:block/%name%_brick_stairs" } \ No newline at end of file diff --git a/json/item/%name%_brick_wall.json b/json/item/%name%_brick_wall.json index 1e902ec4..fb1bd7a9 100644 --- a/json/item/%name%_brick_wall.json +++ b/json/item/%name%_brick_wall.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_brick_wall_inventory" + "parent": "betterend:block/%name%_brick_wall_inventory" } \ No newline at end of file diff --git a/json/item/%name%_bricks.json b/json/item/%name%_bricks.json index 56ce6003..aaa903bd 100644 --- a/json/item/%name%_bricks.json +++ b/json/item/%name%_bricks.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_bricks" + "parent": "betterend:block/%name%_bricks" } \ No newline at end of file diff --git a/json/item/%name%_button.json b/json/item/%name%_button.json index 240fb2d7..83518a8e 100644 --- a/json/item/%name%_button.json +++ b/json/item/%name%_button.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_button_inventory" + "parent": "betterend:block/%name%_button_inventory" } \ No newline at end of file diff --git a/json/item/%name%_pillar.json b/json/item/%name%_pillar.json index a6257b38..a05144eb 100644 --- a/json/item/%name%_pillar.json +++ b/json/item/%name%_pillar.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_pillar" + "parent": "betterend:block/%name%_pillar" } \ No newline at end of file diff --git a/json/item/%name%_plate.json b/json/item/%name%_plate.json index d774f9bc..e0815368 100644 --- a/json/item/%name%_plate.json +++ b/json/item/%name%_plate.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_pressure_plate_up" + "parent": "betterend:block/%name%_pressure_plate_up" } \ No newline at end of file diff --git a/json/item/%name%_slab.json b/json/item/%name%_slab.json index 1c83dcd9..f6f23abc 100644 --- a/json/item/%name%_slab.json +++ b/json/item/%name%_slab.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_half_slab" + "parent": "betterend:block/%name%_half_slab" } \ No newline at end of file diff --git a/json/item/%name%_small_tiles.json b/json/item/%name%_small_tiles.json index 46e284e5..21315991 100644 --- a/json/item/%name%_small_tiles.json +++ b/json/item/%name%_small_tiles.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_small_tiles" + "parent": "betterend:block/%name%_small_tiles" } \ No newline at end of file diff --git a/json/item/%name%_stairs.json b/json/item/%name%_stairs.json index c4871532..2de302c2 100644 --- a/json/item/%name%_stairs.json +++ b/json/item/%name%_stairs.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_stairs" + "parent": "betterend:block/%name%_stairs" } \ No newline at end of file diff --git a/json/item/%name%_tile.json b/json/item/%name%_tile.json index ad863533..bb10a897 100644 --- a/json/item/%name%_tile.json +++ b/json/item/%name%_tile.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_tile" + "parent": "betterend:block/%name%_tile" } \ No newline at end of file diff --git a/json/item/%name%_wall.json b/json/item/%name%_wall.json index 59b31173..a6cf400d 100644 --- a/json/item/%name%_wall.json +++ b/json/item/%name%_wall.json @@ -1,3 +1,3 @@ { - "parent": "betterend:block/%name%_wall_inventory" + "parent": "betterend:block/%name%_wall_inventory" } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index f91a4fe7..03387e2a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,6 @@ pluginManagement { repositories { + jcenter() maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' @@ -7,3 +8,39 @@ pluginManagement { gradlePluginPortal() } } +// #### Custom Settings #### + +//Change the next line to disable local BCLib loading +def allowLocalLibUse = true + +//When true, the local BCLib is also used in commandline builds +def allowLocalLibInConsoleMode = true + +//The path were to look for the local BCLib +def BCLibPath = '../BCLib' + + +// #### Logic #### +def isIDE = properties.containsKey('android.injected.invoked.from.ide') + || (System.getenv("XPC_SERVICE_NAME") ?: "").contains("intellij") + || (System.getenv("XPC_SERVICE_NAME") ?: "").contains(".idea") + || System.getenv("IDEA_INITIAL_DIRECTORY") != null + +println "IntelliJ: ${isIDE}" + +def BCLibFolder = new File( BCLibPath ) +if( allowLocalLibUse && (isIDE || allowLocalLibInConsoleMode) && BCLibFolder.exists() ) { + println "Using local BCLib from '${BCLibFolder}' in IntelliJ" + println "If you do not want to load the local version of BClib" + println "either rename the Folder containing BCLib to something" + println "else, or set 'allowLocalLibUse' in settings.gradle" + println "to false." + println "" + println "If you receive version-errors when launching minecraft" + println "in IntelliJ, make sure you have set up gradle instead" + println "of IntelliJ to compile and run." + + include ':BCLib' + project(":BCLib").projectDir = BCLibFolder + project(':BCLib').buildFileName = './bclib-composit.gradle' +} diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index df163a84..a83d725d 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,11 +3,12 @@ package ru.betterend; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biomes; import ru.bclib.api.WorldDataAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.Logger; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; -import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndPotions; import ru.betterend.integration.Integrations; import ru.betterend.recipe.AlloyingRecipes; @@ -18,6 +19,7 @@ import ru.betterend.recipe.InfusionRecipes; import ru.betterend.recipe.SmithingRecipes; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlockEntities; +import ru.betterend.registry.EndEnchantments; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndPortals; @@ -26,14 +28,14 @@ import ru.betterend.registry.EndStructures; import ru.betterend.registry.EndTags; import ru.betterend.util.BonemealPlants; import ru.betterend.util.LootTableUtil; -import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; -import ru.betterend.world.surface.SurfaceBuilders; +import ru.betterend.world.generator.TerrainGenerator; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = new Logger(MOD_ID); - + public static final boolean RUNS_FALL_FLYING_LIB = FabricLoader.getInstance().getModContainer("fallflyinglib").isPresent(); + @Override public void onInitialize() { WorldDataAPI.registerModCache(MOD_ID); @@ -42,9 +44,7 @@ public class BetterEnd implements ModInitializer { EndBlockEntities.register(); EndFeatures.register(); EndEntities.register(); - SurfaceBuilders.register(); EndBiomes.register(); - BetterEndBiomeSource.register(); EndTags.register(); EndEnchantments.register(); EndPotions.register(); @@ -61,17 +61,22 @@ public class BetterEnd implements ModInitializer { FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Integrations.init(); Configs.saveConfigs(); + + if (GeneratorOptions.useNewGenerator()) { + ru.bclib.world.generator.GeneratorOptions.setFarEndBiomes(GeneratorOptions.getIslandDistBlock()); + ru.bclib.world.generator.GeneratorOptions.setEndLandFunction((pos) -> TerrainGenerator.isLand(pos.x, pos.y)); + } + + BiomeAPI.registerEndBiomeModification((biomeID, biome) -> { + if (!biomeID.equals(Biomes.THE_VOID.location())) { + EndStructures.addBiomeStructures(biomeID, biome); + EndFeatures.addBiomeFeatures(biomeID, biome); + } + }); + } - public static ResourceLocation makeID(String path) { return new ResourceLocation(MOD_ID, path); } - public static String getStringId(String id) { - return String.format("%s:%s", MOD_ID, id); - } - - public static boolean isModId(ResourceLocation id) { - return id.getNamespace().equals(MOD_ID); - } } diff --git a/src/main/java/ru/betterend/api/BetterEndPlugin.java b/src/main/java/ru/betterend/api/BetterEndPlugin.java index 4b278aec..e4b64c6c 100644 --- a/src/main/java/ru/betterend/api/BetterEndPlugin.java +++ b/src/main/java/ru/betterend/api/BetterEndPlugin.java @@ -2,27 +2,31 @@ package ru.betterend.api; public interface BetterEndPlugin { /** - * Alloying recipes registration. - * See AlloyingRecipe.Builder for details. + * Alloying recipes registration. + * See AlloyingRecipe.Builder for details. */ - default void registerAlloyingRecipes() {} + default void registerAlloyingRecipes() { + } /** - * Smithing recipes registration. - * See AnvilSmithingRecipe.Builder for details. + * Smithing recipes registration. + * See AnvilSmithingRecipe.Builder for details. */ - default void registerSmithingRecipes() {} + default void registerSmithingRecipes() { + } /** - * Additional biomes registration. - * See BiomeRegistry.registerBiome for details. + * Additional biomes registration. + * See BiomeRegistry.registerBiome for details. */ - default void registerEndBiomes() {} + default void registerEndBiomes() { + } /** - * Register other mod stuff, for example, EndHammers. + * Register other mod stuff, for example, EndITEM_HAMMERS. */ - default void registerOthers() {} + default void registerOthers() { + } public static void register(BetterEndPlugin plugin) { diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index 7233dedb..49763514 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,33 +1,16 @@ package ru.betterend.blocks; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.state.properties.IntegerProperty; import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.item.EndAnvilItem; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; public class AeterniumAnvil extends EndAnvilBlock { - - protected final Item anvilItem; - public AeterniumAnvil() { super(EndBlocks.AETERNIUM_BLOCK.defaultMaterialColor(), EndToolMaterial.AETERNIUM.getLevel()); - this.anvilItem = EndItems.registerEndItem("aeternuim_anvil_item", new EndAnvilItem(this)); } - + @Override - public IntegerProperty getDurability() { - if (durability == null) { - this.maxDurability = 8; - this.durability = IntegerProperty.create("durability", 0, maxDurability); - } - return durability; - } - - @Override - public Item asItem() { - return anvilItem; + public int getMaxDurability() { + return 8; } } diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index d176689d..2541214c 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -12,15 +12,15 @@ import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; public class AeterniumBlock extends BaseBlock { - + public AeterniumBlock() { super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY) - .hardness(65F) - .resistance(1200F) - .requiresCorrectToolForDrops() - .sound(SoundType.NETHERITE_BLOCK)); + .hardness(65F) + .resistance(1200F) + .requiresCorrectToolForDrops() + .sound(SoundType.NETHERITE_BLOCK)); } - + @Environment(EnvType.CLIENT) public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF657A7A; diff --git a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java index a3f14802..04f3b5c3 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaHymenophoreBlock.java @@ -6,13 +6,13 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; -public class AmaranitaHymenophoreBlock extends BaseBlock implements IRenderTyped { +public class AmaranitaHymenophoreBlock extends BaseBlock implements RenderLayerProvider { public AmaranitaHymenophoreBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java index 47885625..f50684ba 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -7,6 +7,6 @@ import ru.bclib.blocks.BaseRotatedPillarBlock; public class AmaranitaStemBlock extends BaseRotatedPillarBlock { public AmaranitaStemBlock() { - super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).mapColor(MaterialColor.COLOR_LIGHT_GREEN)); } } diff --git a/src/main/java/ru/betterend/blocks/AmberBlock.java b/src/main/java/ru/betterend/blocks/AmberBlock.java index feedaea8..05773bdf 100644 --- a/src/main/java/ru/betterend/blocks/AmberBlock.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -7,6 +7,6 @@ import ru.bclib.blocks.BaseBlock; public class AmberBlock extends BaseBlock { public AmberBlock() { - super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); + super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).mapColor(MaterialColor.COLOR_YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 2c73a6d1..836970d3 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -1,16 +1,14 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; @@ -21,12 +19,17 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class AncientEmeraldIceBlock extends BaseBlock { public AncientEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); } @Override + @SuppressWarnings("deprecation") public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = BlocksHelper.randomDirection(random); @@ -54,7 +57,17 @@ public class AncientEmeraldIceBlock extends BaseBlock { } private void makeParticles(ServerLevel world, BlockPos pos, Random random) { - world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); + world.sendParticles( + EndParticles.SNOWFLAKE, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + 20, + 0.5, + 0.5, + 0.5, + 0 + ); } @Override @@ -67,4 +80,10 @@ public class AncientEmeraldIceBlock extends BaseBlock { return Collections.emptyList(); } } + + @Override + public void stepOn(Level level, BlockPos blockPos, BlockState blockState, Entity entity) { + super.stepOn(level, blockPos, blockState, entity); + entity.setIsInPowderSnow(true); + } } diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index 22473aa7..f36efa2f 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.color.block.BlockColor; @@ -14,43 +11,56 @@ import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.AbstractGlassBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.api.TagAPI; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IColorProvider; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.CustomColorProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.registry.EndItems; -import ru.betterend.registry.EndTags; -public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyped, IColorProvider { +import java.util.List; + +public class AuroraCrystalBlock extends AbstractGlassBlock implements RenderLayerProvider, CustomColorProvider { public static final Vec3i[] COLORS; private static final int MIN_DROP = 1; private static final int MAX_DROP = 4; public AuroraCrystalBlock() { - super(FabricBlockSettings.of(Material.GLASS) - .breakByTool(FabricToolTags.PICKAXES) - .breakByTool(EndTags.HAMMERS) - .hardness(1F) - .resistance(1F) - .luminance(15) - .noOcclusion() - .isSuffocating((state, world, pos) -> false) - .sound(SoundType.GLASS)); + super(FabricBlockSettings + .of(Material.GLASS) + .breakByTool(FabricToolTags.PICKAXES) + .breakByTool(TagAPI.ITEM_HAMMERS) + .hardness(1F) + .resistance(1F) + .luminance(15) + .noOcclusion() + .isSuffocating((state, world, pos) -> false) + .sound(SoundType.GLASS)); } - + + @Override + @Deprecated + public VoxelShape getVisualShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) { + return this.getCollisionShape(blockState, blockGetter, blockPos, collisionContext); + } + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { if (pos == null) { pos = BlockPos.ZERO; - }; + } + ; long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; @@ -69,20 +79,21 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp return ColorUtil.color(r, g, b); }; } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> { return ColorUtil.color(COLORS[3].getX(), COLORS[3].getY(), COLORS[3].getZ()); }; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } @Override + @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null && tool.isCorrectToolForDrops(state)) { @@ -99,7 +110,8 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, max)); } count = MHelper.randRange(min, max, MHelper.RANDOM); - } else { + } + else { count = MHelper.randRange(MIN_DROP, MAX_DROP, MHelper.RANDOM); } return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, count)); @@ -109,10 +121,10 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp static { COLORS = new Vec3i[] { - new Vec3i(247, 77, 161), + new Vec3i(247, 77, 161), new Vec3i(120, 184, 255), new Vec3i(120, 255, 168), - new Vec3i(243, 58, 255) + new Vec3i(243, 58, 255) }; } } diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index bec0c00e..0c70177e 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -21,16 +21,21 @@ public class BlueVineLanternBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public BlueVineLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .luminance(15) + .sound(SoundType.WART_BLOCK)); this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } @Override + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return !state.getValue(NATURAL) || world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE; } @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 8f8edc36..19185aaa 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -14,6 +12,8 @@ import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BlueVineSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { @@ -22,24 +22,51 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { if (h < height + 1) { return; } - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.BLUE_VINE.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.BOTTOM) + ); for (int i = 1; i < height; i++) { - BlocksHelper.setWithoutUpdate(world, pos.above(i), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate( + world, + pos.above(i), + EndBlocks.BLUE_VINE.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.MIDDLE) + ); } - BlocksHelper.setWithoutUpdate(world, pos.above(height), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + pos.above(height), + EndBlocks.BLUE_VINE.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP) + ); placeLantern(world, pos.above(height + 1)); } private void placeLantern(WorldGenLevel world, BlockPos pos) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true) + ); + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos p = pos.relative(dir); if (world.isEmptyBlock(p)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + p, + EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, dir) + ); } } if (world.isEmptyBlock(pos.above())) { - BlocksHelper.setWithoutUpdate(world, pos.above(), EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.UP)); + BlocksHelper.setWithoutUpdate( + world, + pos.above(), + EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.UP) + ); } } diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java index a7c95243..682e10de 100644 --- a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -18,6 +14,9 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; + public class BoluxMushroomBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 9, 15); @@ -34,7 +33,7 @@ public class BoluxMushroomBlock extends EndPlantBlock { public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; @@ -44,7 +43,7 @@ public class BoluxMushroomBlock extends EndPlantBlock { public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index e26d2ce1..c1f0ae83 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -20,16 +16,19 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.MaterialColor; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BrimstoneBlock extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public BrimstoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).mapColor(MaterialColor.COLOR_BROWN).randomTicks()); registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } @@ -37,7 +36,7 @@ public class BrimstoneBlock extends BaseBlock { protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } - + @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { if (world.isClientSide()) { @@ -65,9 +64,10 @@ public class BrimstoneBlock extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { boolean deactivate = true; - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getFluidState(pos.relative(dir)).getType().equals(Fluids.WATER)) { deactivate = false; break; @@ -89,9 +89,9 @@ public class BrimstoneBlock extends BaseBlock { } else if (sideState.getFluidState().getType() == Fluids.WATER) { BlockState crystal = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .setValue(SulphurCrystalBlock.FACING, dir) - .setValue(SulphurCrystalBlock.WATERLOGGED, true) - .setValue(SulphurCrystalBlock.AGE, 0); + .setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.WATERLOGGED, true) + .setValue(SulphurCrystalBlock.AGE, 0); world.setBlockAndUpdate(side, crystal); } } diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 22bbaa67..96f282f4 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,23 +17,25 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; -public class BubbleCoralBlock extends EndUnderwaterPlantBlock { +import java.util.Random; +public class BubbleCoralBlock extends EndUnderwaterPlantBlock { + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); public BubbleCoralBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.CORAL_BLOCK) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); } @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { double x = pos.getX() + random.nextDouble(); @@ -53,7 +53,7 @@ public class BubbleCoralBlock extends EndUnderwaterPlantBlock { public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java index 09b53a11..eccdd7ea 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -16,6 +13,8 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.List; + public class BulbVineBlock extends BaseVineBlock { public BulbVineBlock() { super(15, true); @@ -42,6 +41,7 @@ public class BulbVineBlock extends BaseVineBlock { @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { boolean canPlace = super.canSurvive(state, world, pos); - return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState(pos.below()).is(this); + return (state.is(this) && state.getValue(SHAPE) == TripleShape.BOTTOM) ? canPlace : canPlace && world.getBlockState( + pos.below()).is(this); } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 0302faab..3e4dc6e8 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -1,12 +1,8 @@ package ru.betterend.blocks; -import java.util.Map; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Maps; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.renderer.block.model.BlockModel; @@ -20,26 +16,30 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import ru.bclib.client.models.BlockModelProvider; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.BlockModelProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.models.Patterns; -public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTyped, BlockModelProvider { +import java.util.Map; +import java.util.Optional; + +public class BulbVineLanternBlock extends EndLanternBlock implements RenderLayerProvider, BlockModelProvider { private static final VoxelShape SHAPE_CEIL = Block.box(4, 4, 4, 12, 16, 12); private static final VoxelShape SHAPE_FLOOR = Block.box(4, 0, 4, 12, 12, 12); public BulbVineLanternBlock() { this(FabricBlockSettings.of(Material.METAL) - .hardness(1) - .resistance(1) - .breakByTool(FabricToolTags.PICKAXES) - .materialColor(MaterialColor.COLOR_LIGHT_GRAY) - .luminance(15) - .requiresCorrectToolForDrops() - .sound(SoundType.LANTERN)); + .hardness(1) + .resistance(1) + .breakByTool(FabricToolTags.PICKAXES) + .mapColor(MaterialColor.COLOR_LIGHT_GRAY) + .luminance(15) + .requiresCorrectToolForDrops() + .sound(SoundType.LANTERN)); } public BulbVineLanternBlock(Properties settings) { @@ -47,23 +47,26 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = Maps.newHashMap(); textures.put("%glow%", getGlowTexture()); textures.put("%metal%", getMetalTexture(resourceLocation)); - Optional pattern = blockState.getValue(IS_FLOOR) ? - Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, textures) : - Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures); + Optional pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson( + Patterns.BLOCK_BULB_LANTERN_FLOOR, + textures + ) : Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures); return ModelsHelper.fromPattern(pattern); } @@ -76,5 +79,5 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType protected String getGlowTexture() { return "bulb_vine_lantern_bulb"; } - + } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index 4eab8f1a..41821469 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -3,20 +3,20 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; -public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements IColorProvider { +public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements CustomColorProvider { public BulbVineLanternColoredBlock(FabricBlockSettings settings) { super(settings); } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> getColor(); } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> getColor(); diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index e0fa5161..00bd9485 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.level.LevelReader; @@ -14,23 +12,37 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; -public class BulbVineSeedBlock extends EndPlantWithAgeBlock { +import java.util.Random; +public class BulbVineSeedBlock extends EndPlantWithAgeBlock { + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState up = world.getBlockState(pos.above()); - return up.is(TagAPI.GEN_TERRAIN) || up.is(BlockTags.LOGS) || up.is(BlockTags.LEAVES); + return up.is(TagAPI.BLOCK_GEN_TERRAIN) || up.is(BlockTags.LOGS) || up.is(BlockTags.LEAVES); } - + @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int h = BlocksHelper.downRay(world, pos, random.nextInt(24)) - 1; if (h > 2) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) + ); for (int i = 1; i < h; i++) { - BlocksHelper.setWithoutUpdate(world, pos.below(i), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate( + world, + pos.below(i), + EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) + ); } - BlocksHelper.setWithoutUpdate(world, pos.below(h), EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate( + world, + pos.below(h), + EndBlocks.BULB_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) + ); } } } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index f61aa0cb..9a52391c 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; @@ -19,10 +16,13 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.betterend.registry.EndBlocks; -public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { +import java.util.Collections; +import java.util.List; + +public class CavePumpkinBlock extends BaseBlockNotFull implements RenderLayerProvider { public static final BooleanProperty SMALL = BlockProperties.SMALL; private static final VoxelShape SHAPE_SMALL; private static final VoxelShape SHAPE_BIG; @@ -41,15 +41,17 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { return state.getValue(SMALL) ? SHAPE_SMALL : SHAPE_BIG; } @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); + return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections + .singletonList(new ItemStack(this)); } static { @@ -58,7 +60,7 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { VoxelShape top = Block.box(5, 15, 5, 11, 16, 11); SHAPE_BIG = Shapes.or(lantern, cap, top); - lantern = Block.box(1, 7, 1, 15, 13, 15); + lantern = Block.box(5, 7, 5, 11, 13, 11); cap = Block.box(4, 12, 4, 12, 15, 12); top = Block.box(6, 15, 6, 10, 16, 10); SHAPE_SMALL = Shapes.or(lantern, cap, top); diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index 9e5278d9..07fbdddd 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -18,6 +16,8 @@ import ru.bclib.blocks.BlockProperties; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); @@ -31,21 +31,26 @@ public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { int age = state.getValue(AGE); BlockState down = world.getBlockState(pos.below()); - if (down.getMaterial().isReplaceable() || (down.is(EndBlocks.CAVE_PUMPKIN) && down.getValue(BlockProperties.SMALL))) { + if (down.getMaterial() + .isReplaceable() || (down.is(EndBlocks.CAVE_PUMPKIN) && down.getValue(BlockProperties.SMALL))) { if (age < 3) { world.setBlockAndUpdate(pos, state.setValue(AGE, age + 1)); } if (age == 2) { - world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, true)); + world.setBlockAndUpdate( + pos.below(), + EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(BlockProperties.SMALL, true) + ); } else if (age == 3) { world.setBlockAndUpdate(pos.below(), EndBlocks.CAVE_PUMPKIN.defaultBlockState()); } } } - + @Override - public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {} + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + } @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { @@ -58,7 +63,7 @@ public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { } return state; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 21a906f7..a4fe4a9c 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -1,13 +1,8 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.Map; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Maps; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; @@ -21,18 +16,27 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseAttachedBlock; -import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.BlockModelProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.betterend.client.models.Patterns; -public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, BlockModelProvider { +import java.util.EnumMap; +import java.util.Map; +import java.util.Optional; + +public class ChandelierBlock extends BaseAttachedBlock implements RenderLayerProvider, BlockModelProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public ChandelierBlock(Block source) { - super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); + super(FabricBlockSettings.copyOf(source) + .luminance(15) + .noCollission() + .noOcclusion() + .requiresCorrectToolForDrops()); } @Override @@ -41,16 +45,19 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return ModelsHelper.createItemModel(blockId); } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern; switch (blockState.getValue(FACING)) { @@ -65,8 +72,9 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } return ModelsHelper.fromPattern(pattern); } - + @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String state = "_wall"; BlockModelRotation rotation = BlockModelRotation.X0_Y0; @@ -93,7 +101,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, registerBlockModel(stateId, modelId, blockState, modelCache); return ModelsHelper.createMultiVariant(modelId, rotation.getRotation(), false); } - + static { BOUNDING_SHAPES.put(Direction.UP, Block.box(5, 0, 5, 11, 13, 11)); BOUNDING_SHAPES.put(Direction.DOWN, Block.box(5, 3, 5, 11, 16, 11)); diff --git a/src/main/java/ru/betterend/blocks/CharniaBlock.java b/src/main/java/ru/betterend/blocks/CharniaBlock.java index 5a665ab6..dff8ef06 100644 --- a/src/main/java/ru/betterend/blocks/CharniaBlock.java +++ b/src/main/java/ru/betterend/blocks/CharniaBlock.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.material.Fluids; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; public class CharniaBlock extends EndUnderwaterPlantBlock { - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return canSupportCenter(world, pos.below(), Direction.UP) && world.getFluidState(pos).getType() == Fluids.WATER; diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index ece46509..d38b8902 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -13,13 +10,16 @@ import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; -public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTyped { +import java.util.Collections; +import java.util.List; + +public class DenseEmeraldIceBlock extends BaseBlock implements RenderLayerProvider { public DenseEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 12310aab..4c34dbde 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -2,24 +2,24 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class DragonTreeSaplingBlock extends FeatureSaplingBlock { +public class DragonTreeSaplingBlock extends PottableFeatureSapling { public DragonTreeSaplingBlock() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.DRAGON_TREE.getFeature(); + super((state)->EndFeatures.DRAGON_TREE.getFeature()); } @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS); } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.SHADOW_GRASS; + } } diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index f8c010f1..fadbd4bc 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -1,11 +1,7 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -24,20 +20,25 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import ru.bclib.client.models.BlockModelProvider; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.BlockModelProvider; +import ru.bclib.interfaces.RenderLayerProvider; -public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTyped, BlockModelProvider { +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class EmeraldIceBlock extends HalfTransparentBlock implements RenderLayerProvider, BlockModelProvider { public EmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.ICE)); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { super.playerDestroy(world, player, pos, state, blockEntity, stack); @@ -46,23 +47,24 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType world.removeBlock(pos, false); return; } - + Material material = world.getBlockState(pos.below()).getMaterial(); if (material.blocksMotion() || material.isLiquid()) { world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); } } - + } - + @Override + @SuppressWarnings("deprecation") public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (world.getBrightness(LightLayer.BLOCK, pos) > 11 - state.getLightBlock(world, pos)) { this.melt(state, world, pos); } - + } - + protected void melt(BlockState state, Level world, BlockPos pos) { if (world.dimensionType().ultraWarm()) { world.removeBlock(pos, false); @@ -74,6 +76,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType } @Override + @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) != 0) { @@ -83,8 +86,9 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType return Collections.emptyList(); } } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/EndBlockProperties.java b/src/main/java/ru/betterend/blocks/EndBlockProperties.java index 233c5f05..d26385e5 100644 --- a/src/main/java/ru/betterend/blocks/EndBlockProperties.java +++ b/src/main/java/ru/betterend/blocks/EndBlockProperties.java @@ -12,8 +12,11 @@ public class EndBlockProperties extends BlockProperties { public static final EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); public static final EnumProperty CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class); - public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item"); public static final IntegerProperty PORTAL = IntegerProperty.create("portal", 0, EndPortals.getCount()); + public static final IntegerProperty PLANT_ID = IntegerProperty.create("plant_id", 0, 63); + public static final IntegerProperty SOIL_ID = IntegerProperty.create("soil_id", 0, 16); + public static final IntegerProperty POT_LIGHT = IntegerProperty.create("pot_light", 0, 3); + public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item"); public enum PedestalState implements StringRepresentable { PEDESTAL_TOP("pedestal_top"), @@ -28,7 +31,7 @@ public class EndBlockProperties extends BlockProperties { PedestalState(String name) { this.name = name; } - + @Override public String getSerializedName() { return this.name; @@ -55,7 +58,7 @@ public class EndBlockProperties extends BlockProperties { this.name = name; this.glow = glow; } - + @Override public String getSerializedName() { return name; @@ -87,7 +90,7 @@ public class EndBlockProperties extends BlockProperties { this.name = name; this.light = light; } - + @Override public String getSerializedName() { return name; @@ -113,7 +116,7 @@ public class EndBlockProperties extends BlockProperties { CactusBottom(String name) { this.name = name; } - + @Override public String getSerializedName() { return name; diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java index 63b4dcb4..7dc6792e 100644 --- a/src/main/java/ru/betterend/blocks/EndLilyBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -37,6 +32,10 @@ import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class EndLilyBlock extends EndUnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 16, 12); @@ -44,11 +43,11 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { public EndLilyBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.WET_GRASS) - .lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0) + .noCollission()); } @Override @@ -75,7 +74,8 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { @Override public FluidState getFluidState(BlockState state) { - return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultFluidState() : Fluids.WATER.getSource(false); + return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultFluidState() : Fluids.WATER.getSource( + false); } @Override @@ -96,7 +96,10 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.TOP) { - return Lists.newArrayList(new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Lists.newArrayList( + new ItemStack(EndItems.END_LILY_LEAF, MHelper.randRange(1, 2, MHelper.RANDOM)), + new ItemStack(EndBlocks.END_LILY_SEED, MHelper.randRange(1, 2, MHelper.RANDOM)) + ); } return Collections.emptyList(); } @@ -111,7 +114,7 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index b955a39f..71a7dd2d 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; @@ -12,17 +10,31 @@ import ru.bclib.blocks.UnderwaterPlantWithAgeBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.BOTTOM)); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.BOTTOM) + ); BlockPos up = pos.above(); while (world.getFluidState(up).isSource()) { - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithoutUpdate( + world, + up, + EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.MIDDLE) + ); up = up.above(); } - BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + up, + EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.TOP) + ); } } @@ -33,9 +45,9 @@ public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { } return world.isEmptyBlock(up); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java index d79a31ac..d9c9d828 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -21,6 +18,8 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class EndLotusFlowerBlock extends EndPlantBlock { private static final VoxelShape SHAPE_OUTLINE = Block.box(2, 0, 2, 14, 14, 14); private static final VoxelShape SHAPE_COLLISION = Block.box(0, 0, 0, 16, 2, 16); @@ -45,6 +44,7 @@ public class EndLotusFlowerBlock extends EndPlantBlock { } @Override + @SuppressWarnings("deprecation") public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE_COLLISION; } diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index af3199f3..e15c1ab4 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -24,11 +24,11 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; -public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTyped { +public class EndLotusLeafBlock extends BaseBlockNotFull implements RenderLayerProvider { public static final EnumProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VSHAPE = Block.box(0, 0, 0, 16, 1, 16); @@ -38,6 +38,7 @@ public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTyped } @Override + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); return !down.getFluidState().isEmpty() && down.getFluidState().getType() instanceof WaterFluid; @@ -49,16 +50,19 @@ public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTyped } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return VSHAPE; } @Override + @SuppressWarnings("deprecation") public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); } - + @Override + @SuppressWarnings("deprecation") public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); } diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index de268c6a..20d3e1c4 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,12 +12,16 @@ import ru.bclib.blocks.UnderwaterPlantWithAgeBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { if (canGrow(world, pos)) { BlockState startLeaf = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.LEAF, true); - BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).setValue(EndLotusStemBlock.WATERLOGGED, true); + BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState() + .setValue(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM) + .setValue(EndLotusStemBlock.WATERLOGGED, true); BlockState stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); BlockState flower = EndBlocks.END_LOTUS_FLOWER.defaultBlockState(); @@ -37,7 +39,11 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { BlockPos leafCenter = bpos.immutable().relative(dir); if (hasLeaf(world, leafCenter)) { generateLeaf(world, leafCenter); - BlocksHelper.setWithoutUpdate(world, bpos, startLeaf.setValue(EndLotusStemBlock.SHAPE, shape).setValue(EndLotusStemBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + bpos, + startLeaf.setValue(EndLotusStemBlock.SHAPE, shape).setValue(EndLotusStemBlock.FACING, dir) + ); } else { BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, shape)); @@ -92,13 +98,23 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + for (Direction move : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate( + world, + p.set(pos).move(move), + leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move) + .setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE) + ); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + p.set(pos).move(d1).move(d2), + leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1) + .setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP) + ); } } @@ -106,19 +122,18 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); - if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) - count ++; + if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) count++; } } return count == 9; } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 0c27ece2..46244688 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.Map; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -29,10 +26,12 @@ import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; -public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlock, IRenderTyped { +import java.util.Map; + +public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlock, RenderLayerProvider { public static final EnumProperty FACING = BlockStateProperties.FACING; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final BooleanProperty LEAF = BooleanProperty.create("leaf"); @@ -41,10 +40,14 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo public EndLotusStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); - this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); + this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false) + .setValue(SHAPE, TripleShape.MIDDLE) + .setValue(LEAF, false) + .setValue(FACING, Direction.UP)); } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.getValue(FACING).getAxis()); } @@ -55,31 +58,37 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo } @Override + @SuppressWarnings("deprecation") public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getClickedPos(); - return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + return this.defaultBlockState() + .setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER) + .setValue(FACING, ctx.getClickedFace()); } @Override + @SuppressWarnings("deprecation") public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } - + @Override + @SuppressWarnings("deprecation") public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if (state.getValue(WATERLOGGED)) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index be4b0a78..b0106f95 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -1,33 +1,30 @@ package ru.betterend.blocks; -import java.util.HashMap; -import java.util.Map; - +import com.google.common.collect.Maps; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.PedestalBlock; -public class EndPedestal extends PedestalBlock { +import java.util.Map; +public class EndPedestal extends PedestalBlock { + public EndPedestal(Block parent) { super(parent); } - + @Override protected Map createTexturesMap() { ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath(); - return new HashMap() { - private static final long serialVersionUID = 1L; - { - put("%mod%", BetterEnd.MOD_ID ); - put("%top%", name + "_polished"); - put("%base%", name + "_polished"); - put("%pillar%", name + "_pillar_side"); - put("%bottom%", name + "_polished"); - } - }; + Map textures = Maps.newHashMap(); + textures.put("%mod%", BetterEnd.MOD_ID); + textures.put("%top%", name + "_polished"); + textures.put("%base%", name + "_polished"); + textures.put("%pillar%", name + "_pillar_side"); + textures.put("%bottom%", name + "_polished"); + return textures; } } diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 6d5ab346..5a4806c8 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Objects; -import java.util.Optional; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -33,20 +29,26 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.dimension.DimensionType; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IColorProvider; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.CustomColorProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; -public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, IColorProvider { +import java.util.Objects; +import java.util.Optional; +import java.util.Random; + +public class EndPortalBlock extends NetherPortalBlock implements RenderLayerProvider, CustomColorProvider { public static final IntegerProperty PORTAL = EndBlockProperties.PORTAL; - + public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL) + .resistance(Blocks.BEDROCK.getExplosionResistance()) + .luminance(15)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); @@ -57,24 +59,35 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(100) == 0) { - world.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, SoundEvents.PORTAL_AMBIENT, SoundSource.BLOCKS, 0.5F, random.nextFloat() * 0.4F + 0.8F, false); + world.playLocalSound( + pos.getX() + 0.5D, + pos.getY() + 0.5D, + pos.getZ() + 0.5D, + SoundEvents.PORTAL_AMBIENT, + SoundSource.BLOCKS, + 0.5F, + random.nextFloat() * 0.4F + 0.8F, + false + ); } - + double x = pos.getX() + random.nextDouble(); double y = pos.getY() + random.nextDouble(); double z = pos.getZ() + random.nextDouble(); int k = random.nextInt(2) * 2 - 1; if (!world.getBlockState(pos.west()).is(this) && !world.getBlockState(pos.east()).is(this)) { x = pos.getX() + 0.5D + 0.25D * k; - } else { + } + else { z = pos.getZ() + 0.5D + 0.25D * k; } - + world.addParticle(EndParticles.PORTAL_SPHERE, x, y, z, 0, 0, 0); } - + @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) {} + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + } @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { @@ -93,18 +106,24 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); if (exitPos == null) return; if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { - ((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), - exitPos.getZ() + 0.5, entity.yRot, entity.xRot); - } else { + ((ServerPlayer) entity).teleportTo( + destination, + exitPos.getX() + 0.5, + exitPos.getY(), + exitPos.getZ() + 0.5, + entity.getYRot(), + entity.getXRot() + ); + } + else { ((TeleportingEntity) entity).be_setExitPos(exitPos); Optional teleported = Optional.ofNullable(entity.changeDimension(destination)); teleported.ifPresent(Entity::setPortalCooldown); } } - + private boolean validate(Entity entity) { - return !entity.isPassenger() && !entity.isVehicle() && - entity.canChangeDimensions() && !entity.isOnPortalCooldown(); + return !entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() && !entity.isOnPortalCooldown(); } @Override @@ -114,18 +133,28 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { if (targetWorld == null) return null; - Registry registry = targetWorld.registryAccess().dimensionTypes(); + Registry registry = targetWorld.registryAccess() + .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); ResourceLocation targetWorldId = targetWorld.dimension().location(); ResourceLocation currentWorldId = currentWorld.dimension().location(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); double currentMultiplier = Objects.requireNonNull(registry.get(currentWorldId)).coordinateScale(); double multiplier = targetMultiplier > currentMultiplier ? 1.0 / targetMultiplier : currentMultiplier; - MutableBlockPos basePos = currentPos.mutable().set(currentPos.getX() * multiplier, currentPos.getY(), currentPos.getZ() * multiplier); + MutableBlockPos basePos = currentPos.mutable() + .set(currentPos.getX() * multiplier, + currentPos.getY(), + currentPos.getZ() * multiplier + ); MutableBlockPos checkPos = basePos.mutable(); BlockState currentState = currentWorld.getBlockState(currentPos); int radius = (EternalRitual.SEARCH_RADIUS >> 4) + 1; - checkPos = EternalRitual.findBlockPos(targetWorld, checkPos, radius, this, state -> state.is(this) && - state.getValue(PORTAL).equals(currentState.getValue(PORTAL))); + checkPos = EternalRitual.findBlockPos( + targetWorld, + checkPos, + radius, + this, + state -> state.is(this) && state.getValue(PORTAL).equals(currentState.getValue(PORTAL)) + ); if (checkPos != null) { BlockState checkState = targetWorld.getBlockState(checkPos); Axis axis = checkState.getValue(AXIS); @@ -159,21 +188,24 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I BlockState down = world.getBlockState(pos.below()); if (down.is(this)) { return findCenter(world, pos.move(Direction.DOWN), axis, step); - } else if (right.is(this) && left.is(this)) { + } + else if (right.is(this) && left.is(this)) { return pos; - } else if (right.is(this)) { + } + else if (right.is(this)) { return findCenter(world, pos.move(rightDir), axis, ++step); - } else if (left.is(this)) { + } + else if (left.is(this)) { return findCenter(world, pos.move(leftDir), axis, ++step); } return pos; } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> EndPortals.getColor(state.getValue(PORTAL)); } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> EndPortals.getColor(0); diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 46e17878..4cbc201a 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,7 +15,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; @@ -28,6 +23,8 @@ import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; 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; @@ -38,34 +35,40 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import ru.betterend.registry.EndBlockEntities; + +import java.util.List; +import java.util.Random; public class EndStoneSmelter extends BaseBlockWithEntity { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public static final BooleanProperty LIT = BlockStateProperties.LIT; public static final String ID = "end_stone_smelter"; - + public EndStoneSmelter() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) - .hardness(4F) - .resistance(100F) - .requiresCorrectToolForDrops() - .sound(SoundType.STONE)); - this.registerDefaultState(this.stateDefinition.any() - .setValue(FACING, Direction.NORTH) - .setValue(LIT, false)); + .luminance(state -> state.getValue(LIT) ? 15 : 0) + .hardness(4F) + .resistance(100F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); + registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(LIT, false)); } + @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (world.isClientSide) { return InteractionResult.SUCCESS; - } else { + } + else { this.openScreen(world, pos, player); return InteractionResult.CONSUME; } } - + private void openScreen(Level world, BlockPos pos, Player player) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EndStoneSmelterBlockEntity) { @@ -75,12 +78,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity { @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EndStoneSmelterBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EndStoneSmelterBlockEntity(blockPos, blockState); } @Override @@ -98,33 +101,37 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } return drop; } - + @Override + @SuppressWarnings("deprecation") public boolean hasAnalogOutputSignal(BlockState state) { return true; } - + @Override + @SuppressWarnings("deprecation") public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { //TODO return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(world.getBlockEntity(pos)); } - + @Override public RenderShape getRenderShape(BlockState state) { return RenderShape.MODEL; } - + @Override + @SuppressWarnings("deprecation") public BlockState rotate(BlockState state, Rotation rotation) { return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); } - + @Override + @SuppressWarnings("deprecation") public BlockState mirror(BlockState state, Mirror mirror) { return state.rotate(mirror.getRotation(state.getValue(FACING))); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, LIT); @@ -137,9 +144,18 @@ public class EndStoneSmelter extends BaseBlockWithEntity { double y = pos.getY(); double z = pos.getZ() + 0.5D; if (random.nextDouble() < 0.1D) { - world.playLocalSound(x, y, z, SoundEvents.BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, false); + world.playLocalSound( + x, + y, + z, + SoundEvents.BLASTFURNACE_FIRE_CRACKLE, + SoundSource.BLOCKS, + 1.0F, + 1.0F, + false + ); } - + Direction direction = state.getValue(FACING); Direction.Axis axis = direction.getAxis(); double defOffset = random.nextDouble() * 0.6D - 0.3D; @@ -149,4 +165,15 @@ public class EndStoneSmelter extends BaseBlockWithEntity { world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D); } } + + + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return level.isClientSide() ? null : createTickerHelper( + blockEntityType, + EndBlockEntities.END_STONE_SMELTER, + EndStoneSmelterBlockEntity::tick + ); + } } diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 31469430..5e4566d8 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -12,15 +12,15 @@ import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; public class EnderBlock extends BaseBlock { - + public EnderBlock() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK) - .hardness(5F) - .resistance(6F) - .requiresCorrectToolForDrops() - .sound(SoundType.STONE)); + .hardness(5F) + .resistance(6F) + .requiresCorrectToolForDrops() + .sound(SoundType.STONE)); } - + @Environment(EnvType.CLIENT) public int getColor(BlockState state, BlockGetter world, BlockPos pos) { return 0xFF005548; diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 28ca0d6e..d5698e81 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -16,21 +13,27 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import ru.bclib.util.ColorUtil; +import java.util.Collections; +import java.util.List; + public class EndstoneDustBlock extends FallingBlock { @Environment(EnvType.CLIENT) private static final int COLOR = ColorUtil.color(226, 239, 168); public EndstoneDustBlock() { - super(FabricBlockSettings.copyOf(Blocks.SAND) - .breakByTool(FabricToolTags.SHOVELS) - .materialColor(Blocks.END_STONE.defaultMaterialColor())); + super(FabricBlockSettings + .copyOf(Blocks.SAND) + .breakByTool(FabricToolTags.SHOVELS) + .mapColor(Blocks.END_STONE.defaultMaterialColor()) + ); } @Override + @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); } - + @Environment(EnvType.CLIENT) public int getDustColor(BlockState state, BlockGetter world, BlockPos pos) { return COLOR; diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index e1b5404e..a2b843fa 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -28,6 +25,8 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; +import java.util.List; + public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = EndBlockProperties.ACTIVE; @@ -50,21 +49,24 @@ public class EternalPedestal extends PedestalBlock { int portalId; if (targetWorld != null) { portalId = EndPortals.getPortalIdByWorld(targetWorld); - } else { + } + else { portalId = EndPortals.getPortalIdByWorld(EndPortals.OVERWORLD_ID); } ritual.disablePortal(portalId); } } world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, false).setValue(HAS_LIGHT, false)); - } else { + } + else { ItemStack itemStack = pedestal.getItem(0); ResourceLocation id = Registry.ITEM.getKey(itemStack.getItem()); if (EndPortals.isAvailableItem(id)) { world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); - } else { + } + else { EternalRitual ritual = new EternalRitual(world, pos); ritual.checkStructure(); } @@ -124,12 +126,12 @@ public class EternalPedestal extends PedestalBlock { super.createBlockStateDefinition(stateManager); stateManager.add(ACTIVATED); } - + @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EternalPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EternalPedestalEntity(blockPos, blockState); } - + @Override public boolean hasUniqueEntity() { return true; diff --git a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java index 658195b7..f7a8fdf0 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxLanternBlock.java @@ -8,6 +8,9 @@ import ru.bclib.blocks.BaseBlock; public class FilaluxLanternBlock extends BaseBlock { public FilaluxLanternBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WOOD)); + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .luminance(15) + .sound(SoundType.WOOD)); } } diff --git a/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java index 7a3ef492..82bd8ff7 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.EnumMap; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -17,21 +14,27 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; -public class FilaluxWingsBlock extends BaseAttachedBlock implements IRenderTyped { +import java.util.EnumMap; + +public class FilaluxWingsBlock extends BaseAttachedBlock implements RenderLayerProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public FilaluxWingsBlock() { - super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sound(SoundType.WET_GRASS).noCollission()); + super(FabricBlockSettings.of(Material.PLANT) + .breakByTool(FabricToolTags.SHEARS) + .sound(SoundType.WET_GRASS) + .noCollission()); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index bba1a69d..1638595b 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -1,13 +1,14 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.WaterLilyBlockItem; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -18,17 +19,19 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.interfaces.CustomItemProvider; import ru.betterend.blocks.basis.EndPlantBlock; -import ru.betterend.interfaces.ISpetialItem; -public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { +import java.util.List; + +public class FlamaeaBlock extends EndPlantBlock implements CustomItemProvider { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); public FlamaeaBlock() { super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.WET_GRASS)); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS)); } @Override @@ -40,7 +43,7 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; @@ -50,14 +53,14 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override - public int getStackSize() { - return 64; + public boolean canBePotted() { + return false; } - + @Override - public boolean canPlaceOnWater() { - return true; + public BlockItem getCustomItem(ResourceLocation resourceLocation, FabricItemSettings fabricItemSettings) { + return new WaterLilyBlockItem(this, fabricItemSettings); } } diff --git a/src/main/java/ru/betterend/blocks/FlammalixBlock.java b/src/main/java/ru/betterend/blocks/FlammalixBlock.java new file mode 100644 index 00000000..92359bc7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FlammalixBlock.java @@ -0,0 +1,47 @@ +package ru.betterend.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.client.models.ModelsHelper; +import ru.betterend.blocks.basis.EndPlantBlock; +import ru.betterend.registry.EndBlocks; + +public class FlammalixBlock extends EndPlantBlock { + private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); + + public FlammalixBlock() { + super(false, 12); + } + + @Override + protected boolean isTerrain(BlockState state) { + return state.is(EndBlocks.PALLIDIUM_FULL) || + state.is(EndBlocks.PALLIDIUM_HEAVY) || + state.is(EndBlocks.PALLIDIUM_THIN) || + state.is(EndBlocks.PALLIDIUM_TINY); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public OffsetType getOffsetType() { + return OffsetType.NONE; + } + + @Override + @Environment(EnvType.CLIENT) + public BlockModel getItemModel(ResourceLocation resourceLocation) { + return ModelsHelper.createItemModel(resourceLocation); + } +} diff --git a/src/main/java/ru/betterend/blocks/FlowerPotBlock.java b/src/main/java/ru/betterend/blocks/FlowerPotBlock.java new file mode 100644 index 00000000..12b0fd4a --- /dev/null +++ b/src/main/java/ru/betterend/blocks/FlowerPotBlock.java @@ -0,0 +1,447 @@ +package ru.betterend.blocks; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.math.Transformation; +import com.mojang.math.Vector3f; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SaplingBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.storage.loot.LootContext.Builder; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.blocks.BaseBlockNotFull; +import ru.bclib.client.models.BasePatterns; +import ru.bclib.client.models.ModelsHelper; +import ru.bclib.client.models.ModelsHelper.MultiPartBuilder; +import ru.bclib.client.models.PatternsHelper; +import ru.bclib.client.render.BCLRenderLayer; +import ru.bclib.interfaces.PostInitable; +import ru.bclib.interfaces.RenderLayerProvider; +import ru.bclib.util.BlocksHelper; +import ru.bclib.util.JsonFactory; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.PottableLeavesBlock; +import ru.betterend.client.models.Patterns; +import ru.betterend.config.Configs; +import ru.betterend.interfaces.PottablePlant; +import ru.betterend.interfaces.PottableTerrain; +import ru.betterend.registry.EndBlocks; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class FlowerPotBlock extends BaseBlockNotFull implements RenderLayerProvider, PostInitable { + private static final IntegerProperty PLANT_ID = EndBlockProperties.PLANT_ID; + private static final IntegerProperty SOIL_ID = EndBlockProperties.SOIL_ID; + private static final IntegerProperty POT_LIGHT = EndBlockProperties.POT_LIGHT; + private static final VoxelShape SHAPE_EMPTY; + private static final VoxelShape SHAPE_FULL; + private static Block[] plants; + private static Block[] soils; + + public FlowerPotBlock(Block source) { + super(FabricBlockSettings.copyOf(source).luminance(state -> state.getValue(POT_LIGHT) * 5)); + this.registerDefaultState( + this.defaultBlockState() + .setValue(PLANT_ID, 0) + .setValue(SOIL_ID, 0) + .setValue(POT_LIGHT, 0) + ); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(PLANT_ID, SOIL_ID, POT_LIGHT); + } + + @Override + public List getDrops(BlockState state, Builder builder) { + List drop = Lists.newArrayList(new ItemStack(this)); + int id = state.getValue(SOIL_ID) - 1; + if (id >= 0 && id < soils.length && soils[id] != null) { + drop.add(new ItemStack(soils[id])); + } + id = state.getValue(PLANT_ID) - 1; + if (id >= 0 && id < plants.length && plants[id] != null) { + drop.add(new ItemStack(plants[id])); + } + return drop; + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + int plantID = state.getValue(PLANT_ID); + if (plantID < 1 || plantID > plants.length || plants[plantID - 1] == null) { + return state.getValue(POT_LIGHT) > 0 ? state.setValue(POT_LIGHT, 0) : state; + } + int light = plants[plantID - 1].defaultBlockState().getLightEmission() / 5; + if (state.getValue(POT_LIGHT) != light) { + state = state.setValue(POT_LIGHT, light); + } + return state; + } + + @Override + public void postInit() { + if (FlowerPotBlock.plants != null) { + return; + } + + Block[] plants = new Block[128]; + Block[] soils = new Block[16]; + + Map reservedPlantsIDs = Maps.newHashMap(); + Map reservedSoilIDs = Maps.newHashMap(); + + JsonObject obj = JsonFactory.getJsonObject(new File( + FabricLoader.getInstance().getConfigDir().toFile(), + BetterEnd.MOD_ID + "/blocks.json" + )); + if (obj.get("flower_pots") != null) { + JsonElement plantsObj = obj.get("flower_pots").getAsJsonObject().get("plants"); + JsonElement soilsObj = obj.get("flower_pots").getAsJsonObject().get("soils"); + if (plantsObj != null) { + plantsObj.getAsJsonObject().entrySet().forEach(entry -> { + String name = entry.getKey().substring(0, entry.getKey().indexOf(' ')); + reservedPlantsIDs.put(name, entry.getValue().getAsInt()); + }); + } + if (soilsObj != null) { + soilsObj.getAsJsonObject().entrySet().forEach(entry -> { + String name = entry.getKey().substring(0, entry.getKey().indexOf(' ')); + reservedSoilIDs.put(name, entry.getValue().getAsInt()); + }); + } + } + + EndBlocks.getModBlocks().forEach(block -> { + if (block instanceof PottablePlant && ((PottablePlant) block).canBePotted()) { + processBlock(plants, block, "flower_pots.plants", reservedPlantsIDs); + } + else if (block instanceof PottableTerrain && ((PottableTerrain) block).canBePotted()) { + processBlock(soils, block, "flower_pots.soils", reservedSoilIDs); + } + }); + Configs.BLOCK_CONFIG.saveChanges(); + + FlowerPotBlock.plants = new Block[maxNotNull(plants) + 1]; + System.arraycopy(plants, 0, FlowerPotBlock.plants, 0, FlowerPotBlock.plants.length); + + FlowerPotBlock.soils = new Block[maxNotNull(soils) + 1]; + System.arraycopy(soils, 0, FlowerPotBlock.soils, 0, FlowerPotBlock.soils.length); + + if (PLANT_ID.getValue(Integer.toString(FlowerPotBlock.plants.length)).isEmpty()) { + throw new RuntimeException("There are too much plant ID values!"); + } + if (SOIL_ID.getValue(Integer.toString(FlowerPotBlock.soils.length)).isEmpty()) { + throw new RuntimeException("There are too much soil ID values!"); + } + } + + private int maxNotNull(Block[] array) { + int max = 0; + for (int i = 0; i < array.length; i++) { + if (array[i] != null) { + max = i; + } + } + return max; + } + + private void processBlock(Block[] target, Block block, String path, Map idMap) { + ResourceLocation location = Registry.BLOCK.getKey(block); + if (idMap.containsKey(location.getPath())) { + target[idMap.get(location.getPath())] = block; + } + else { + for (int i = 0; i < target.length; i++) { + if (!idMap.values().contains(i)) { + target[i] = block; + idMap.put(location.getPath(), i); + Configs.BLOCK_CONFIG.getInt(path, location.getPath(), i); + break; + } + } + } + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (level.isClientSide) { + return InteractionResult.CONSUME; + } + ItemStack itemStack = player.getItemInHand(hand); + int soilID = state.getValue(SOIL_ID); + if (soilID == 0 || soilID > soils.length || soils[soilID - 1] == null) { + if (!(itemStack.getItem() instanceof BlockItem)) { + return InteractionResult.PASS; + } + Block block = ((BlockItem) itemStack.getItem()).getBlock(); + for (int i = 0; i < soils.length; i++) { + if (block == soils[i]) { + BlocksHelper.setWithUpdate(level, pos, state.setValue(SOIL_ID, i + 1)); + if (!player.isCreative()) { + itemStack.shrink(1); + } + level.playSound( + player, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + SoundEvents.SOUL_SOIL_PLACE, + SoundSource.BLOCKS, + 1, + 1 + ); + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + } + + int plantID = state.getValue(PLANT_ID); + if (itemStack.isEmpty()) { + if (plantID > 0 && plantID <= plants.length && plants[plantID - 1] != null) { + BlocksHelper.setWithUpdate(level, pos, state.setValue(PLANT_ID, 0).setValue(POT_LIGHT, 0)); + player.addItem(new ItemStack(plants[plantID - 1])); + return InteractionResult.SUCCESS; + } + if (soilID > 0 && soilID <= soils.length && soils[soilID - 1] != null) { + BlocksHelper.setWithUpdate(level, pos, state.setValue(SOIL_ID, 0)); + player.addItem(new ItemStack(soils[soilID - 1])); + } + return InteractionResult.PASS; + } + if (!(itemStack.getItem() instanceof BlockItem)) { + return InteractionResult.PASS; + } + BlockItem item = (BlockItem) itemStack.getItem(); + for (int i = 0; i < plants.length; i++) { + if (item.getBlock() == plants[i]) { + if (!((PottablePlant) plants[i]).canPlantOn(soils[soilID - 1])) { + return InteractionResult.PASS; + } + int light = plants[i].defaultBlockState().getLightEmission() / 5; + BlocksHelper.setWithUpdate(level, pos, state.setValue(PLANT_ID, i + 1).setValue(POT_LIGHT, light)); + level.playSound( + player, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + SoundEvents.HOE_TILL, + SoundSource.BLOCKS, + 1, + 1 + ); + if (!player.isCreative()) { + itemStack.shrink(1); + } + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + } + + @Override + @Environment(EnvType.CLIENT) + public BlockModel getItemModel(ResourceLocation blockId) { + Optional pattern = PatternsHelper.createJson(Patterns.BLOCK_FLOWER_POT, blockId); + return ModelsHelper.fromPattern(pattern); + } + + @Override + @Environment(EnvType.CLIENT) + public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { + MultiPartBuilder model = MultiPartBuilder.create(stateDefinition); + model.part(new ModelResourceLocation(stateId.getNamespace(), stateId.getPath(), "inventory")).add(); + Transformation offset = new Transformation(new Vector3f(0, 7.5F / 16F, 0), null, null, null); + + for (int i = 0; i < plants.length; i++) { + if (plants[i] == null) { + continue; + } + + final int compareID = i + 1; + ResourceLocation modelPath = Registry.BLOCK.getKey(plants[i]); + ResourceLocation objSource = new ResourceLocation( + modelPath.getNamespace(), + "models/block/" + modelPath.getPath() + "_potted.json" + ); + + if (Minecraft.getInstance().getResourceManager().hasResource(objSource)) { + objSource = new ResourceLocation(modelPath.getNamespace(), "block/" + modelPath.getPath() + "_potted"); + model.part(objSource) + .setTransformation(offset) + .setCondition(state -> state.getValue(PLANT_ID) == compareID) + .add(); + continue; + } + + else if (plants[i] instanceof SaplingBlock) { + ResourceLocation loc = Registry.BLOCK.getKey(plants[i]); + modelPath = new ResourceLocation(loc.getNamespace(), "block/" + loc.getPath() + "_potted"); + Map textures = Maps.newHashMap(); + textures.put("%modid%", loc.getNamespace()); + textures.put("%texture%", loc.getPath()); + Optional pattern = Patterns.createJson(BasePatterns.BLOCK_CROSS, textures); + UnbakedModel unbakedModel = ModelsHelper.fromPattern(pattern); + modelCache.put(modelPath, unbakedModel); + model.part(modelPath) + .setTransformation(offset) + .setCondition(state -> state.getValue(PLANT_ID) == compareID) + .add(); + continue; + } + else if (plants[i] instanceof PottableLeavesBlock) { + ResourceLocation loc = Registry.BLOCK.getKey(plants[i]); + modelPath = new ResourceLocation(loc.getNamespace(), "block/" + loc.getPath() + "_potted"); + Map textures = Maps.newHashMap(); + textures.put("%leaves%", loc.getPath().contains("lucernia") ? loc.getPath() + "_1" : loc.getPath()); + textures.put("%stem%", loc.getPath().replace("_leaves", "_log_side")); + Optional pattern = Patterns.createJson(Patterns.BLOCK_POTTED_LEAVES, textures); + UnbakedModel unbakedModel = ModelsHelper.fromPattern(pattern); + modelCache.put(modelPath, unbakedModel); + model.part(modelPath) + .setTransformation(offset) + .setCondition(state -> state.getValue(PLANT_ID) == compareID) + .add(); + continue; + } + + objSource = new ResourceLocation(modelPath.getNamespace(), "blockstates/" + modelPath.getPath() + ".json"); + JsonObject obj = JsonFactory.getJsonObject(objSource); + if (obj != null) { + JsonElement variants = obj.get("variants"); + JsonElement list = null; + String path = null; + + if (variants == null) { + continue; + } + + if (variants.isJsonArray()) { + list = variants.getAsJsonArray().get(0); + } + else if (variants.isJsonObject()) { + list = variants.getAsJsonObject().get(((PottablePlant) plants[i]).getPottedState()); + } + + if (list == null) { + BetterEnd.LOGGER.warning("Incorrect json for pot plant " + objSource + ", no matching variants"); + continue; + } + + if (list.isJsonArray()) { + path = list.getAsJsonArray().get(0).getAsJsonObject().get("model").getAsString(); + } + else { + path = list.getAsJsonObject().get("model").getAsString(); + } + + if (path == null) { + BetterEnd.LOGGER.warning("Incorrect json for pot plant " + objSource + ", no matching variants"); + continue; + } + + model.part(new ResourceLocation(path)) + .setTransformation(offset) + .setCondition(state -> state.getValue(PLANT_ID) == compareID) + .add(); + } + else { + ResourceLocation loc = Registry.BLOCK.getKey(plants[i]); + modelPath = new ResourceLocation(loc.getNamespace(), "block/" + loc.getPath() + "_potted"); + Map textures = Maps.newHashMap(); + textures.put("%modid%", loc.getNamespace()); + textures.put("%texture%", loc.getPath()); + Optional pattern = Patterns.createJson(BasePatterns.BLOCK_CROSS, textures); + UnbakedModel unbakedModel = ModelsHelper.fromPattern(pattern); + modelCache.put(modelPath, unbakedModel); + model.part(modelPath) + .setTransformation(offset) + .setCondition(state -> state.getValue(PLANT_ID) == compareID) + .add(); + } + } + + for (int i = 0; i < soils.length; i++) { + if (soils[i] == null) { + continue; + } + + ResourceLocation soilLoc = BetterEnd.makeID("flower_pot_soil_" + i); + if (!modelCache.containsKey(soilLoc)) { + String texture = Registry.BLOCK.getKey(soils[i]).getPath() + "_top"; + if (texture.contains("rutiscus")) { + texture += "_1"; + } + Optional pattern = Patterns.createJson(Patterns.BLOCK_FLOWER_POT_SOIL, texture); + UnbakedModel soil = ModelsHelper.fromPattern(pattern); + modelCache.put(soilLoc, soil); + } + final int compareID = i + 1; + model.part(soilLoc).setCondition(state -> state.getValue(SOIL_ID) == compareID).add(); + } + + UnbakedModel result = model.build(); + modelCache.put(stateId, result); + return result; + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + int id = state.getValue(PLANT_ID); + return id > 0 && id <= plants.length ? SHAPE_FULL : SHAPE_EMPTY; + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE_EMPTY; + } + + @Override + public BCLRenderLayer getRenderLayer() { + return BCLRenderLayer.CUTOUT; + } + + static { + SHAPE_EMPTY = Shapes.or(Block.box(4, 1, 4, 12, 8, 12), Block.box(5, 0, 5, 11, 1, 11)); + SHAPE_FULL = Shapes.or(SHAPE_EMPTY, Block.box(3, 8, 3, 13, 16, 13)); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java index 699fc309..53729efd 100644 --- a/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingHymenophoreBlock.java @@ -8,6 +8,9 @@ import ru.bclib.blocks.BaseBlock; public class GlowingHymenophoreBlock extends BaseBlock { public GlowingHymenophoreBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); + super(FabricBlockSettings.of(Material.WOOD) + .breakByTool(FabricToolTags.AXES) + .luminance(15) + .sound(SoundType.WART_BLOCK)); } } diff --git a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java index 22191437..5b065c01 100644 --- a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -19,12 +19,12 @@ public class GlowingMossBlock extends EndPlantBlock { } @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index 1a3c6fe0..ca137efd 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -22,20 +22,22 @@ public class GlowingPillarLuminophorBlock extends BaseBlock { public GlowingPillarLuminophorBlock() { super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.COLOR_ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .strength(0.2F) - .luminance(15) - .sound(SoundType.GRASS)); + .mapColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .strength(0.2F) + .luminance(15) + .sound(SoundType.GRASS)); this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } @Override + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return !state.getValue(NATURAL) || world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS); } @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { return Blocks.AIR.defaultBlockState(); diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index fa20609d..ab2ba5ed 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -20,16 +18,18 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; -public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { +import java.util.Random; +public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { + public GlowingPillarSeedBlock() { super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.GRASS) - .lightLevel(state -> state.getValue(AGE) * 3 + 3) - .randomTicks() - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel(state -> state.getValue(AGE) * 3 + 3) + .randomTicks() + .noCollission()); } @Override @@ -44,22 +44,35 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.defaultBlockState(); if (height < 2) { BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - } else { + } + else { BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); mut.move(Direction.UP); BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); } mut.move(Direction.UP); - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.DIRECTIONS) { + BlocksHelper.setWithUpdate( + world, + mut, + EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true) + ); + for (Direction dir : BlocksHelper.DIRECTIONS) { pos = mut.relative(dir); if (world.isEmptyBlock(pos)) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); + BlocksHelper.setWithUpdate( + world, + pos, + EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, dir) + ); } } mut.move(Direction.UP); if (world.isEmptyBlock(mut)) { - BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP)); + BlocksHelper.setWithUpdate( + world, + mut, + EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP) + ); } } diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 625d503c..92403686 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.color.block.BlockColor; @@ -23,38 +19,46 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseBlock; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; -public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { +import java.util.Collections; +import java.util.List; + +public class HelixTreeLeavesBlock extends BaseBlock implements CustomColorProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public HelixTreeLeavesBlock() { - super(FabricBlockSettings.of(Material.LEAVES) - .materialColor(MaterialColor.COLOR_ORANGE) - .breakByTool(FabricToolTags.SHEARS) - .sound(SoundType.WART_BLOCK) - .sound(SoundType.GRASS) - .strength(0.2F)); + super(FabricBlockSettings + .of(Material.LEAVES) + .mapColor(MaterialColor.COLOR_ORANGE) + .breakByTool(FabricToolTags.SHEARS) + .sound(SoundType.WART_BLOCK) + .sound(SoundType.GRASS) + .strength(0.2F) + ); + + TagAPI.addTags(this, TagAPI.BLOCK_LEAVES); } @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { return ColorUtil.color(237, getGreen(state.getValue(COLOR)), 20); }; } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> { @@ -79,7 +83,10 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel( + Enchantments.SILK_TOUCH, + tool + ) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); @@ -88,6 +95,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { } return Lists.newArrayList(); } - return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists.newArrayList(); + return MHelper.RANDOM.nextInt(32) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.HELIX_TREE_SAPLING)) : Lists + .newArrayList(); } } diff --git a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java index 527cfd49..4fea40b2 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java @@ -1,12 +1,25 @@ package ru.betterend.blocks; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import ru.betterend.blocks.basis.PottableFeatureSapling; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class HelixTreeSaplingBlock extends FeatureSaplingBlock { +public class HelixTreeSaplingBlock extends PottableFeatureSapling { + public HelixTreeSaplingBlock() { + super((state)->EndFeatures.HELIX_TREE.getFeature()); + } + @Override - protected Feature getFeature() { - return EndFeatures.HELIX_TREE.getFeature(); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS); + } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.AMBER_MOSS; } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxBlock.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java index 9169bfaf..7db4f4af 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -29,17 +24,21 @@ import ru.betterend.blocks.EndBlockProperties.HydraluxShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -public class HydraluxBlock extends UnderwaterPlantBlock { +import java.util.Collections; +import java.util.List; +import java.util.Random; +public class HydraluxBlock extends UnderwaterPlantBlock { + public static final EnumProperty SHAPE = EndBlockProperties.HYDRALUX_SHAPE; public HydraluxBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.WET_GRASS) - .lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.WET_GRASS) + .lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0) + .noCollission()); } @Override @@ -61,17 +60,17 @@ public class HydraluxBlock extends UnderwaterPlantBlock { return down.is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; @@ -90,7 +89,10 @@ public class HydraluxBlock extends UnderwaterPlantBlock { return Lists.newArrayList(new ItemStack(EndItems.HYDRALUX_PETAL, MHelper.randRange(1, 4, MHelper.RANDOM))); } else if (shape == HydraluxShape.ROOTS) { - return Lists.newArrayList(new ItemStack(EndBlocks.HYDRALUX_SAPLING, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Lists.newArrayList(new ItemStack( + EndBlocks.HYDRALUX_SAPLING, + MHelper.randRange(1, 2, MHelper.RANDOM) + )); } return Collections.emptyList(); } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 5c82d09a..78759553 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -6,19 +6,23 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; public class HydraluxPetalBlock extends BaseBlock { public HydraluxPetalBlock() { - this(FabricBlockSettings.of(Material.PLANT) + this( + FabricBlockSettings + .of(Material.PLANT) .breakByTool(FabricToolTags.AXES) .breakByHand(true) .hardness(1) .resistance(1) - .materialColor(MaterialColor.PODZOL) - .sound(SoundType.WART_BLOCK)); + .mapColor(MaterialColor.PODZOL) + .sound(SoundType.WART_BLOCK) + ); } public HydraluxPetalBlock(Properties settings) { @@ -26,5 +30,6 @@ public class HydraluxPetalBlock extends BaseBlock { } @Override - public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {} + public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) { + } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index f9a882b5..7e7236a4 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -1,21 +1,22 @@ package ru.betterend.blocks; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; -public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements IColorProvider { +import java.util.Optional; + +public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements CustomColorProvider { public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } @@ -24,13 +25,14 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo public BlockColor getProvider() { return (state, world, pos, tintIndex) -> BlocksHelper.getBlockColor(this); } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> BlocksHelper.getBlockColor(this); } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String path = "betterend:block/block_petal_colored"; Optional pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index f3b11147..6e51b979 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -13,8 +11,10 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.EndBlockProperties.HydraluxShape; import ru.betterend.registry.EndBlocks; -public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { +import java.util.Random; +public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { + @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); @@ -29,18 +29,40 @@ public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { mut.setY(pos.getY()); BlockState state = EndBlocks.HYDRALUX.defaultBlockState(); - BlocksHelper.setWithoutUpdate(world, pos, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); + BlocksHelper.setWithoutUpdate( + world, + pos, + state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS) + ); for (int i = 1; i < h - 2; i++) { mut.setY(pos.getY() + i); - BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); + BlocksHelper.setWithoutUpdate( + world, + mut, + state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE) + ); } mut.setY(mut.getY() + 1); boolean big = random.nextBoolean(); - BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); + BlocksHelper.setWithoutUpdate( + world, + mut, + state.setValue( + EndBlockProperties.HYDRALUX_SHAPE, + big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM + ) + ); mut.setY(mut.getY() + 1); - BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); + BlocksHelper.setWithoutUpdate( + world, + mut, + state.setValue( + EndBlockProperties.HYDRALUX_SHAPE, + big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP + ) + ); } @Override diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 806455f5..a53a457a 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -26,6 +22,8 @@ import net.minecraft.world.level.block.LiquidBlockContainer; import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; 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; @@ -36,12 +34,14 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndParticles; + +import java.util.Random; @SuppressWarnings("deprecation") public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlock, LiquidBlockContainer, SimpleWaterloggedBlock { @@ -51,10 +51,10 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo public HydrothermalVentBlock() { super(FabricBlockSettings.of(Material.STONE) - .breakByTool(FabricToolTags.PICKAXES) - .sound(SoundType.STONE) - .noCollission() - .requiresCorrectToolForDrops()); + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.STONE) + .noCollission() + .requiresCorrectToolForDrops()); this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, true).setValue(ACTIVATED, false)); } @@ -72,7 +72,7 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } - + @Override public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; @@ -90,7 +90,7 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo return Blocks.WATER.defaultBlockState(); } else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { - world.getBlockTicks().scheduleTick(pos, this, 20); + world.scheduleTick(pos, this, 20); } return state; } @@ -99,48 +99,51 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getClickedPos(); - return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER); + return this.defaultBlockState() + .setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER); } @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } - + @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new BlockEntityHydrothermalVent(); + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BlockEntityHydrothermalVent(pos, state); } - + @Override public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); - world.getBlockTicks().scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); + world.scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); } } @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { - if (world instanceof ServerLevel && state.getValue(WATERLOGGED) && world.getBlockState(pos.above()).is(Blocks.WATER)) { - tick(state,(ServerLevel) world, pos, world.random); + if (world instanceof ServerLevel && state.getValue(WATERLOGGED) && world.getBlockState(pos.above()) + .is(Blocks.WATER)) { + tick(state, (ServerLevel) world, pos, world.random); } } @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { + super.animateTick(state, world, pos, random); if (!state.getValue(ACTIVATED) && random.nextBoolean()) { - super.animateTick(state, world, pos, random); double x = pos.getX() + random.nextDouble(); double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; double z = pos.getZ() + random.nextDouble(); - if (state.getValue(WATERLOGGED)) { - world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { - world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); - } + world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, 0, 0); } } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return BlockEntityHydrothermalVent::tick; + } } diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 2604055d..bc802776 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -6,10 +6,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.rituals.InfusionRitual; @@ -18,7 +21,7 @@ import ru.betterend.rituals.InfusionRitual; public class InfusionPedestal extends PedestalBlock { private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_PEDESTAL_TOP; - + public InfusionPedestal() { super(Blocks.OBSIDIAN); this.height = 1.08F; @@ -35,7 +38,8 @@ public class InfusionPedestal extends PedestalBlock { ritual.configure(); } pedestal.getRitual().checkRecipe(); - } else { + } + else { InfusionRitual ritual = new InfusionRitual(pedestal, world, pos); pedestal.linkRitual(ritual); ritual.checkRecipe(); @@ -44,20 +48,20 @@ public class InfusionPedestal extends PedestalBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new InfusionPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new InfusionPedestalEntity(blockPos, blockState); } - + @Override public boolean hasUniqueEntity() { return true; } - + @Override @Deprecated public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch(state.getValue(STATE)) { + switch (state.getValue(STATE)) { case PEDESTAL_TOP: { return SHAPE_PEDESTAL_TOP; } @@ -71,7 +75,13 @@ public class InfusionPedestal extends PedestalBlock { } return super.getShape(state, world, pos, context); } - + + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return InfusionPedestalEntity::tickEnity; + } + static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index caf38d89..44f5e696 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -1,12 +1,8 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -23,17 +19,21 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.storage.loot.LootContext; -import ru.bclib.client.models.BlockModelProvider; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IColorProvider; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.BlockModelProvider; +import ru.bclib.interfaces.CustomColorProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.client.models.Patterns; import ru.betterend.noise.OpenSimplexNoise; -public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, BlockModelProvider, IColorProvider { +import java.util.List; +import java.util.Optional; + +public class JellyshroomCapBlock extends SlimeBlock implements RenderLayerProvider, BlockModelProvider, CustomColorProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); private final Vec3i colorStart; @@ -66,21 +66,24 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo } @Override + @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); return ModelsHelper.fromPattern(pattern); } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { @@ -91,7 +94,7 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo return ColorUtil.color(r, g, b); }; } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> { diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 5c2a678e..ebb1e3b5 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -2,24 +2,25 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class LacugroveSaplingBlock extends FeatureSaplingBlock { +public class LacugroveSaplingBlock extends PottableFeatureSapling { public LacugroveSaplingBlock() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.LACUGROVE.getFeature(); + super((state)->EndFeatures.LACUGROVE.getFeature()); } @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { - return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()) + .is(EndBlocks.ENDSTONE_DUST); + } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.END_MOSS; } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index a7e29890..eeab0ae4 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -21,15 +18,18 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; -public class LanceleafBlock extends EndPlantBlock { +import java.util.Collections; +import java.util.List; +public class LanceleafBlock extends EndPlantBlock { + public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; public static final IntegerProperty ROTATION = BlockProperties.ROTATION; public LanceleafBlock() { super(); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, ROTATION); @@ -42,7 +42,8 @@ public class LanceleafBlock extends EndPlantBlock { return world.getBlockState(pos.below()).is(this); } else if (shape == PentaShape.BOTTOM) { - return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.above()).is(this); + return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS) && world.getBlockState(pos.above()) + .is(this); } else { return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); @@ -64,6 +65,7 @@ public class LanceleafBlock extends EndPlantBlock { if (state.getValue(SHAPE) == PentaShape.BOTTOM) { return Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); } - return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack(EndBlocks.LANCELEAF_SEED)); + return MHelper.RANDOM.nextBoolean() ? Collections.emptyList() : Collections.singletonList(new ItemStack( + EndBlocks.LANCELEAF_SEED)); } } diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 8c8455e9..c75251ac 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -15,6 +13,8 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LanceleafSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { @@ -27,12 +27,28 @@ public class LanceleafSeedBlock extends EndPlantWithAgeBlock { MutableBlockPos mut = new MutableBlockPos().set(pos); BlockState plant = EndBlocks.LANCELEAF.defaultBlockState().setValue(BlockProperties.ROTATION, rotation); BlocksHelper.setWithoutUpdate(world, mut, plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.BOTTOM)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM)); + BlocksHelper.setWithoutUpdate( + world, + mut.move(Direction.UP), + plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_BOTTOM) + ); for (int i = 2; i < height - 2; i++) { - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE)); + BlocksHelper.setWithoutUpdate( + world, + mut.move(Direction.UP), + plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.MIDDLE) + ); } - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + mut.move(Direction.UP), + plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP) + ); + BlocksHelper.setWithoutUpdate( + world, + mut.move(Direction.UP), + plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.TOP) + ); } @Override diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index d45f9de2..d9763815 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -22,6 +20,8 @@ import ru.bclib.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 14, 12); @@ -29,10 +29,10 @@ public class LargeAmaranitaBlock extends EndPlantBlock { public LargeAmaranitaBlock() { super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.GRASS) - .lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0)); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0)); } @Override @@ -73,7 +73,7 @@ public class LargeAmaranitaBlock extends EndPlantBlock { public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; diff --git a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java index 91ed218a..e1881306 100644 --- a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java @@ -2,24 +2,24 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class LucerniaSaplingBlock extends FeatureSaplingBlock { +public class LucerniaSaplingBlock extends PottableFeatureSapling { public LucerniaSaplingBlock() { - super(); + super((state)->EndFeatures.LUCERNIA.getFeature()); } - @Override - protected Feature getFeature() { - return EndFeatures.LUCERNIA.getFeature(); - } - @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.RUTISCUS; + } } diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index e0717bea..ac27121f 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -25,30 +22,33 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.MHelper; import ru.betterend.blocks.EndBlockProperties.LumecornShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; + @SuppressWarnings("deprecation") -public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { +public class LumecornBlock extends BaseBlockNotFull implements RenderLayerProvider { public static final EnumProperty SHAPE = EnumProperty.create("shape", LumecornShape.class); private static final VoxelShape SHAPE_BOTTOM = Block.box(6, 0, 6, 10, 16, 10); private static final VoxelShape SHAPE_TOP = Block.box(6, 0, 6, 10, 8, 10); public LumecornBlock() { super(FabricBlockSettings.of(Material.WOOD) - .breakByTool(FabricToolTags.AXES) - .hardness(0.5F) - .luminance(state -> state.getValue(SHAPE).getLight())); + .breakByTool(FabricToolTags.AXES) + .hardness(0.5F) + .luminance(state -> state.getValue(SHAPE).getLight())); } @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; @@ -63,7 +63,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL) { - return world.getBlockState(pos.below()).is(TagAPI.END_GROUND); + return world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND); } else if (shape == LumecornShape.LIGHT_TOP) { return world.getBlockState(pos.below()).is(this); @@ -87,9 +87,13 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { public List getDrops(BlockState state, LootContext.Builder builder) { LumecornShape shape = state.getValue(SHAPE); if (shape == LumecornShape.BOTTOM_BIG || shape == LumecornShape.BOTTOM_SMALL || shape == LumecornShape.MIDDLE) { - return Collections.singletonList(new ItemStack(EndBlocks.LUMECORN_SEED, MHelper.randRange(1, 2, MHelper.RANDOM))); + return Collections.singletonList(new ItemStack( + EndBlocks.LUMECORN_SEED, + MHelper.randRange(1, 2, MHelper.RANDOM) + )); } - return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); + return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections + .emptyList(); } @Override diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index ed04a881..31363dee 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -1,27 +1,37 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +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 ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Optional; +import java.util.Random; + public class LumecornSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { - EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); + ((Feature) (EndFeatures.LUMECORN.getFeature())).place(new FeaturePlaceContext<>( + Optional.empty(), + world, + null, + random, + pos, + (NoneFeatureConfiguration) null)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index d644fcaf..02fdf11e 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -1,14 +1,12 @@ package ru.betterend.blocks; -import java.util.Queue; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.FluidTags; import net.minecraft.util.Tuple; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Blocks; @@ -17,15 +15,21 @@ import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.betterend.registry.EndBlocks; +import java.util.Queue; + @SuppressWarnings("deprecation") -public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped { +public class MengerSpongeBlock extends BaseBlockNotFull implements RenderLayerProvider { + private static final VoxelShape SHAPE; + public MengerSpongeBlock() { super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); } @@ -44,36 +48,42 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped } return state; } - + private boolean absorbWater(LevelAccessor world, BlockPos pos) { Queue> queue = Lists.newLinkedList(); queue.add(new Tuple<>(pos, 0)); int i = 0; - + while (!queue.isEmpty()) { Tuple pair = queue.poll(); BlockPos blockPos = pair.getA(); int j = pair.getB(); - + for (Direction direction : Direction.values()) { BlockPos blockPos2 = blockPos.relative(direction); BlockState blockState = world.getBlockState(blockPos2); FluidState fluidState = world.getFluidState(blockPos2); Material material = blockState.getMaterial(); if (fluidState.is(FluidTags.WATER)) { - if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) { + if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup) blockState.getBlock()).pickupBlock( + world, + blockPos2, + blockState + ).isEmpty()) { ++i; if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); } - } else if (blockState.getBlock() instanceof LiquidBlock) { + } + else if (blockState.getBlock() instanceof LiquidBlock) { world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); } - } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null; + } + else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { + BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; dropResources(blockState, world, blockPos2, blockEntity); world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; @@ -83,12 +93,12 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped } } } - + if (i > 64) { break; } } - + return i > 0; } @@ -96,4 +106,22 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } + + @Override + public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) { + return SHAPE; + } + + static { + SHAPE = Shapes.or( + Shapes.or(box(0, 0, 0, 16, 6, 6), box(0, 0, 10, 16, 6, 16), + Shapes.or(box(0, 10, 0, 16, 16, 6), box(0, 10, 10, 16, 16, 16)), + + Shapes.or(box(0, 0, 0, 6, 6, 16), box(10, 0, 0, 16, 6, 16)), + Shapes.or(box(0, 10, 0, 6, 16, 16), box(10, 10, 0, 16, 16, 16)), + + Shapes.or(box(0, 0, 0, 6, 16, 6), box(10, 0, 0, 16, 16, 6)), + Shapes.or(box(0, 0, 10, 6, 16, 16), box(10, 0, 10, 16, 16, 16)) + )); + } } diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 0908d9f3..e2c12f45 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -13,33 +11,45 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + @SuppressWarnings("deprecation") -public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyped { +public class MengerSpongeWetBlock extends BaseBlockNotFull implements RenderLayerProvider { public MengerSpongeWetBlock() { super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).noOcclusion()); } - + @Override public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (world.dimensionType().ultraWarm()) { world.setBlock(pos, EndBlocks.MENGER_SPONGE.defaultBlockState(), 3); world.levelEvent(2009, pos, 0); - world.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F); + world.playSound( + null, + pos, + SoundEvents.FIRE_EXTINGUISH, + SoundSource.BLOCKS, + 1.0F, + (1.0F + world.getRandom().nextFloat() * 0.2F) * 0.7F + ); } } - + @Override @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { @@ -77,12 +87,12 @@ public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyp } } } - + world.addParticle(ParticleTypes.DRIPPING_WATER, x, y, z, 0, 0, 0); } } } - + @Override public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); @@ -90,7 +100,13 @@ public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyp world.levelEvent(2001, pos, getId(state)); } if (world.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) && (player == null || !player.isCreative())) { - ItemEntity drop = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(this)); + ItemEntity drop = new ItemEntity( + world, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + new ItemStack(this) + ); world.addFreshEntity(drop); } } @@ -104,4 +120,9 @@ public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyp public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } + + @Override + public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) { + return EndBlocks.MENGER_SPONGE.getShape(blockState, blockGetter, blockPos, collisionContext); + } } diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index b7d3e7e1..81877dc7 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -21,6 +17,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseRotatedPillarBlock; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; +import java.util.Random; + @SuppressWarnings("deprecation") public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { public MossyDragonBoneBlock() { @@ -42,18 +42,28 @@ public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { world.setBlockAndUpdate(pos, Blocks.BONE_BLOCK.defaultBlockState().setValue(AXIS, state.getValue(AXIS))); } } - + @Override public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { - BlockPos blockPos = pos.above(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getAmount() == 8) { - return false; - } else { - int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto( + worldView, + state, + pos, + blockState, + blockPos, + Direction.UP, + blockState.getLightBlock(worldView, blockPos) + ); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index 982d4cf6..4bd1bbcb 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -1,7 +1,8 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.tags.Tag.Named; +import net.minecraft.world.item.Item; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; @@ -9,22 +10,35 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.Material; +import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseBlock; +import ru.bclib.interfaces.TagProvider; import ru.betterend.registry.EndBlocks; -public class MossyGlowshroomCapBlock extends BaseBlock { +import java.util.List; + +public class MossyGlowshroomCapBlock extends BaseBlock implements TagProvider { public static final BooleanProperty TRANSITION = EndBlockProperties.TRANSITION; public MossyGlowshroomCapBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); + super(FabricBlockSettings.of(Material.WOOD).sound(SoundType.WOOD)); this.registerDefaultState(this.stateDefinition.any().setValue(TRANSITION, false)); } public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getClickedPos().below()))); + return this.defaultBlockState() + .setValue( + TRANSITION, + EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getClickedPos().below())) + ); } - + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(TRANSITION); } + + @Override + public void addTags(List> blockTags, List> itemTags) { + blockTags.add(TagAPI.MINEABLE_AXE); + } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index da75416d..5e63fdce 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -2,25 +2,25 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { - +public class MossyGlowshroomSaplingBlock extends PottableFeatureSapling { public MossyGlowshroomSaplingBlock() { - super(7); + super(7, (state)->EndFeatures.MOSSY_GLOWSHROOM.getFeature()); } @Override - protected Feature getFeature() { - return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()) + .is(EndBlocks.END_MYCELIUM); } @Override - public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { - return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); + public boolean canPlantOn(Block block) { + return block == EndBlocks.END_MOSS || block == EndBlocks.END_MYCELIUM; } } diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index d3423fdf..ce33774e 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -20,6 +16,10 @@ import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class MossyObsidian extends BaseBlock { public MossyObsidian() { super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); @@ -35,22 +35,34 @@ public class MossyObsidian extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); } } + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { - BlockPos blockPos = pos.above(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer)blockState.getValue(SnowLayerBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getAmount() == 8) { - return false; - } else { - int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto( + worldView, + state, + pos, + blockState, + blockPos, + Direction.UP, + blockState.getLightBlock(worldView, blockPos) + ); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index cd7ec961..a2789094 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -17,6 +15,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class MurkweedBlock extends EndPlantBlock { @Override @Environment(EnvType.CLIENT) @@ -29,6 +29,7 @@ public class MurkweedBlock extends EndPlantBlock { } @Override + @SuppressWarnings("deprecation") public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity && !((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS)) { ((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); @@ -41,6 +42,7 @@ public class MurkweedBlock extends EndPlantBlock { } @Override + @SuppressWarnings("deprecation") public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 57807754..0cb15a70 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; @@ -23,8 +20,11 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class NeedlegrassBlock extends EndPlantBlock { @Override + @SuppressWarnings("deprecation") public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity) { entity.hurt(DamageSource.CACTUS, 0.1F); @@ -34,7 +34,10 @@ public class NeedlegrassBlock extends EndPlantBlock { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel( + Enchantments.SILK_TOUCH, + tool + ) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { @@ -46,8 +49,9 @@ public class NeedlegrassBlock extends EndPlantBlock { protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SHADOW_GRASS); } - + @Override + @SuppressWarnings("deprecation") public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 2d1d9acd..db9468c8 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; -import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.betterend.blocks.basis.LitPillarBlock; -public class NeonCactusBlock extends BaseRotatedPillarBlock { +public class NeonCactusBlock extends LitPillarBlock { public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index 568ea567..2e428182 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -1,12 +1,9 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; @@ -42,14 +39,19 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.blocks.EndBlockProperties.CactusBottom; +import ru.betterend.interfaces.PottablePlant; import ru.betterend.registry.EndBlocks; +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + @SuppressWarnings("deprecation") -public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, IRenderTyped { +public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, RenderLayerProvider, PottablePlant { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public static final EnumProperty CACTUS_BOTTOM = EndBlockProperties.CACTUS_BOTTOM; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; @@ -65,7 +67,9 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate public NeonCactusPlantBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); - registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); + registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false) + .setValue(FACING, Direction.UP) + .setValue(SHAPE, TripleShape.TOP)); } @Override @@ -79,7 +83,9 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate BlockPos pos = ctx.getClickedPos(); Direction dir = ctx.getClickedFace(); BlockState down = world.getBlockState(pos.relative(dir.getOpposite())); - BlockState state = this.defaultBlockState().setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); + BlockState state = this.defaultBlockState() + .setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER) + .setValue(FACING, ctx.getClickedFace()); if (down.is(Blocks.END_STONE) || down.is(EndBlocks.ENDSTONE_DUST)) { state = state.setValue(CACTUS_BOTTOM, CactusBottom.SAND); } @@ -96,7 +102,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } - + @Override public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); @@ -109,9 +115,9 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { - world.getBlockTicks().scheduleTick(pos, this, 2); + world.scheduleTick(pos, this, 2); if (state.getValue(WATERLOGGED)) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } Direction dir = state.getValue(FACING); BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); @@ -171,7 +177,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (!this.canSurvive(state, world, pos) || random.nextInt(8) > 0) { return; - } + } Direction dir = state.getValue(FACING); if (!world.isEmptyBlock(pos.relative(dir))) { return; @@ -193,11 +199,17 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate Direction side = getSideDirection(world, pos, state, dir, random); BlockPos sidePos = pos.relative(side); if (world.isEmptyBlock(sidePos)) { - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlockState placement = state.setValue(SHAPE, TripleShape.TOP) + .setValue(CACTUS_BOTTOM, CactusBottom.EMPTY) + .setValue(WATERLOGGED, false) + .setValue(FACING, side); BlocksHelper.setWithoutUpdate(world, sidePos, placement); } } - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlockState placement = state.setValue(SHAPE, TripleShape.TOP) + .setValue(CACTUS_BOTTOM, CactusBottom.EMPTY) + .setValue(WATERLOGGED, false) + .setValue(FACING, dir); BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); mutateStem(placement, world, pos, MAX_LENGTH); } @@ -254,12 +266,18 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate Direction side = getSideDirection(world, pos, state, dir, random); BlockPos sidePos = pos.relative(side); if (world.isEmptyBlock(sidePos)) { - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, side); + BlockState placement = state.setValue(SHAPE, TripleShape.TOP) + .setValue(CACTUS_BOTTOM, CactusBottom.EMPTY) + .setValue(WATERLOGGED, false) + .setValue(FACING, side); BlocksHelper.setWithoutUpdate(world, sidePos, placement); ends.add(sidePos.mutable()); } } - BlockState placement = state.setValue(SHAPE, TripleShape.TOP).setValue(CACTUS_BOTTOM, CactusBottom.EMPTY).setValue(WATERLOGGED, false).setValue(FACING, dir); + BlockState placement = state.setValue(SHAPE, TripleShape.TOP) + .setValue(CACTUS_BOTTOM, CactusBottom.EMPTY) + .setValue(WATERLOGGED, false) + .setValue(FACING, dir); BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); mutateStem(placement, world, pos, MAX_LENGTH); pos.move(dir); @@ -273,7 +291,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate while (iterState.is(this) && startDir.getAxis().isVertical()) { startDir = iterState.getValue(FACING); if (lastDir == null) { - for (Direction side: BlocksHelper.HORIZONTAL) { + for (Direction side : BlocksHelper.HORIZONTAL) { BlockState sideState = world.getBlockState(iterPos.relative(side)); if (sideState.is(this)) { Direction sideDir = sideState.getValue(FACING); @@ -294,7 +312,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate } return side; } - + @Override public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { return false; @@ -313,13 +331,13 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate mut.move(dir); state = world.getBlockState(mut); if (!state.is(this)) { - if (!state.is(TagAPI.END_GROUND)) { + if (!state.is(TagAPI.BLOCK_END_GROUND)) { length = -1; } break; } dir = state.getValue(FACING).getOpposite(); - length ++; + length++; } return length; } @@ -338,7 +356,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate if (dir.getStepY() != 0) { break; } - count ++; + count++; } return count; } @@ -375,25 +393,36 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); - BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); - SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); + SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + } + + @Override + public boolean canPlantOn(Block block) { + return true; + } + + @Override + @Environment(EnvType.CLIENT) + public String getPottedState() { + return "bottom=moss,shape=top,facing=up"; } } diff --git a/src/main/java/ru/betterend/blocks/PallidiumBlock.java b/src/main/java/ru/betterend/blocks/PallidiumBlock.java new file mode 100644 index 00000000..593f5f45 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/PallidiumBlock.java @@ -0,0 +1,66 @@ +package ru.betterend.blocks; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import ru.bclib.util.BlocksHelper; +import ru.betterend.blocks.basis.EndTerrainBlock; +import ru.betterend.registry.EndBlocks; + +import java.util.Map; + +public class PallidiumBlock extends EndTerrainBlock { + private final Block nextLevel; + + public PallidiumBlock(String thickness, Block nextLevel) { + super(MaterialColor.COLOR_LIGHT_GRAY); + this.nextLevel = nextLevel; + } + + public boolean canBePotted() { + return this == EndBlocks.PALLIDIUM_FULL; + } + + @Override + public Block getBaseBlock() { + return EndBlocks.UMBRALITH.stone; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (nextLevel == null) { + return InteractionResult.PASS; + } + else if (level.isClientSide) { + return InteractionResult.PASS; + } + + ItemStack itemStack = player.getItemInHand(hand); + if (itemStack.is(Items.BONE_MEAL)) { + BlocksHelper.setWithUpdate(level, pos, nextLevel); + if (!player.isCreative()) { + itemStack.shrink(1); + } + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + + @Override + @Environment(EnvType.CLIENT) + public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { + return this.getBlockModel(stateId, blockState); + } +} diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index 77eafd9d..44004e98 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -1,27 +1,28 @@ package ru.betterend.blocks; -import java.util.HashMap; -import java.util.Map; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import ru.betterend.blocks.basis.PedestalBlock; -public class PedestalVanilla extends PedestalBlock { +import java.util.HashMap; +import java.util.Map; +public class PedestalVanilla extends PedestalBlock { + public PedestalVanilla(Block parent) { super(parent); } - + @Override protected Map createTexturesMap() { ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath().replace("_block", ""); return new HashMap() { private static final long serialVersionUID = 1L; + { - put("%mod%", blockId.getNamespace() ); + put("%mod%", blockId.getNamespace()); put("%top%", "polished_" + name); put("%base%", "polished_" + name); put("%pillar%", name + "_pillar"); diff --git a/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java index 8a485ed2..21cb4564 100644 --- a/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java +++ b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,23 +17,25 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; +import java.util.Random; + public class PondAnemoneBlock extends EndUnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); public PondAnemoneBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .luminance(13) - .sound(SoundType.CORAL_BLOCK) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(13) + .sound(SoundType.CORAL_BLOCK) + .noCollission()); } @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { double x = pos.getX() + random.nextDouble(); @@ -53,7 +53,7 @@ public class PondAnemoneBlock extends EndUnderwaterPlantBlock { public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index 1f01907e..9d6afd70 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -2,24 +2,24 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class PythadendronSaplingBlock extends FeatureSaplingBlock { +public class PythadendronSaplingBlock extends PottableFeatureSapling { public PythadendronSaplingBlock() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.PYTHADENDRON_TREE.getFeature(); + super((state)->EndFeatures.PYTHADENDRON_TREE.getFeature()); } @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM); } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.CHORUS_NYLIUM; + } } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 48b5e923..b087533f 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -35,19 +30,22 @@ import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IColorProvider; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.CustomColorProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; import ru.betterend.particle.InfusionParticleType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IRenderTyped { +import java.util.List; + +public class RespawnObeliskBlock extends BaseBlock implements CustomColorProvider, RenderLayerProvider { private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.box(1, 0, 1, 15, 16, 15); private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.box(2, 0, 2, 14, 16, 14); @@ -60,6 +58,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; } @@ -70,6 +69,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } @Override + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { for (int i = 0; i < 3; i++) { if (!world.getBlockState(pos.above(i)).getMaterial().isReplaceable()) { @@ -88,6 +88,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { @@ -139,7 +140,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR return Lists.newArrayList(); } } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; @@ -147,7 +148,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR @Override public BlockColor getProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); + return ((CustomColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); } @Override @@ -156,15 +157,19 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR return ColorUtil.color(255, 255, 255); }; } - + @Override + @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { ItemStack itemStack = player.getItemInHand(hand); boolean canActivate = itemStack.getItem() == EndItems.AMBER_GEM && itemStack.getCount() > 5; if (hand != InteractionHand.MAIN_HAND || !canActivate) { if (!world.isClientSide && !(itemStack.getItem() instanceof BlockItem) && !player.isCreative()) { ServerPlayer serverPlayerEntity = (ServerPlayer) player; - serverPlayerEntity.displayClientMessage(new TranslatableComponent("message.betterend.fail_spawn"), true); + serverPlayerEntity.displayClientMessage( + new TranslatableComponent("message.betterend.fail_spawn"), + true + ); } return InteractionResult.FAIL; } @@ -193,10 +198,10 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR ((ServerLevel) world).sendParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); ((ServerLevel) world).sendParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); } - world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); - if (!player.isCreative()) { - itemStack.shrink(6); - } + world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); + if (!player.isCreative()) { + itemStack.shrink(6); + } } return player.isCreative() ? InteractionResult.PASS : InteractionResult.sidedSuccess(world.isClientSide); } diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9cae1cea..3ebe6c4d 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; @@ -18,17 +15,20 @@ import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class RunedFlavolite extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public RunedFlavolite(boolean unbreakable) { super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished) - .strength( - unbreakable ? -1 : 1, - unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance() - ).luminance(state -> { - return state.getValue(ACTIVATED) ? 8 : 0; - })); + .strength( + unbreakable ? -1 : 1, + unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance() + ) + .luminance(state -> { + return state.getValue(ACTIVATED) ? 8 : 0; + })); this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 997a8f85..e31de007 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -6,11 +6,11 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import ru.bclib.blocks.BaseCropBlock; +import ru.betterend.blocks.basis.PottableCropBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -public class ShadowBerryBlock extends BaseCropBlock { +public class ShadowBerryBlock extends PottableCropBlock { private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 8, 15); public ShadowBerryBlock() { diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index 99740b04..3cdaf282 100644 --- a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -11,16 +9,26 @@ import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.registry.EndParticles; +import java.util.Random; + public class ShadowGrassBlock extends EndTerrainBlock { public ShadowGrassBlock() { super(MaterialColor.COLOR_BLACK); } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { super.animateTick(state, world, pos, random); if (random.nextInt(32) == 0) { - world.addParticle(EndParticles.BLACK_SPORE, (double) pos.getX() + random.nextDouble(), (double) pos.getY() + 1.1D, (double) pos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + world.addParticle( + EndParticles.BLACK_SPORE, + (double) pos.getX() + random.nextDouble(), + (double) pos.getY() + 1.1D, + (double) pos.getZ() + random.nextDouble(), + 0.0D, + 0.0D, + 0.0D + ); } } } diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index a769f1a3..63b1d3b2 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -36,12 +34,20 @@ import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; +import java.util.Random; + public class SilkMothHiveBlock extends BaseBlock { public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = EndBlockProperties.FULLNESS; public SilkMothHiveBlock() { - super(FabricBlockSettings.of(Material.WOOD).breakByHand(true).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + super(FabricBlockSettings.of(Material.WOOD) + .breakByHand(true) + .hardness(0.5F) + .resistance(0.1F) + .sound(SoundType.WOOL) + .noOcclusion() + .randomTicks()); this.registerDefaultState(defaultBlockState().setValue(FULLNESS, 0)); } @@ -57,23 +63,28 @@ public class SilkMothHiveBlock extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } - + @Override + @SuppressWarnings("deprecation") public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } @Override + @SuppressWarnings("deprecation") public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = state.getValue(FACING); BlockPos spawn = pos.relative(dir); if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -86,10 +97,11 @@ public class SilkMothHiveBlock extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 2d13649d..71715b0d 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -41,14 +37,18 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; -public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class SilkMothNestBlock extends BaseBlock implements RenderLayerProvider { public static final BooleanProperty ACTIVE = EndBlockProperties.ACTIVE; public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = EndBlockProperties.FULLNESS; @@ -56,7 +56,12 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { private static final VoxelShape BOTTOM = box(0, 0, 0, 16, 16, 16); public SilkMothNestBlock() { - super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); + super(FabricBlockSettings.of(Material.WOOL) + .hardness(0.5F) + .resistance(0.1F) + .sound(SoundType.WOOL) + .noOcclusion() + .randomTicks()); this.registerDefaultState(defaultBlockState().setValue(ACTIVE, true).setValue(FULLNESS, 0)); } @@ -66,10 +71,11 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(ACTIVE) ? BOTTOM : TOP; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; @@ -82,9 +88,11 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!state.getValue(ACTIVE)) { - if (canSupportCenter(world, pos.above(), Direction.DOWN) || world.getBlockState(pos.above()).is(BlockTags.LEAVES)) { + if (canSupportCenter(world, pos.above(), Direction.DOWN) || world.getBlockState(pos.above()) + .is(BlockTags.LEAVES)) { return state; } else { @@ -95,11 +103,13 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } @Override + @SuppressWarnings("deprecation") public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); } - + @Override + @SuppressWarnings("deprecation") public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } @@ -122,6 +132,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } @Override + @SuppressWarnings("deprecation") public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (!state.getValue(ACTIVE)) { return; @@ -134,7 +145,9 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -147,10 +160,11 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } @Override + @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 2bc6059b..290b35c1 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; @@ -9,6 +7,9 @@ import net.minecraft.world.level.Level; 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.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -17,6 +18,9 @@ import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Optional; +import java.util.Random; + public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); @@ -29,7 +33,8 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { - if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { + if (((Feature)EndFeatures.GIGANTIC_AMARANITA.getFeature()) + .place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, bigPos, null))) { replaceMushroom(world, bigPos); replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.east()); @@ -37,7 +42,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return; } - EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); + ((Feature)EndFeatures.LARGE_AMARANITA.getFeature()).place( new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos, null)); } @Override @@ -59,10 +64,8 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } private boolean checkFrame(ServerLevel world, BlockPos pos) { - return world.getBlockState(pos).is(this) && - world.getBlockState(pos.south()).is(this) && - world.getBlockState(pos.east()).is(this) && - world.getBlockState(pos.south().east()).is(this); + return world.getBlockState(pos).is(this) && world.getBlockState(pos.south()).is(this) && world.getBlockState(pos + .east()).is(this) && world.getBlockState(pos.south().east()).is(this); } private void replaceMushroom(ServerLevel world, BlockPos pos) { diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 60aac3b5..cda6ec18 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -1,12 +1,9 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -23,6 +20,9 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; +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.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -32,21 +32,23 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.BlocksHelper; +import ru.betterend.interfaces.PottablePlant; import ru.betterend.registry.EndFeatures; -public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderTyped, BonemealableBlock { +import java.util.EnumMap; +import java.util.List; +import java.util.Optional; +import java.util.Random; + +public class SmallJellyshroomBlock extends BaseAttachedBlock implements RenderLayerProvider, BonemealableBlock, PottablePlant { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public SmallJellyshroomBlock() { - super(FabricBlockSettings.of(Material.PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.NETHER_WART) - .noCollission()); + super(FabricBlockSettings.of(Material.PLANT).breakByHand(true).sound(SoundType.NETHER_WART).noCollission()); } - + @Override @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { @@ -56,7 +58,10 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel( + Enchantments.SILK_TOUCH, + tool + ) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { @@ -85,20 +90,31 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT BOUNDING_SHAPES.put(Direction.WEST, Shapes.box(0.5, 0.0, 0.0, 1.0, 1.0, 1.0)); BOUNDING_SHAPES.put(Direction.EAST, Shapes.box(0.0, 0.0, 0.0, 0.5, 1.0, 1.0)); } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { - return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).is(TagAPI.END_GROUND); + return state.getValue(FACING) == Direction.UP && world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND); } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(16) == 0; } - + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); + ((Feature)EndFeatures.JELLYSHROOM.getFeature()).place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos, null)); + } + + @Override + public boolean canPlantOn(Block block) { + return true; + } + + @Override + @Environment(EnvType.CLIENT) + public String getPottedState() { + return "facing=up"; } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java index c99d5e79..8437e0cd 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -4,16 +4,16 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; -import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.betterend.blocks.basis.LitPillarBlock; -public class SmaragdantCrystalBlock extends BaseRotatedPillarBlock { +public class SmaragdantCrystalBlock extends LitPillarBlock { public SmaragdantCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) - .breakByTool(FabricToolTags.PICKAXES) - .luminance(15) - .hardness(1F) - .resistance(1F) - .noOcclusion() - .sound(SoundType.GLASS)); + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .hardness(1F) + .resistance(1F) + .noOcclusion() + .sound(SoundType.AMETHYST)); } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index a4bb26d2..8a078097 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.EnumMap; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -30,21 +27,23 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; + +import java.util.EnumMap; @SuppressWarnings("deprecation") -public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IRenderTyped, SimpleWaterloggedBlock, LiquidBlockContainer { +public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements RenderLayerProvider, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public SmaragdantCrystalShardBlock() { super(FabricBlockSettings.of(Material.STONE) - .materialColor(MaterialColor.COLOR_GREEN) - .breakByTool(FabricToolTags.PICKAXES) - .luminance(15) - .sound(SoundType.GLASS) - .requiresCorrectToolForDrops() - .noCollission()); + .materialColor(MaterialColor.COLOR_GREEN) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .sound(SoundType.AMETHYST_CLUSTER) + .requiresCorrectToolForDrops() + .noCollission()); } @Override @@ -62,7 +61,7 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); } - + @Override public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index 7d6c0727..7f6a683d 100644 --- a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -1,12 +1,7 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -36,24 +31,28 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; + @SuppressWarnings("deprecation") -public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyped, SimpleWaterloggedBlock, LiquidBlockContainer { +public class SulphurCrystalBlock extends BaseAttachedBlock implements RenderLayerProvider, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 2); public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public SulphurCrystalBlock() { super(FabricBlockSettings.of(Material.STONE) - .materialColor(MaterialColor.COLOR_YELLOW) - .breakByTool(FabricToolTags.PICKAXES) - .sound(SoundType.GLASS) - .requiresCorrectToolForDrops() - .noCollission()); + .materialColor(MaterialColor.COLOR_YELLOW) + .breakByTool(FabricToolTags.PICKAXES) + .sound(SoundType.GLASS) + .requiresCorrectToolForDrops() + .noCollission()); } @Override @@ -69,14 +68,17 @@ public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyp @Override public List getDrops(BlockState state, LootContext.Builder builder) { - return state.getValue(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); + return state.getValue(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack( + EndItems.CRYSTALLINE_SULPHUR, + MHelper.randRange(1, 3, MHelper.RANDOM) + )); } @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); } - + @Override public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); diff --git a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index 775878b6..c5337047 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.color.block.BlockColor; @@ -13,24 +11,27 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseVineBlock; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.registry.EndParticles; -public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider { +import java.util.Random; + +public class TenaneaFlowersBlock extends BaseVineBlock implements CustomColorProvider { public static final Vec3i[] COLORS; public TenaneaFlowersBlock() { super(15); } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> { if (pos == null) { pos = BlockPos.ZERO; - }; + } + ; long i = (MHelper.getRandom(pos.getX(), pos.getZ()) & 63) + pos.getY(); double delta = i * 0.1; int index = MHelper.floor(delta); @@ -49,7 +50,7 @@ public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider return ColorUtil.HSBtoRGB(hsb[0], MHelper.max(0.5F, hsb[1]), hsb[2]); }; } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> ColorUtil.color(255, 255, 255); diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index 9928dcc6..b56c1cfc 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -2,24 +2,24 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class TenaneaSaplingBlock extends FeatureSaplingBlock { +public class TenaneaSaplingBlock extends PottableFeatureSapling { public TenaneaSaplingBlock() { - super(); - } - - @Override - protected Feature getFeature() { - return EndFeatures.TENANEA.getFeature(); + super((state)->EndFeatures.TENANEA.getFeature()); } @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.PINK_MOSS); } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.PINK_MOSS; + } } diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index 090b3b15..3d7d62ab 100644 --- a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -14,7 +14,7 @@ public class TerrainPlantBlock extends EndPlantBlock { @Override protected boolean isTerrain(BlockState state) { - for (Block block: ground) { + for (Block block : ground) { if (state.is(block)) { return true; } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java index 9fc3ffa2..8a5061d6 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -14,6 +12,8 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class TwistedUmbrellaMossBlock extends EndPlantBlock { public TwistedUmbrellaMossBlock() { super(11); @@ -25,24 +25,25 @@ public class TwistedUmbrellaMossBlock extends EndPlantBlock { } @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } - - @Override + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return world.isEmptyBlock(pos.above()); } - - @Override + + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); - BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().setValue(BaseDoublePlantBlock.ROTATION, rot); + int rot = world.random.nextInt(4); + BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState() + .setValue(BaseDoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(BaseDoublePlantBlock.TOP, true)); } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index b33c8235..c63d7d5b 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; @@ -10,6 +8,8 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class TwistedUmbrellaMossTallBlock extends BaseDoublePlantBlock { public TwistedUmbrellaMossTallBlock() { super(12); @@ -17,7 +17,13 @@ public class TwistedUmbrellaMossTallBlock extends BaseDoublePlantBlock { @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); + ItemEntity item = new ItemEntity( + world, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS) + ); world.addFreshEntity(item); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java index 44525319..c8ebca8a 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -14,6 +12,8 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaMossBlock extends EndPlantBlock { public UmbrellaMossBlock() { super(11); @@ -25,23 +25,23 @@ public class UmbrellaMossBlock extends EndPlantBlock { } @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } - - @Override + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return world.isEmptyBlock(pos.above()); } - - @Override + + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); + int rot = world.random.nextInt(4); BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().setValue(BaseDoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(BaseDoublePlantBlock.TOP, true)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index 18d15ee2..36dfa686 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; @@ -10,6 +8,8 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaMossTallBlock extends BaseDoublePlantBlock { public UmbrellaMossTallBlock() { super(12); @@ -17,7 +17,13 @@ public class UmbrellaMossTallBlock extends BaseDoublePlantBlock { @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); + ItemEntity item = new ItemEntity( + world, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + new ItemStack(EndBlocks.UMBRELLA_MOSS) + ); world.addFreshEntity(item); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index a8d3dcb0..3993962f 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -27,9 +27,11 @@ public class UmbrellaTreeClusterBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public UmbrellaTreeClusterBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) - .materialColor(MaterialColor.COLOR_PURPLE) - .luminance(15)); + super(FabricBlockSettings + .copyOf(Blocks.NETHER_WART_BLOCK) + .mapColor(MaterialColor.COLOR_PURPLE) + .luminance(15) + ); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } @@ -39,6 +41,7 @@ public class UmbrellaTreeClusterBlock extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { ItemStack stack = player.getMainHandItem(); if (stack.getItem() == Items.GLASS_BOTTLE) { @@ -47,8 +50,21 @@ public class UmbrellaTreeClusterBlock extends BaseBlock { } stack = new ItemStack(EndItems.UMBRELLA_CLUSTER_JUICE); player.addItem(stack); - world.playLocalSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS, 1, 1, false); - BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().setValue(NATURAL, state.getValue(NATURAL))); + world.playLocalSound( + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + SoundEvents.BOTTLE_FILL, + SoundSource.BLOCKS, + 1, + 1, + false + ); + BlocksHelper.setWithUpdate( + world, + pos, + EndBlocks.UMBRELLA_TREE_CLUSTER_EMPTY.defaultBlockState().setValue(NATURAL, state.getValue(NATURAL)) + ); return InteractionResult.SUCCESS; } return InteractionResult.FAIL; diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index d6569aa3..084ac2b9 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -15,13 +13,17 @@ import ru.bclib.blocks.BaseBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL; public UmbrellaTreeClusterEmptyBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) - .materialColor(MaterialColor.COLOR_PURPLE) - .randomTicks()); + super(FabricBlockSettings + .copyOf(Blocks.NETHER_WART_BLOCK) + .mapColor(MaterialColor.COLOR_PURPLE) + .randomTicks() + ); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } @@ -31,9 +33,14 @@ public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { } @Override + @SuppressWarnings("deprecation") public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (state.getValue(NATURAL) && random.nextInt(16) == 0) { - BlocksHelper.setWithUpdate(world, pos, EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().setValue(UmbrellaTreeClusterBlock.NATURAL, true)); + BlocksHelper.setWithUpdate( + world, + pos, + EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().setValue(UmbrellaTreeClusterBlock.NATURAL, true) + ); } } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 67ad0a06..7eaca069 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -22,14 +18,17 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.storage.loot.LootContext; -import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.BlockModelProvider; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; -public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTyped, BlockModelProvider { +import java.util.Collections; +import java.util.List; + +public class UmbrellaTreeMembraneBlock extends SlimeBlock implements RenderLayerProvider, BlockModelProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); @@ -56,15 +55,17 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType } @Override + @SuppressWarnings("deprecation") public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(COLOR) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { - return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections.emptyList(); + return MHelper.RANDOM.nextInt(4) == 0 ? Lists.newArrayList(new ItemStack(EndBlocks.UMBRELLA_TREE_SAPLING)) : Collections + .emptyList(); } } - + @Override public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { return state.getValue(COLOR) > 0; @@ -79,8 +80,9 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType return false; } } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index 652b0b83..0ff48c93 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -2,23 +2,18 @@ package ru.betterend.blocks; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.blocks.FeatureSaplingBlock; import ru.bclib.client.render.BCLRenderLayer; +import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; -public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { +public class UmbrellaTreeSaplingBlock extends PottableFeatureSapling { public UmbrellaTreeSaplingBlock() { - super(); + super((state)-> EndFeatures.UMBRELLA_TREE.getFeature()); } - @Override - protected Feature getFeature() { - return EndFeatures.UMBRELLA_TREE.getFeature(); - } - @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); @@ -28,4 +23,9 @@ public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } + + @Override + public boolean canPlantOn(Block block) { + return block == EndBlocks.JUNGLE_MOSS; + } } diff --git a/src/main/java/ru/betterend/blocks/VanillaBlockProperties.java b/src/main/java/ru/betterend/blocks/VanillaBlockProperties.java deleted file mode 100644 index 1afa178f..00000000 --- a/src/main/java/ru/betterend/blocks/VanillaBlockProperties.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.betterend.blocks; - -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -public class VanillaBlockProperties { - public static final BooleanProperty ROOTS = BooleanProperty.create("roots"); -} diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index e58333b7..3ea9dc38 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -9,9 +7,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -32,34 +33,41 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Optional; +import java.util.Random; + public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer { public VentBubbleColumnBlock() { super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).noOcclusion().noCollission().noDrops()); } - + @Override - public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + public ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); - return Fluids.WATER; + return new ItemStack(Items.WATER_BUCKET); } @Override + @SuppressWarnings("deprecation") public RenderShape getRenderShape(BlockState state) { return RenderShape.INVISIBLE; } - + @Override + @SuppressWarnings("deprecation") public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState blockState = world.getBlockState(pos.below()); return blockState.is(this) || blockState.is(EndBlocks.HYDROTHERMAL_VENT); } - + @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { return Shapes.empty(); } - + @Override + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if (!state.canSurvive(world, pos)) { return Blocks.WATER.defaultBlockState(); @@ -68,12 +76,12 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, this); - world.getBlockTicks().scheduleTick(up, this, 5); + world.scheduleTick(up, this, 5); } } return state; } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (random.nextInt(4) == 0) { @@ -83,21 +91,51 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid world.addAlwaysVisibleParticle(ParticleTypes.BUBBLE_COLUMN_UP, px, py, pz, 0, 0.04, 0); } if (random.nextInt(200) == 0) { - world.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BUBBLE_COLUMN_UPWARDS_AMBIENT, SoundSource.BLOCKS, 0.2F + random.nextFloat() * 0.2F, 0.9F + random.nextFloat() * 0.15F, false); + world.playLocalSound( + pos.getX(), + pos.getY(), + pos.getZ(), + SoundEvents.BUBBLE_COLUMN_UPWARDS_AMBIENT, + SoundSource.BLOCKS, + 0.2F + random.nextFloat() * 0.2F, + 0.9F + random.nextFloat() * 0.15F, + false + ); } } - + @Environment(EnvType.CLIENT) + @SuppressWarnings("deprecation") public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { BlockState blockState = world.getBlockState(pos.above()); if (blockState.isAir()) { entity.onAboveBubbleCol(false); if (!world.isClientSide) { ServerLevel serverWorld = (ServerLevel) world; - + for (int i = 0; i < 2; ++i) { - serverWorld.sendParticles(ParticleTypes.SPLASH, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); - serverWorld.sendParticles(ParticleTypes.BUBBLE, (double) pos.getX() + world.random.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() + world.random.nextDouble(), 1, 0.0D, 0.01D, 0.0D, 0.2D); + serverWorld.sendParticles( + ParticleTypes.SPLASH, + (double) pos.getX() + world.random.nextDouble(), + (double) (pos.getY() + 1), + (double) pos.getZ() + world.random.nextDouble(), + 1, + 0.0D, + 0.0D, + 0.0D, + 1.0D + ); + serverWorld.sendParticles( + ParticleTypes.BUBBLE, + (double) pos.getX() + world.random.nextDouble(), + (double) (pos.getY() + 1), + (double) pos.getZ() + world.random.nextDouble(), + 1, + 0.0D, + 0.01D, + 0.0D, + 0.2D + ); } } } @@ -110,14 +148,21 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } - + @Override public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } @Override + @SuppressWarnings("deprecation") public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } + + + @Override + public Optional getPickupSound() { + return Fluids.WATER.getPickupSound(); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 893bbf2f..4bcf5664 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -1,120 +1,22 @@ package ru.betterend.blocks.basis; -import java.util.List; -import java.util.Objects; - -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.AnvilBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.storage.loot.LootContext; -import ru.bclib.blocks.BaseAnvilBlock; -import ru.betterend.blocks.complex.MetalMaterial; -import ru.betterend.item.EndAnvilItem; +import ru.bclib.blocks.LeveledAnvilBlock; +import ru.betterend.complexmaterials.MetalMaterial; -public class EndAnvilBlock extends BaseAnvilBlock { - - protected final int level; - protected IntegerProperty durability; +public class EndAnvilBlock extends LeveledAnvilBlock { protected MetalMaterial metalMaterial; - protected int maxDurability; public EndAnvilBlock(MaterialColor color, int level) { - super(color); - this.level = level; + super(color, level); } - + public EndAnvilBlock(MetalMaterial metalMaterial, MaterialColor color, int level) { - this(color, level); + super(color, level); this.metalMaterial = metalMaterial; } - - public int getDurability(BlockState blockState) { - Block anvilBlock = blockState.getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - blockState.getValue(durability); - } - return 0; - } - - public IntegerProperty getDurability() { - if (durability == null) { - this.maxDurability = 5; - this.durability = IntegerProperty.create("durability", 0, maxDurability); - } - return durability; - } - - public int getMaxDurability() { - return maxDurability; - } - - @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - List drops = super.getDrops(state, builder); - ItemStack itemStack = drops.get(0); - itemStack.getOrCreateTag().putInt(EndAnvilItem.DURABILITY, state.getValue(durability)); - return drops; - } - - @Override - @SuppressWarnings("deprecation") - public Item asItem() { - if (metalMaterial != null) { - return metalMaterial.anvilItem; - } - return Item.byBlock(this); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext blockPlaceContext) { - return Objects.requireNonNull(super.getStateForPlacement(blockPlaceContext)).setValue(durability, maxDurability); - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(getDurability()); - } public int getCraftingLevel() { return level; } - - public static BlockState applyDamage(BlockState blockState) { - Block anvilBlock = blockState.getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - EndAnvilBlock endAnvilBlock = (EndAnvilBlock) anvilBlock; - IntegerProperty durability = endAnvilBlock.getDurability(); - int damage = blockState.getValue(durability) - 1; - if (damage > 0) { - return blockState.setValue(durability, damage); - } - int maxDurability = endAnvilBlock.getMaxDurability(); - blockState = blockState.setValue(durability, maxDurability); - } - return getDamagedState(blockState); - } - - private static BlockState getDamagedState(BlockState fallingState) { - Block anvilBlock = fallingState.getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - IntegerProperty destructionProperty = EndAnvilBlock.DESTRUCTION; - int destruction = fallingState.getValue(destructionProperty) + 1; - if (destructionProperty.getPossibleValues().contains(destruction)) { - try { - return fallingState.setValue(destructionProperty, destruction); - } catch (Exception ex) { - return null; - } - } - return null; - } - return AnvilBlock.damage(fallingState); - } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f66fa6dc..065444ed 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -1,7 +1,7 @@ package ru.betterend.blocks.basis; -import java.util.Map; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -26,6 +26,8 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; +import java.util.Map; + @SuppressWarnings("deprecation") public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; @@ -99,7 +101,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { Boolean water = state.getValue(WATERLOGGED); if (water) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } if (!canSurvive(state, world, pos)) { return water ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); @@ -113,7 +115,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; } - + @Override public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; @@ -123,12 +125,12 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - + @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String floor = blockState.getValue(IS_FLOOR) ? "_floor" : ""; - ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), - "block/" + stateId.getPath() + floor); + ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), "block/" + stateId.getPath() + floor); registerBlockModel(stateId, modelId, blockState, modelCache); return ModelsHelper.createBlockSimple(modelId); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java index 9219a55f..9a064a4e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantBlock.java @@ -1,33 +1,44 @@ package ru.betterend.blocks.basis; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BasePlantBlock; +import ru.betterend.interfaces.PottablePlant; -public class EndPlantBlock extends BasePlantBlock { - +public class EndPlantBlock extends BasePlantBlock implements PottablePlant { public EndPlantBlock() { this(false); } - + public EndPlantBlock(int light) { this(false, light); } - + public EndPlantBlock(boolean replaceable) { super(replaceable); } - + public EndPlantBlock(boolean replaceable, int light) { super(replaceable, light); } - + public EndPlantBlock(Properties settings) { super(settings); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); + } + + @Override + public boolean canPlantOn(Block block) { + return isTerrain(block.defaultBlockState()); + } + + @Override + public boolean canBePotted() { + return getStateDefinition().getProperties().isEmpty(); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index c3d2045b..1519d471 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -5,15 +5,16 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BasePlantWithAgeBlock; public abstract class EndPlantWithAgeBlock extends BasePlantWithAgeBlock { - - public EndPlantWithAgeBlock() {} - + + public EndPlantWithAgeBlock() { + } + public EndPlantWithAgeBlock(Properties settings) { super(settings); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java index 80af5145..be224b9c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java @@ -3,8 +3,9 @@ package ru.betterend.blocks.basis; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseTerrainBlock; +import ru.betterend.interfaces.PottableTerrain; -public class EndTerrainBlock extends BaseTerrainBlock { +public class EndTerrainBlock extends BaseTerrainBlock implements PottableTerrain { public EndTerrainBlock(MaterialColor color) { super(Blocks.END_STONE, color); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndTripleTerrain.java b/src/main/java/ru/betterend/blocks/basis/EndTripleTerrain.java index f47bbe88..10d4d7b1 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndTripleTerrain.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTripleTerrain.java @@ -3,9 +3,9 @@ package ru.betterend.blocks.basis; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.TripleTerrainBlock; +import ru.betterend.interfaces.PottableTerrain; -public class EndTripleTerrain extends TripleTerrainBlock { - +public class EndTripleTerrain extends TripleTerrainBlock implements PottableTerrain { public EndTripleTerrain(MaterialColor color) { super(Blocks.END_STONE, color); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java index 747095d2..a3acf2d2 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java @@ -5,19 +5,20 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.UnderwaterPlantBlock; public class EndUnderwaterPlantBlock extends UnderwaterPlantBlock { - - public EndUnderwaterPlantBlock() {} - + + public EndUnderwaterPlantBlock() { + } + public EndUnderwaterPlantBlock(int light) { super(light); } - + public EndUnderwaterPlantBlock(Properties settings) { super(settings); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index 59bb034d..9a23df46 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -5,19 +5,20 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseUnderwaterWallPlantBlock; public class EndUnderwaterWallPlantBlock extends BaseUnderwaterWallPlantBlock { - - public EndUnderwaterWallPlantBlock() {} - + + public EndUnderwaterWallPlantBlock() { + } + public EndUnderwaterWallPlantBlock(int light) { super(light); } - + public EndUnderwaterWallPlantBlock(Properties settings) { super(settings); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallMushroom.java b/src/main/java/ru/betterend/blocks/basis/EndWallMushroom.java index fed2b359..6faeaf88 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallMushroom.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallMushroom.java @@ -5,13 +5,13 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.WallMushroomBlock; public class EndWallMushroom extends WallMushroomBlock { - + public EndWallMushroom(int light) { super(light); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java index 35288cbf..46fdba5c 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -5,18 +5,19 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseWallPlantBlock; public class EndWallPlantBlock extends BaseWallPlantBlock { - public EndWallPlantBlock() {} - + public EndWallPlantBlock() { + } + public EndWallPlantBlock(int light) { super(light); } - + public EndWallPlantBlock(Properties settings) { super(settings); } - + @Override protected boolean isTerrain(BlockState state) { - return state.is(TagAPI.END_GROUND); + return state.is(TagAPI.BLOCK_END_GROUND); } } diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 0514f5b5..951e8278 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -1,11 +1,7 @@ package ru.betterend.blocks.basis; -import java.util.EnumMap; -import java.util.List; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -23,38 +19,45 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.interfaces.RenderLayerProvider; import ru.bclib.util.MHelper; -public class FurBlock extends BaseAttachedBlock implements IRenderTyped { +import java.util.EnumMap; +import java.util.List; + +public class FurBlock extends BaseAttachedBlock implements RenderLayerProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); private final ItemLike drop; private final int dropChance; public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .luminance(light) - .sound(wet ? SoundType.WET_GRASS : SoundType.GRASS) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .luminance(light) + .sound(wet ? SoundType.WET_GRASS : SoundType.GRASS) + .noCollission()); this.drop = drop; this.dropChance = dropChance; + TagAPI.addTags(this, TagAPI.BLOCK_LEAVES); } public FurBlock(ItemLike drop, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) - .breakByTool(FabricToolTags.SHEARS) - .breakByHand(true) - .sound(SoundType.GRASS) - .noCollission()); + .breakByTool(FabricToolTags.SHEARS) + .breakByHand(true) + .sound(SoundType.GRASS) + .noCollission()); this.drop = drop; this.dropChance = dropChance; + TagAPI.addTags(this, TagAPI.BLOCK_LEAVES); } - + @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } @@ -62,7 +65,10 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel( + Enchantments.SILK_TOUCH, + tool + ) > 0) { return Lists.newArrayList(new ItemStack(this)); } else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { diff --git a/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java b/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java new file mode 100644 index 00000000..af09b680 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import ru.bclib.blocks.BaseBlock; + +public class LitBaseBlock extends BaseBlock { + private static final String PATTERN = "{\"parent\":\"betterend:block/cube_noshade\",\"textures\":{\"texture\":\"betterend:block/name\"}}"; + + public LitBaseBlock(Properties settings) { + super(settings); + } + + @Nullable + @Override + @Environment(EnvType.CLIENT) + public BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + return BlockModel.fromString(PATTERN.replace("name", resourceLocation.getPath())); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java new file mode 100644 index 00000000..d09a9c40 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java @@ -0,0 +1,23 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.blocks.BaseRotatedPillarBlock; + +import java.util.Optional; + +public class LitPillarBlock extends BaseRotatedPillarBlock { + private static final String PATTERN = "{\"parent\":\"betterend:block/pillar_noshade\",\"textures\":{\"end\":\"betterend:block/name_top\",\"side\":\"betterend:block/name_side\"}}"; + + public LitPillarBlock(Properties settings) { + super(settings); + } + + @Override + @Environment(EnvType.CLIENT) + protected Optional createBlockPattern(ResourceLocation blockId) { + String name = blockId.getPath(); + return Optional.of(PATTERN.replace("name", name)); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 886e8435..597e7de4 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -1,15 +1,9 @@ package ru.betterend.blocks.basis; -import java.awt.Point; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - +import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; @@ -40,6 +34,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; @@ -49,10 +44,14 @@ import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; -import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; -@SuppressWarnings({"deprecation"}) +import java.awt.Point; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.ToIntFunction; + public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { public final static EnumProperty STATE = EndBlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = EndBlockProperties.HAS_ITEM; @@ -65,39 +64,29 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { private static final VoxelShape SHAPE_COLUMN_TOP; private static final VoxelShape SHAPE_BOTTOM; - /** - * - * Register new Pedestal block with Better End mod id. - * - * @param name pedestal name - * @param source source block - * @return new Pedestal block with Better End id. - */ - public static Block registerPedestal(String name, Block source) { - return EndBlocks.registerBlock(name, new PedestalBlock(source)); - } - - /** - * - * Register new Pedestal block with specified mod id. - * - * @param id pedestal id - * @param source source block - * @return new Pedestal block with specified id. - */ - public static Block registerPedestal(ResourceLocation id, Block source) { - return EndBlocks.registerBlock(id, new PedestalBlock(source)); - } - protected final Block parent; protected float height = 1.0F; public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); - this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); + super(FabricBlockSettings.copyOf(parent).luminance(getLuminance(parent.defaultBlockState()))); + this.registerDefaultState( + stateDefinition + .any() + .setValue(STATE, PedestalState.DEFAULT) + .setValue(HAS_ITEM, false) + .setValue(HAS_LIGHT, false) + ); this.parent = parent; } + private static ToIntFunction getLuminance(BlockState parent) { + final int light = parent.getLightEmission(); + if (light > 0) { + return state -> light; + } + return state -> state.getValue(HAS_LIGHT) ? 12 : 0; + } + public float getHeight(BlockState state) { if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; @@ -106,38 +95,40 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override - @Deprecated - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if (world.isClientSide || !state.is(this)) return InteractionResult.CONSUME; - if (!isPlaceable(state)) { + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (!state.is(this) || !isPlaceable(state)) { return InteractionResult.PASS; } - BlockEntity blockEntity = world.getBlockEntity(pos); + BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { ItemStack itemStack = player.getItemInHand(hand); if (itemStack.isEmpty()) return InteractionResult.CONSUME; pedestal.setItem(0, itemStack); - checkRitual(world, pos); - return InteractionResult.SUCCESS; - } else { + level.blockEntityChanged(pos); + checkRitual(level, pos); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + else { ItemStack itemStack = pedestal.getItem(0); if (player.addItem(itemStack)) { pedestal.removeItemNoUpdate(0); - checkRitual(world, pos); - return InteractionResult.SUCCESS; + level.blockEntityChanged(pos); + checkRitual(level, pos); + return InteractionResult.sidedSuccess(level.isClientSide()); } return InteractionResult.FAIL; } } return InteractionResult.PASS; } - + @Override public void destroy(LevelAccessor levelAccessor, BlockPos blockPos, BlockState blockState) { MutableBlockPos posMutable = new MutableBlockPos(); - for (Point point: InfusionRitual.getMap()) { + for (Point point : InfusionRitual.getMap()) { posMutable.set(blockPos).move(point.x, 0, point.y); BlockState state = levelAccessor.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -152,10 +143,10 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } } } - + public void checkRitual(Level world, BlockPos pos) { MutableBlockPos posMutable = new MutableBlockPos(); - for (Point point: InfusionRitual.getMap()) { + for (Point point : InfusionRitual.getMap()) { posMutable.set(pos).move(point.x, 0, point.y); BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -177,20 +168,24 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { return defaultBlockState().setValue(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + } + else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { return defaultBlockState().setValue(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { + } + else if (hasPedestalUnder && hasPedestalOver) { return defaultBlockState().setValue(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { + } + else if (hasPedestalUnder) { return defaultBlockState().setValue(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { + } + else if (hasPedestalOver) { return defaultBlockState().setValue(STATE, PedestalState.BOTTOM); } return defaultBlockState(); } @Override - @Deprecated + @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { BlockState updated = getUpdatedState(state, direction, newState, world, pos, posFrom); if (!updated.is(this)) return updated; @@ -211,21 +206,27 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (direction == Direction.UP) { upSideSolid = newState.isFaceSturdy(world, posFrom, Direction.DOWN) || newState.is(BlockTags.WALLS); hasPedestalOver = newState.getBlock() instanceof PedestalBlock; - } else { + } + else { hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; } BlockState updatedState; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { updatedState = state.setValue(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + } + else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { updatedState = state.setValue(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { + } + else if (hasPedestalUnder && hasPedestalOver) { updatedState = state.setValue(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { + } + else if (hasPedestalUnder) { updatedState = state.setValue(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { + } + else if (hasPedestalOver) { updatedState = state.setValue(STATE, PedestalState.BOTTOM); - } else { + } + else { updatedState = state.setValue(STATE, PedestalState.DEFAULT); } if (!isPlaceable(updatedState)) { @@ -246,7 +247,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { drop.add(pedestal.getItem(0)); } } - } else { + } + else { return drop; } } @@ -268,18 +270,23 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { BlockState state = world.getBlockState(pos); if (!state.is(this)) { dropStoredStack(blockEntity, stack, pos); - } else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { + } + else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { moveStoredStack(blockEntity, world, stack, pos.above()); - } else if (!isPlaceable(state)) { + } + else if (!isPlaceable(state)) { dropStoredStack(blockEntity, stack, pos); - } else if (blockEntity instanceof PedestalBlockEntity) { + } + else if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { pedestal.setItem(0, stack); - } else { + } + else { dropStoredStack(blockEntity, stack, pos); } - } else { + } + else { dropStoredStack(blockEntity, stack, pos); } } @@ -299,7 +306,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (world.getBlockState(pos.above()).isAir()) { return pos.above(); } - for(int i = 2; i < Direction.values().length; i++) { + for (int i = 2; i < Direction.values().length; i++) { dropPos = pos.relative(Direction.from3DDataValue(i)); if (world.getBlockState(dropPos).isAir()) { return dropPos.immutable(); @@ -311,15 +318,14 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { public boolean isPlaceable(BlockState state) { if (!state.is(this)) return false; PedestalState currentState = state.getValue(STATE); - return currentState == PedestalState.DEFAULT || - currentState == PedestalState.PEDESTAL_TOP; + return currentState == PedestalState.DEFAULT || currentState == PedestalState.PEDESTAL_TOP; } @Override - @Deprecated + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch(state.getValue(STATE)) { + switch (state.getValue(STATE)) { case BOTTOM: { return SHAPE_BOTTOM; } @@ -347,34 +353,36 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); } - + @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new PedestalBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new PedestalBlockEntity(blockPos, blockState); } - + public boolean hasUniqueEntity() { return false; } @Override - @Deprecated + @SuppressWarnings("deprecation") public boolean hasAnalogOutputSignal(BlockState state) { return state.getBlock() instanceof PedestalBlock; } @Override - @Deprecated + @SuppressWarnings("deprecation") public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { return state.getValue(HAS_ITEM) ? 15 : 0; } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return getBlockModel(blockId, defaultBlockState()); } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = createTexturesMap(); PedestalState state = blockState.getValue(STATE); @@ -395,33 +403,34 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { case PILLAR: pattern = Patterns.createJson(Patterns.BLOCK_PEDESTAL_PILLAR, textures); break; - default: break; + default: + break; } return ModelsHelper.fromPattern(pattern); } - + @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { PedestalState state = blockState.getValue(STATE); - ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), - "block/" + stateId.getPath() + "_" + state); + ResourceLocation modelId = new ResourceLocation( + stateId.getNamespace(), + "block/" + stateId.getPath() + "_" + state + ); registerBlockModel(stateId, modelId, blockState, modelCache); return ModelsHelper.createBlockSimple(modelId); } - + protected Map createTexturesMap() { ResourceLocation blockId = Registry.BLOCK.getKey(parent); String name = blockId.getPath(); - return new HashMap() { - private static final long serialVersionUID = 1L; - { - put("%mod%", blockId.getNamespace() ); - put("%top%", name + "_top"); - put("%base%", name + "_base"); - put("%pillar%", name + "_pillar"); - put("%bottom%", name + "_bottom"); - } - }; + Map textures = Maps.newHashMap(); + textures.put("%mod%", blockId.getNamespace()); + textures.put("%top%", name + "_top"); + textures.put("%base%", name + "_base"); + textures.put("%pillar%", name + "_pillar"); + textures.put("%bottom%", name + "_bottom"); + return textures; } static { @@ -442,4 +451,10 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { SHAPE_COLUMN = Shapes.or(basin, SHAPE_PILLAR, columnTop); SHAPE_BOTTOM = Shapes.or(basin, SHAPE_PILLAR); } + + /*@Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return level.isClientSide() ? PedestalBlockEntity::tick : null; + }*/ } diff --git a/src/main/java/ru/betterend/blocks/basis/PottableCropBlock.java b/src/main/java/ru/betterend/blocks/basis/PottableCropBlock.java new file mode 100644 index 00000000..13978e19 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/PottableCropBlock.java @@ -0,0 +1,30 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import ru.bclib.blocks.BaseCropBlock; +import ru.betterend.interfaces.PottablePlant; + +public class PottableCropBlock extends BaseCropBlock implements PottablePlant { + private final Block[] terrain; + + public PottableCropBlock(Item drop, Block... terrain) { + super(drop, terrain); + this.terrain = terrain; + } + + @Override + public boolean canPlantOn(Block block) { + for (Block ter : terrain) { + if (block == ter) { + return true; + } + } + return false; + } + + @Override + public String getPottedState() { + return "age=3"; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java b/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java new file mode 100644 index 00000000..b8dc1fb4 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java @@ -0,0 +1,18 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import ru.bclib.blocks.FeatureSaplingBlock; +import ru.betterend.interfaces.PottablePlant; + +import java.util.function.Function; + +public abstract class PottableFeatureSapling extends FeatureSaplingBlock implements PottablePlant { + public PottableFeatureSapling(Function> featureSupplier) { + super(featureSupplier); + } + + public PottableFeatureSapling(int light, Function> featureSupplier) { + super(light, featureSupplier); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PottableLeavesBlock.java b/src/main/java/ru/betterend/blocks/basis/PottableLeavesBlock.java new file mode 100644 index 00000000..24382dd7 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/PottableLeavesBlock.java @@ -0,0 +1,25 @@ +package ru.betterend.blocks.basis; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.MaterialColor; +import ru.bclib.blocks.BaseLeavesBlock; +import ru.betterend.interfaces.PottablePlant; + +public class PottableLeavesBlock extends BaseLeavesBlock implements PottablePlant { + + public PottableLeavesBlock(Block sapling, MaterialColor color) { + super(sapling, color); + } + + public PottableLeavesBlock(Block sapling, MaterialColor color, int light) { + super(sapling, color, light); + } + + @Override + public boolean canPlantOn(Block block) { + if (sapling instanceof PottablePlant) { + return ((PottablePlant) sapling).canPlantOn(block); + } + return true; + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b7319079..69ccbdd7 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -1,9 +1,7 @@ package ru.betterend.blocks.basis; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -15,12 +13,15 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.betterend.client.models.Patterns; import ru.betterend.registry.EndBlocks; -public class StoneLanternBlock extends EndLanternBlock implements IColorProvider { +import java.util.Optional; + +public class StoneLanternBlock extends EndLanternBlock implements CustomColorProvider { private static final VoxelShape SHAPE_CEIL = Block.box(3, 1, 3, 13, 16, 13); private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); @@ -30,25 +31,29 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider @Override public BlockColor getProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); - } - - @Override - public ItemColor getItemProvider() { - return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getItemProvider(); + return ((CustomColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); } @Override + public ItemColor getItemProvider() { + return ((CustomColorProvider) EndBlocks.AURORA_CRYSTAL).getItemProvider(); + } + + @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; } - + @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); - Optional pattern = blockState.getValue(IS_FLOOR) ? - Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, blockName, blockName) : - Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, blockName, blockName); + Optional pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson( + Patterns.BLOCK_STONE_LANTERN_FLOOR, + blockName, + blockName + ) : Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, blockName, blockName); return ModelsHelper.fromPattern(pattern); } } diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java deleted file mode 100644 index 1e82ff4c..00000000 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ /dev/null @@ -1,74 +0,0 @@ -package ru.betterend.blocks.complex; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.level.block.Block; -import ru.bclib.blocks.BaseBlock; -import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.blocks.BaseSlabBlock; -import ru.bclib.blocks.BaseStairsBlock; -import ru.bclib.blocks.BaseWallBlock; -import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.TagHelper; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.EndPedestal; -import ru.betterend.config.Configs; -import ru.betterend.recipe.CraftingRecipes; -import ru.betterend.registry.EndBlocks; - -public class CrystalSubblocksMaterial { - public final Block polished; - public final Block tiles; - public final Block pillar; - public final Block stairs; - public final Block slab; - public final Block wall; - public final Block pedestal; - public final Block bricks; - public final Block brick_stairs; - public final Block brick_slab; - public final Block brick_wall; - - public CrystalSubblocksMaterial(String name, Block source) { - FabricBlockSettings material = FabricBlockSettings.copyOf(source); - polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); - tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); - pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(source)); - slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(source)); - wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(source)); - pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(source)); - bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); - brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); - brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); - brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); - - // Recipes // - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar).checkConfig(Configs.RECIPE_CONFIG).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - - CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - - // Item Tags // - TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); - TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); - TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); - TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); - - // Block Tags // - TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); - TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); - TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java deleted file mode 100644 index 4f5577bd..00000000 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ /dev/null @@ -1,217 +0,0 @@ -package ru.betterend.blocks.complex; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Item.Properties; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.Tier; -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.MaterialColor; -import ru.bclib.blocks.BaseBlock; -import ru.bclib.blocks.BaseChainBlock; -import ru.bclib.blocks.BaseDoorBlock; -import ru.bclib.blocks.BaseMetalBarsBlock; -import ru.bclib.blocks.BaseSlabBlock; -import ru.bclib.blocks.BaseStairsBlock; -import ru.bclib.blocks.BaseTrapdoorBlock; -import ru.bclib.blocks.WoodenPressurePlateBlock; -import ru.bclib.items.ModelProviderItem; -import ru.bclib.items.tool.BaseAxeItem; -import ru.bclib.items.tool.BaseHoeItem; -import ru.bclib.items.tool.BasePickaxeItem; -import ru.bclib.items.tool.BaseShovelItem; -import ru.bclib.items.tool.BaseSwordItem; -import ru.bclib.recipes.FurnaceRecipe; -import ru.bclib.recipes.GridRecipe; -import ru.bclib.recipes.SmithingTableRecipe; -import ru.bclib.util.TagHelper; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.BulbVineLanternBlock; -import ru.betterend.blocks.BulbVineLanternColoredBlock; -import ru.betterend.blocks.ChandelierBlock; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.config.Configs; -import ru.betterend.item.EndAnvilItem; -import ru.betterend.item.EndArmorItem; -import ru.betterend.item.tool.EndHammerItem; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.recipe.builders.AnvilRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.registry.EndTags; - -public class MetalMaterial { - public final Block ore; - public final Block block; - public final Block tile; - public final Block bars; - public final Block pressurePlate; - public final Block door; - public final Block trapdoor; - public final Block chain; - public final Block stairs; - public final Block slab; - - public final Block chandelier; - public final Block bulb_lantern; - public final ColoredMaterial bulb_lantern_colored; - - public final Block anvilBlock; - public final Item anvilItem; - - public final Item nugget; - public final Item ingot; - - public final Item shovelHead; - public final Item pickaxeHead; - public final Item axeHead; - public final Item hoeHead; - public final Item swordBlade; - public final Item swordHandle; - - public final Item shovel; - public final Item sword; - public final Item pickaxe; - public final Item axe; - public final Item hoe; - public final Item hammer; - - public final Item forgedPlate; - public final Item helmet; - public final Item chestplate; - public final Item leggings; - public final Item boots; - - public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); - } - - public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); - } - - public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); - } - - public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); - } - - private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { - BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); - final int level = material.getLevel(); - - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; - block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); - tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); - slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(tile)); - door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(block)); - trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(block)); - bars = EndBlocks.registerBlock(name + "_bars", new BaseMetalBarsBlock(block)); - chain = EndBlocks.registerBlock(name + "_chain", new BaseChainBlock(block.defaultMaterialColor())); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(block)); - - chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); - bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); - bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); - - nugget = EndItems.registerEndItem(name + "_nugget", new ModelProviderItem(itemSettings)); - ingot = EndItems.registerEndItem(name + "_ingot", new ModelProviderItem(itemSettings)); - - shovelHead = EndItems.registerEndItem(name + "_shovel_head"); - pickaxeHead = EndItems.registerEndItem(name + "_pickaxe_head"); - axeHead = EndItems.registerEndItem(name + "_axe_head"); - hoeHead = EndItems.registerEndItem(name + "_hoe_head"); - swordBlade = EndItems.registerEndItem(name + "_sword_blade"); - swordHandle = EndItems.registerEndItem(name + "_sword_handle"); - - shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); - sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); - pickaxe = EndItems.registerEndTool(name + "_pickaxe", new BasePickaxeItem(material, 1, -2.8F, itemSettings)); - axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); - hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); - hammer = EndItems.registerEndTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - - forgedPlate = EndItems.registerEndItem(name + "_forged_plate"); - helmet = EndItems.registerEndItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); - chestplate = EndItems.registerEndItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); - leggings = EndItems.registerEndItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); - boots = EndItems.registerEndItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); - - anvilBlock = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(this, block.defaultMaterialColor(), level)); - anvilItem = EndItems.registerEndItem(name + "_anvil_item", new EndAnvilItem(anvilBlock)); - - if (hasOre) { - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace", ore, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); - AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); - } - - // Basic recipes - GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_nuggets", ingot).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_nuggets_from_ingot", nugget).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(9).setList("#").addMaterial('#', ingot).setGroup("end_metal_nuggets_ing").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_block", block).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_block", ingot).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); - - // Block recipes - GridRecipe.make(BetterEnd.MOD_ID, name + "_tile", tile).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bars", bars).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', ingot).setGroup("end_metal_plates").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_door", door).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', ingot).setGroup("end_metal_doors").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_trapdoor", trapdoor).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', ingot).setGroup("end_metal_trapdoors").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', block, tile).setGroup("end_metal_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', block, tile).setGroup("end_metal_slabs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chain", chain).checkConfig(Configs.RECIPE_CONFIG).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_anvil", anvilBlock).checkConfig(Configs.RECIPE_CONFIG).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bulb_lantern", bulb_lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_chandelier", chandelier).checkConfig(Configs.RECIPE_CONFIG).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - - // Tools & armor into nuggets - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_axe_nugget", axe, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hoe_nugget", hoe, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_pickaxe_nugget", pickaxe, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_sword_nugget", sword, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hammer_nugget", hammer, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_helmet_nugget", helmet, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_chestplate_nugget", chestplate, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_leggings_nugget", leggings, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_boots_nugget", boots, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - - // Tool parts from ingots - AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_axe_head").setInput(ingot).setInputCount(3).setOutput(axeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - AnvilRecipe.Builder.create(name + "_forged_plate").setInput(ingot).setOutput(forgedPlate).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - - // Tools from parts - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hammer").checkConfig(Configs.RECIPE_CONFIG).setResult(hammer).setBase(block).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_axe").checkConfig(Configs.RECIPE_CONFIG).setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_pickaxe").checkConfig(Configs.RECIPE_CONFIG).setResult(pickaxe).setBase(pickaxeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hoe").checkConfig(Configs.RECIPE_CONFIG).setResult(hoe).setBase(hoeHead).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword_handle").checkConfig(Configs.RECIPE_CONFIG).setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword").checkConfig(Configs.RECIPE_CONFIG).setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_shovel").checkConfig(Configs.RECIPE_CONFIG).setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); - - // Armor crafting - GridRecipe.make(BetterEnd.MOD_ID, name + "_helmet", helmet).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_helmets").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chestplate", chestplate).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "###", "###").addMaterial('#', forgedPlate).setGroup("end_metal_chestplates").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_leggings", leggings).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_leggings").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_boots", boots).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_boots").build(); - - TagHelper.addTag(BlockTags.ANVIL, anvilBlock); - TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); - TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java deleted file mode 100644 index 125c391e..00000000 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ /dev/null @@ -1,106 +0,0 @@ -package ru.betterend.blocks.complex; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.material.MaterialColor; -import ru.bclib.api.TagAPI; -import ru.bclib.blocks.BaseBlock; -import ru.bclib.blocks.BaseFurnaceBlock; -import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.blocks.BaseSlabBlock; -import ru.bclib.blocks.BaseStairsBlock; -import ru.bclib.blocks.BaseStoneButtonBlock; -import ru.bclib.blocks.BaseWallBlock; -import ru.bclib.blocks.StonePressurePlateBlock; -import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.TagHelper; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.EndPedestal; -import ru.betterend.blocks.basis.StoneLanternBlock; -import ru.betterend.config.Configs; -import ru.betterend.recipe.CraftingRecipes; -import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; - -public class StoneMaterial { - public final Block stone; - - public final Block polished; - public final Block tiles; - public final Block pillar; - public final Block stairs; - public final Block slab; - public final Block wall; - public final Block button; - public final Block pressure_plate; - public final Block pedestal; - public final Block lantern; - - public final Block bricks; - public final Block brick_stairs; - public final Block brick_slab; - public final Block brick_wall; - public final Block furnace; - - public StoneMaterial(String name, MaterialColor color) { - FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - - stone = EndBlocks.registerBlock(name, new BaseBlock(material)); - polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); - tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); - pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(stone)); - slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(stone)); - wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(stone)); - button = EndBlocks.registerBlock(name + "_button", new BaseStoneButtonBlock(stone)); - pressure_plate = EndBlocks.registerBlock(name + "_plate", new StonePressurePlateBlock(stone)); - pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); - lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - - bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); - brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); - brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); - brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); - furnace = EndBlocks.registerBlock(name + "_furnace", new BaseFurnaceBlock(bricks)); - - // Recipes // - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar).checkConfig(Configs.RECIPE_CONFIG).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', stone).setGroup("end_stone_slabs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', stone).setGroup("end_wall").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - - GridRecipe.make(BetterEnd.MOD_ID, name + "_button", button).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressure_plate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_lantern", lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_furnace", furnace).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); - - CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - - // Item Tags // - TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); - TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); - TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); - TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); - TagHelper.addTag(TagAPI.FURNACES, furnace); - - // Block Tags // - TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); - TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); - TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); - TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); - TagHelper.addTag(TagAPI.END_STONES, stone); - - TagHelper.addTag(TagAPI.DRAGON_IMMUNE, stone, stairs, slab, wall); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java deleted file mode 100644 index c42dc9e9..00000000 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ /dev/null @@ -1,186 +0,0 @@ -package ru.betterend.blocks.complex; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag; -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; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.MaterialColor; -import ru.bclib.api.TagAPI; -import ru.bclib.blocks.BaseBarkBlock; -import ru.bclib.blocks.BaseBarrelBlock; -import ru.bclib.blocks.BaseBlock; -import ru.bclib.blocks.BaseBookshelfBlock; -import ru.bclib.blocks.BaseComposterBlock; -import ru.bclib.blocks.BaseCraftingTableBlock; -import ru.bclib.blocks.BaseDoorBlock; -import ru.bclib.blocks.BaseFenceBlock; -import ru.bclib.blocks.BaseGateBlock; -import ru.bclib.blocks.BaseLadderBlock; -import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.blocks.BaseSignBlock; -import ru.bclib.blocks.BaseSlabBlock; -import ru.bclib.blocks.BaseStairsBlock; -import ru.bclib.blocks.BaseStripableLogBlock; -import ru.bclib.blocks.BaseTrapdoorBlock; -import ru.bclib.blocks.BaseWoodenButtonBlock; -import ru.bclib.blocks.StripableBarkBlock; -import ru.bclib.blocks.WoodenPressurePlateBlock; -import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.TagHelper; -import ru.betterend.BetterEnd; -import ru.betterend.config.Configs; -import ru.betterend.registry.EndBlocks; - -public class WoodenMaterial { - public final Block log; - public final Block bark; - - public final Block log_stripped; - public final Block bark_stripped; - - public final Block planks; - - public final Block stairs; - public final Block slab; - public final Block fence; - public final Block gate; - public final Block button; - public final Block pressurePlate; - public final Block trapdoor; - public final Block door; - - public final Block craftingTable; - public final Block ladder; - public final Block sign; - - public final Block chest; - public final Block barrel; - public final Block shelf; - public final Block composter; - - public final Tag.Named logBlockTag; - public final Tag.Named logItemTag; - - public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { - FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - - log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BaseRotatedPillarBlock(materialPlanks)); - bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BaseBarkBlock(materialPlanks)); - - log = EndBlocks.registerBlock(name + "_log", new BaseStripableLogBlock(woodColor, log_stripped)); - bark = EndBlocks.registerBlock(name + "_bark", new StripableBarkBlock(woodColor, bark_stripped)); - - planks = EndBlocks.registerBlock(name + "_planks", new BaseBlock(materialPlanks)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(planks)); - slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(planks)); - fence = EndBlocks.registerBlock(name + "_fence", new BaseFenceBlock(planks)); - gate = EndBlocks.registerBlock(name + "_gate", new BaseGateBlock(planks)); - button = EndBlocks.registerBlock(name + "_button", new BaseWoodenButtonBlock(planks)); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(planks)); - trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(planks)); - door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(planks)); - - craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new BaseCraftingTableBlock(planks)); - ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); - sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks)); - - chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks)); - barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks)); - shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); - composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks)); - - // Recipes // - GridRecipe.make(BetterEnd.MOD_ID, name + "_planks", planks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', planks).setGroup("end_planks_stairs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', planks).setGroup("end_planks_slabs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_fence", fence).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("#I#", "#I#").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_fences").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_gate", gate).checkConfig(Configs.RECIPE_CONFIG).setShape("I#I", "I#I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_planks_gates").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_button", button).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', planks).setGroup("end_planks_buttons").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', planks).setGroup("end_planks_plates").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_trapdoor", trapdoor).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(2).setShape("###", "###").addMaterial('#', planks).setGroup("end_trapdoors").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_door", door).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("##", "##", "##").addMaterial('#', planks).setGroup("end_doors").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_crafting_table", craftingTable).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', planks).setGroup("end_tables").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_ladder", ladder).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("I I", "I#I", "I I").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_ladders").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_sign", sign).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chest", chest).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_barrel", barrel).checkConfig(Configs.RECIPE_CONFIG).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bookshelf", shelf).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.BOOK).setGroup("end_bookshelves").build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bark", bark).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', log).setOutputCount(3).build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_log", log).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_composter", composter).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "# #", "###").addMaterial('#', slab).build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_shulker", Items.SHULKER_BOX).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); - - // Item Tags // - TagHelper.addTag(ItemTags.PLANKS, planks); - TagHelper.addTag(ItemTags.WOODEN_PRESSURE_PLATES, pressurePlate); - TagHelper.addTag(ItemTags.LOGS, log, bark, log_stripped, bark_stripped); - TagHelper.addTag(ItemTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - - TagHelper.addTags(button, ItemTags.WOODEN_BUTTONS, ItemTags.BUTTONS); - TagHelper.addTags(door, ItemTags.WOODEN_DOORS, ItemTags.DOORS); - TagHelper.addTags(fence, ItemTags.WOODEN_FENCES, ItemTags.FENCES); - TagHelper.addTags(slab, ItemTags.WOODEN_SLABS, ItemTags.SLABS); - TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); - TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); - TagHelper.addTag(TagAPI.ITEM_CHEST, chest); - - // Block Tags // - TagHelper.addTag(BlockTags.PLANKS, planks); - TagHelper.addTag(BlockTags.CLIMBABLE, ladder); - TagHelper.addTag(BlockTags.LOGS, log, bark, log_stripped, bark_stripped); - TagHelper.addTag(BlockTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - - TagHelper.addTags(button, BlockTags.WOODEN_BUTTONS, BlockTags.BUTTONS); - TagHelper.addTags(door, BlockTags.WOODEN_DOORS, BlockTags.DOORS); - TagHelper.addTags(fence, BlockTags.WOODEN_FENCES, BlockTags.FENCES); - TagHelper.addTags(slab, BlockTags.WOODEN_SLABS, BlockTags.SLABS); - TagHelper.addTags(stairs, BlockTags.WOODEN_STAIRS, BlockTags.STAIRS); - TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); - TagHelper.addTag(TagAPI.BOOKSHELVES, shelf); - TagHelper.addTag(TagAPI.BLOCK_CHEST, chest); - - logBlockTag = TagAPI.makeBlockTag(BetterEnd.MOD_ID, name + "_logs"); - logItemTag = TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_logs"); - TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); - TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); - - FlammableBlockRegistry.getDefaultInstance().add(log, 5, 5); - FlammableBlockRegistry.getDefaultInstance().add(bark, 5, 5); - FlammableBlockRegistry.getDefaultInstance().add(log_stripped, 5, 5); - FlammableBlockRegistry.getDefaultInstance().add(bark_stripped, 5, 5); - - FlammableBlockRegistry.getDefaultInstance().add(planks, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(stairs, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(slab, 5, 20); - - FlammableBlockRegistry.getDefaultInstance().add(fence, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(gate, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(button, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(pressurePlate, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(trapdoor, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(door, 5, 20); - - FlammableBlockRegistry.getDefaultInstance().add(craftingTable, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(ladder, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(sign, 5, 20); - - FlammableBlockRegistry.getDefaultInstance().add(chest, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(barrel, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(shelf, 5, 20); - FlammableBlockRegistry.getDefaultInstance().add(composter, 5, 20); - } - - public boolean isTreeLog(Block block) { - return block == log || block == bark; - } - - public boolean isTreeLog(BlockState state) { - return isTreeLog(state.getBlock()); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index ecce043d..4404d2d9 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -1,16 +1,14 @@ package ru.betterend.blocks.entities; -import java.util.List; - +import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -20,52 +18,61 @@ import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; -public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity { +import java.util.List; +public class BlockEntityHydrothermalVent extends BlockEntity { private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f); - - public BlockEntityHydrothermalVent() { - super(EndBlockEntities.HYDROTHERMAL_VENT); + private static final MutableBlockPos POS = new MutableBlockPos(); + + public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState); } - - @Override - public void tick() { - if (level != null) { - BlockState state = getBlockState(); - if (state.is(EndBlocks.HYDROTHERMAL_VENT)) { - boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); - if (active && level.random.nextInt(20) == 0) { - double x = worldPosition.getX() + level.random.nextDouble(); - double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; - double z = worldPosition.getZ() + level.random.nextDouble(); - if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { - level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } else { - level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); - } - } - MutableBlockPos mutable = worldPosition.mutable().move(Direction.UP); - int height = active ? 85 : 25; - AABB box = new AABB(mutable.offset(-1, 0, -1), mutable.offset(1, height, 1)); - List entities = level.getEntitiesOfClass(LivingEntity.class, box); - if (entities.size() > 0) { - while (mutable.getY() < box.maxY) { - BlockState blockState = level.getBlockState(mutable); - if (blockState.isSolidRender(level, mutable)) break; - if (blockState.isAir()) { - double mult = active ? 3.0 : 5.0; - float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult); - entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() && - hasElytra(entity) && entity.isFallFlying()) - .forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); - } - mutable.move(Direction.UP); - } + + public static void tick(Level level, BlockPos worldPosition, BlockState state, T uncastedEntity) { + if (level != null && uncastedEntity instanceof BlockEntityHydrothermalVent && state.is(EndBlocks.HYDROTHERMAL_VENT)) { + BlockEntityHydrothermalVent blockEntity = (BlockEntityHydrothermalVent) uncastedEntity; + if (level.isClientSide()) { + clientTick(level, worldPosition, state, blockEntity); + } + //else { + serverTick(level, worldPosition, state, blockEntity); + //} + } + } + + private static void clientTick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { + boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); + if (active && level.random.nextInt(20) == 0 && state.getValue(HydrothermalVentBlock.WATERLOGGED)) { + double x = worldPosition.getX() + level.random.nextDouble(); + double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; + double z = worldPosition.getZ() + level.random.nextDouble(); + level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); + } + } + + private static void serverTick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { + boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); + POS.set(worldPosition).move(Direction.UP); + int height = active ? 85 : 25; + AABB box = new AABB(POS.offset(-1, 0, -1), POS.offset(1, height, 1)); + List entities = level.getEntitiesOfClass(LivingEntity.class, box); + if (entities.size() > 0) { + while (POS.getY() < box.maxY) { + BlockState blockState = level.getBlockState(POS); + if (blockState.isSolidRender(level, POS)) break; + if (blockState.isAir()) { + double mult = active ? 3.0 : 5.0; + float force = (float) ((1.0 - (POS.getY() / box.maxY)) / mult); + entities.stream() + .filter(entity -> (int) entity.getY() == POS.getY() && blockEntity.hasElytra(entity) && entity + .isFallFlying()) + .forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); } + POS.move(Direction.UP); } } } - + private boolean hasElytra(LivingEntity entity) { Item item = entity.getItemBySlot(EquipmentSlot.CHEST).getItem(); return item instanceof ElytraItem || item instanceof FallFlyingItem; diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 49516b35..5325a67f 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,15 +1,11 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -37,7 +33,6 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; @@ -46,11 +41,15 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity { +import java.util.Iterator; +import java.util.List; +import java.util.Map; - private static final int[] TOP_SLOTS = new int[] { 0, 1 }; - private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; - private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; +public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible { + + private static final int[] TOP_SLOTS = new int[] {0, 1}; + private static final int[] BOTTOM_SLOTS = new int[] {2, 3}; + private static final int[] SIDE_SLOTS = new int[] {1, 2}; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); private final Object2IntOpenHashMap recipesUsed; @@ -62,57 +61,57 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme private int burnTime; private int fuelTime; - public EndStoneSmelterBlockEntity() { - super(EndBlockEntities.END_STONE_SMELTER); + public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState); this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); - this.propertyDelegate = new ContainerData() { - public int get(int index) { - switch(index) { - case 0: - return EndStoneSmelterBlockEntity.this.burnTime; - case 1: - return EndStoneSmelterBlockEntity.this.fuelTime; - case 2: - return EndStoneSmelterBlockEntity.this.smeltTime; - case 3: - return EndStoneSmelterBlockEntity.this.smeltTimeTotal; - default: - return 0; - } - } - - public void set(int index, int value) { - switch(index) { - case 0: - EndStoneSmelterBlockEntity.this.burnTime = value; - break; - case 1: - EndStoneSmelterBlockEntity.this.fuelTime = value; - break; - case 2: - EndStoneSmelterBlockEntity.this.smeltTime = value; - break; - case 3: - EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; - } - } - - public int getCount() { - return 4; - } - }; + this.propertyDelegate = new ContainerData() { + public int get(int index) { + switch (index) { + case 0: + return EndStoneSmelterBlockEntity.this.burnTime; + case 1: + return EndStoneSmelterBlockEntity.this.fuelTime; + case 2: + return EndStoneSmelterBlockEntity.this.smeltTime; + case 3: + return EndStoneSmelterBlockEntity.this.smeltTimeTotal; + default: + return 0; + } + } + + public void set(int index, int value) { + switch (index) { + case 0: + EndStoneSmelterBlockEntity.this.burnTime = value; + break; + case 1: + EndStoneSmelterBlockEntity.this.fuelTime = value; + break; + case 2: + EndStoneSmelterBlockEntity.this.smeltTime = value; + break; + case 3: + EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; + } + } + + public int getCount() { + return 4; + } + }; } - + private boolean isBurning() { return burnTime > 0; } - + @Override public int getContainerSize() { return inventory.size(); } - + @Override public boolean isEmpty() { Iterator iterator = inventory.iterator(); @@ -123,25 +122,25 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } itemStack = iterator.next(); } while (itemStack.isEmpty()); - + return false; } - + @Override public ItemStack getItem(int slot) { return inventory.get(slot); } - + @Override public ItemStack removeItem(int slot, int amount) { return ContainerHelper.removeItem(inventory, slot, amount); } - + @Override public ItemStack removeItemNoUpdate(int slot) { return ContainerHelper.takeItem(inventory, slot); } - + @Override public void setItem(int slot, ItemStack stack) { ItemStack itemStack = inventory.get(slot); @@ -159,11 +158,15 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme protected int getSmeltTime() { if (level == null) return 200; - int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) - .map(AlloyingRecipe::getSmeltTime).orElse(0); + int smeltTime = level.getRecipeManager() + .getRecipeFor(AlloyingRecipe.TYPE, this, level) + .map(AlloyingRecipe::getSmeltTime) + .orElse(0); if (smeltTime == 0) { - smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) - .map(BlastingRecipe::getCookingTime).orElse(200); + smeltTime = level.getRecipeManager() + .getRecipeFor(RecipeType.BLASTING, this, level) + .map(BlastingRecipe::getCookingTime) + .orElse(200); smeltTime /= 1.5; } return smeltTime; @@ -178,7 +181,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe instanceof AlloyingRecipe) { AlloyingRecipe alloying = (AlloyingRecipe) recipe; dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); - } else { + } + else { BlastingRecipe blasting = (BlastingRecipe) recipe; dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); } @@ -194,92 +198,105 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (g != 0.0F && Math.random() < g) { expTotal++; } - - while(expTotal > 0) { + + while (expTotal > 0) { int expVal = ExperienceOrb.getExperienceValue(expTotal); expTotal -= expVal; world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, expVal)); } } - + @Override public boolean stillValid(Player player) { if (level != null && level.getBlockEntity(worldPosition) != this) { return false; } - return player.distanceToSqr(worldPosition.getX() + 0.5D, worldPosition.getY() + 0.5D, worldPosition.getZ() + 0.5D) <= 64.0D; + return player.distanceToSqr( + worldPosition.getX() + 0.5D, + worldPosition.getY() + 0.5D, + worldPosition.getZ() + 0.5D + ) <= 64.0D; } - + @Override public void clearContent() { inventory.clear(); } - + @Override protected Component getDefaultName() { return new TranslatableComponent(String.format("block.%s.%s", BetterEnd.MOD_ID, EndStoneSmelter.ID)); } - + @Override protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate); } - - @Override - public void tick() { - if (level == null) return; - - boolean initialBurning = isBurning(); + + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, EndStoneSmelterBlockEntity blockEntity) { + if (tickLevel == null) return; + + boolean initialBurning = blockEntity.isBurning(); if (initialBurning) { - burnTime--; + blockEntity.burnTime--; } - + boolean burning = initialBurning; - if (!level.isClientSide) { - ItemStack fuel = inventory.get(2); - if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (smeltTime > 0) { - smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); + if (!tickLevel.isClientSide) { + ItemStack fuel = blockEntity.inventory.get(2); + if (!burning && (fuel.isEmpty() || blockEntity.inventory.get(0).isEmpty() && blockEntity.inventory.get(1) + .isEmpty())) { + if (blockEntity.smeltTime > 0) { + blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal); } - } else { - Recipe recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); + } + else { + Recipe recipe = tickLevel.getRecipeManager() + .getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel) + .orElse(null); if (recipe == null) { - recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); + recipe = tickLevel.getRecipeManager() + .getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel) + .orElse(null); } - boolean accepted = this.canAcceptRecipeOutput(recipe); + boolean accepted = blockEntity.canAcceptRecipeOutput(recipe); if (!burning && accepted) { - burnTime = getFuelTime(fuel); - fuelTime = burnTime; - burning = isBurning(); + blockEntity.burnTime = blockEntity.getFuelTime(fuel); + blockEntity.fuelTime = blockEntity.burnTime; + burning = blockEntity.isBurning(); if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); fuel.shrink(1); if (fuel.isEmpty()) { Item remainFuel = item.getCraftingRemainingItem(); - inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + blockEntity.inventory.set( + 2, + remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel) + ); } } - setChanged(); + blockEntity.setChanged(); } } - + if (burning && accepted) { - this.smeltTime++; - if (smeltTime == smeltTimeTotal) { - smeltTime = 0; - smeltTimeTotal = getSmeltTime(); - craftRecipe(recipe); - setChanged(); + blockEntity.smeltTime++; + if (blockEntity.smeltTime == blockEntity.smeltTimeTotal) { + blockEntity.smeltTime = 0; + blockEntity.smeltTimeTotal = blockEntity.getSmeltTime(); + blockEntity.craftRecipe(recipe); + blockEntity.setChanged(); } - } else { - smeltTime = 0; + } + else { + blockEntity.smeltTime = 0; } } - + burning = blockEntity.isBurning(); if (initialBurning != burning) { - level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); - setChanged(); + tickLevel.setBlock(tickPos, tickState.setValue(EndStoneSmelter.LIT, burning), 3); + blockEntity.setChanged(); } } } @@ -288,11 +305,10 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe == null) return false; boolean validInput; if (recipe instanceof AlloyingRecipe) { - validInput = !inventory.get(0).isEmpty() && - !inventory.get(1).isEmpty(); - } else { - validInput = !inventory.get(0).isEmpty() || - !inventory.get(1).isEmpty(); + validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); + } + else { + validInput = !inventory.get(0).isEmpty() || !inventory.get(1).isEmpty(); } if (validInput) { ItemStack result = recipe.getResultItem(); @@ -315,7 +331,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } return false; } - + private void craftRecipe(Recipe recipe) { if (recipe == null || !canAcceptRecipeOutput(recipe)) return; @@ -323,10 +339,11 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme ItemStack output = inventory.get(3); if (output.isEmpty()) { inventory.set(3, result.copy()); - } else if (output.getItem() == result.getItem()) { + } + else if (output.getItem() == result.getItem()) { output.grow(result.getCount()); } - + assert this.level != null; if (!this.level.isClientSide) { setRecipeUsed(recipe); @@ -335,22 +352,24 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe instanceof AlloyingRecipe) { inventory.get(0).shrink(1); inventory.get(1).shrink(1); - } else { + } + else { if (!inventory.get(0).isEmpty()) { inventory.get(0).shrink(1); - } else { + } + else { inventory.get(1).shrink(1); } } } - + @Override public void fillStackedContents(StackedContents finder) { for (ItemStack itemStack : this.inventory) { finder.accountStack(itemStack); } } - + @Override public void setRecipeUsed(Recipe recipe) { if (recipe != null) { @@ -359,12 +378,12 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme lastRecipe = recipe; } } - + @Override public Recipe getRecipeUsed() { return this.lastRecipe; } - + @Override public int[] getSlotsForFace(Direction side) { if (side == Direction.DOWN) { @@ -372,12 +391,12 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } return side == Direction.UP ? TOP_SLOTS : SIDE_SLOTS; } - + @Override public boolean canPlaceItemThroughFace(int slot, ItemStack stack, Direction dir) { return this.canPlaceItem(slot, stack); } - + @Override public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { if (dir == Direction.DOWN && slot == 2) { @@ -385,7 +404,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } return true; } - + protected int getFuelTime(ItemStack fuel) { if (fuel.isEmpty()) { return 0; @@ -395,8 +414,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(tag, inventory); burnTime = tag.getShort("BurnTime"); @@ -410,8 +429,9 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } @Override - public CompoundTag save(CompoundTag tag) { - super.save(tag); + public void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + tag.putShort("BurnTime", (short) burnTime); tag.putShort("FuelTime", (short) fuelTime); tag.putShort("SmeltTime", (short) smeltTime); @@ -420,28 +440,27 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme CompoundTag usedRecipes = new CompoundTag(); recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); - - return tag; } public boolean canPlaceItem(int slot, ItemStack stack) { if (slot == 3) { return false; - } else if (slot != 2) { + } + else if (slot != 2) { return true; } ItemStack itemStack = this.inventory.get(2); return canUseAsFuel(stack) || stack.getItem() == Items.BUCKET && itemStack.getItem() != Items.BUCKET; } - + public static boolean canUseAsFuel(ItemStack stack) { return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } - + public static void registerFuel(ItemLike fuel, int time) { AVAILABLE_FUELS.put(fuel.asItem(), time); } - + public static Map availableFuels() { return AVAILABLE_FUELS; } @@ -450,7 +469,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); return ticks == null ? 0 : ticks; } - + static { AbstractFurnaceBlockEntity.getFuel().forEach((item, time) -> { if (time >= 2000) { diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index d4da8a18..4546cf14 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -3,14 +3,15 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - public EternalPedestalEntity() { - super(EndBlockEntities.ETERNAL_PEDESTAL); + public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState); } public boolean hasRitual() { @@ -26,21 +27,21 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } @Override - public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); + public void setLevel(Level level) { + super.setLevel(level); if (hasRitual()) { - linkedRitual.setWorld(world); + linkedRitual.setWorld(level); } } - + @Override - public CompoundTag save(CompoundTag tag) { + public void saveAdditional(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.save(tag); + super.saveAdditional(tag); } - + @Override protected void fromTag(CompoundTag tag) { super.fromTag(tag); diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 2a6a4029..47420b67 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -3,24 +3,27 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; public class InfusionPedestalEntity extends PedestalBlockEntity { - + private InfusionRitual linkedRitual; - public InfusionPedestalEntity() { - super(EndBlockEntities.INFUSION_PEDESTAL); + public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState); } @Override - public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); + public void setLevel(Level world) { + super.setLevel(world); if (hasRitual()) { - linkedRitual.setLocation(world, pos); - } else { - linkRitual(new InfusionRitual(this, world, pos)); + linkedRitual.setLocation(world, this.getBlockPos()); + } + else { + linkRitual(new InfusionRitual(this, world, this.getBlockPos())); } } @@ -37,21 +40,13 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } @Override - public void tick() { - if (hasRitual()) { - linkedRitual.tick(); - } - super.tick(); - } - - @Override - public CompoundTag save(CompoundTag tag) { + public void saveAdditional(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.save(tag); + super.saveAdditional(tag); } - + @Override protected void fromTag(CompoundTag tag) { super.fromTag(tag); @@ -60,4 +55,14 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { linkedRitual.fromTag(tag.getCompound("ritual")); } } + + public static void tickEnity(Level level, BlockPos blockPos, BlockState blockState, T uncastedEntity) { + if (uncastedEntity instanceof InfusionPedestalEntity) { + InfusionPedestalEntity blockEntity = (InfusionPedestalEntity) uncastedEntity; + if (blockEntity.hasRitual()) { + blockEntity.linkedRitual.tick(); + } + //PedestalBlockEntity.tick(level, blockPos, blockState, blockEntity); + } + } } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 5dfe65e0..52a62b05 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,55 +1,57 @@ package ru.betterend.blocks.entities; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable { +public class PedestalBlockEntity extends BlockEntity implements Container { private ItemStack activeItem = ItemStack.EMPTY; - private final int maxAge = 314; - private int age; - - public PedestalBlockEntity() { - super(EndBlockEntities.PEDESTAL); + public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { + this(EndBlockEntities.PEDESTAL, blockPos, blockState); } - public PedestalBlockEntity(BlockEntityType type) { - super(type); + public PedestalBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { + super(blockEntityType, blockPos, blockState); } - public int getAge() { - return age; + protected void toTag(CompoundTag tag) { + if (activeItem != ItemStack.EMPTY) { + tag.put("active_item", activeItem.save(new CompoundTag())); + } } - public int getMaxAge() { - return maxAge; + protected void fromTag(CompoundTag tag) { + if (tag.contains("active_item")) { + CompoundTag itemTag = tag.getCompound("active_item"); + activeItem = ItemStack.of(itemTag); + } } - + @Override public int getContainerSize() { return 1; } - + @Override public boolean isEmpty() { return activeItem.isEmpty(); } - + @Override public ItemStack getItem(int slot) { return activeItem; } - + @Override public ItemStack removeItem(int slot, int amount) { return removeItemNoUpdate(slot); @@ -59,20 +61,20 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka public boolean canPlaceItem(int slot, ItemStack stack) { return isEmpty(); } - + @Override public void clearContent() { activeItem = ItemStack.EMPTY; setChanged(); } - + @Override public ItemStack removeItemNoUpdate(int slot) { ItemStack stored = activeItem; clearContent(); return stored; } - + @Override public void setItem(int slot, ItemStack stack) { activeItem = stack.split(1); @@ -87,7 +89,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka BlockState trueState = state.setValue(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, true); - } else { + } + else { trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, false); } level.setBlockAndUpdate(worldPosition, trueState); @@ -95,7 +98,6 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } super.setChanged(); } - @Override public boolean stillValid(Player player) { @@ -103,41 +105,24 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); fromTag(tag); } - + @Override - public CompoundTag save(CompoundTag tag) { - tag.put("active_item", activeItem.save(new CompoundTag())); - return super.save(tag); + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + toTag(tag); } - + @Override - public void fromClientTag(CompoundTag tag) { - fromTag(tag); + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); } - + @Override - public CompoundTag toClientTag(CompoundTag tag) { - return save(tag); - } - - protected void fromTag(CompoundTag tag) { - if (tag.contains("active_item")) { - CompoundTag itemTag = tag.getCompound("active_item"); - activeItem = ItemStack.of(itemTag); - } - } - - @Override - public void tick() { - if (!isEmpty()) { - age++; - if (age > maxAge) { - age = 0; - } - } + public CompoundTag getUpdateTag() { + return this.saveWithoutMetadata(); } } diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 2a83e0c5..3eefeaf4 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -1,39 +1,31 @@ package ru.betterend.client; -import java.util.List; - import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.DimensionRenderingRegistry; import net.minecraft.ChatFormatting; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.Registry; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.level.block.Block; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; import ru.bclib.BCLib; -import ru.bclib.blocks.BaseChestBlock; -import ru.bclib.blocks.BaseSignBlock; -import ru.bclib.client.render.BCLRenderLayer; -import ru.bclib.client.render.BaseChestBlockEntityRenderer; -import ru.bclib.client.render.BaseSignBlockEntityRenderer; -import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.TranslationHelper; import ru.betterend.BetterEnd; +import ru.betterend.client.render.BetterEndSkyRenderer; import ru.betterend.events.ItemTooltipCallback; import ru.betterend.interfaces.MultiModelItem; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndBlockEntityRenders; -import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntitiesRenders; import ru.betterend.registry.EndModelProviders; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndScreens; +import ru.betterend.world.generator.GeneratorOptions; public class BetterEndClient implements ClientModInitializer { @Override public void onInitializeClient() { - registerRenderLayers(); EndBlockEntityRenders.register(); EndScreens.register(); EndParticles.register(); @@ -41,14 +33,34 @@ public class BetterEndClient implements ClientModInitializer { EndModelProviders.register(); MultiModelItem.register(); ClientOptions.init(); - registerRenderers(); registerTooltips(); if (BCLib.isDevEnvironment()) { - TranslationHelper.printMissingNames(BetterEnd.MOD_ID); + TranslationHelper.printMissingEnNames(BetterEnd.MOD_ID); + TranslationHelper.printMissingNames(BetterEnd.MOD_ID, "ru_ru"); + } + + ResourceLocation checkFlowerId = new ResourceLocation("item/chorus_flower"); + ResourceLocation checkPlantId = new ResourceLocation("item/chorus_plant"); + ResourceLocation toLoadFlowerId = new ResourceLocation("betterend", "item/custom_chorus_flower"); + ResourceLocation toLoadPlantId = new ResourceLocation("betterend", "item/custom_chorus_plant"); + ModelLoadingRegistry.INSTANCE.registerResourceProvider(manager -> (resourceId, context) -> { + if (GeneratorOptions.changeChorusPlant()) { + if (resourceId.equals(checkFlowerId)) { + return context.loadModel(toLoadFlowerId); + } + else if (resourceId.equals(checkPlantId)) { + return context.loadModel(toLoadPlantId); + } + } + return null; + }); + + if(ClientOptions.isCustomSky()) { + DimensionRenderingRegistry.registerSkyRenderer(Level.END, new BetterEndSkyRenderer()); } } - + public static void registerTooltips() { ItemTooltipCallback.EVENT.register((player, stack, context, lines) -> { if (stack.getItem() instanceof CrystaliteArmor) { @@ -57,30 +69,13 @@ public class BetterEndClient implements ClientModInitializer { hasSet = CrystaliteArmor.hasFullSet(player); } TranslatableComponent setDesc = new TranslatableComponent("tooltip.armor.crystalite_set"); - setDesc.setStyle(Style.EMPTY.applyFormats(hasSet ? ChatFormatting.BLUE : ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); + setDesc.setStyle(Style.EMPTY.applyFormats( + hasSet ? ChatFormatting.BLUE : ChatFormatting.DARK_GRAY, + ChatFormatting.ITALIC + )); lines.add(TextComponent.EMPTY); lines.add(setDesc); } }); } - - private void registerRenderLayers() { - RenderType cutout = RenderType.cutout(); - RenderType translucent = RenderType.translucent(); - Registry.BLOCK.forEach(block -> { - if (block instanceof IRenderTyped) { - BCLRenderLayer layer = ((IRenderTyped) block).getRenderLayer(); - if (layer == BCLRenderLayer.CUTOUT) - BlockRenderLayerMap.INSTANCE.putBlock(block, cutout); - else if (layer == BCLRenderLayer.TRANSLUCENT) - BlockRenderLayerMap.INSTANCE.putBlock(block, translucent); - } - }); - } - - private static void registerRenderers() { - List modBlocks = EndBlocks.getModBlocks(); - modBlocks.stream().filter(BaseChestBlock.class::isInstance).forEach(BaseChestBlockEntityRenderer::registerRenderLayer); - modBlocks.stream().filter(BaseSignBlock.class::isInstance).forEach(BaseSignBlockEntityRenderer::registerRenderLayer); - } } diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index d80f950c..b40be6f8 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -15,27 +15,27 @@ public class ClientOptions { sulfurWaterColor = Configs.CLENT_CONFIG.getBooleanRoot("sulfurWaterColor", true); Configs.CLENT_CONFIG.saveChanges(); } - + public static boolean isCustomSky() { return customSky; } - + public static void setCustomSky(boolean customSky) { ClientOptions.customSky = customSky; } - + public static boolean useFogDensity() { return useFogDensity; } - + public static void setUseFogDensity(boolean useFogDensity) { ClientOptions.useFogDensity = useFogDensity; } - + public static boolean blendBiomeMusic() { return blendBiomeMusic; } - + public static void setBlendBiomeMusic(boolean blendBiomeMusic) { ClientOptions.blendBiomeMusic = blendBiomeMusic; } @@ -43,7 +43,7 @@ public class ClientOptions { public static boolean useSulfurWaterColor() { return sulfurWaterColor; } - + public static void setSulfurWaterColor(boolean sulfurWaterColor) { ClientOptions.sulfurWaterColor = sulfurWaterColor; } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 1ed760f5..8eafb3d8 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -1,12 +1,7 @@ package ru.betterend.client.gui; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiComponent; @@ -20,6 +15,10 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + @Environment(EnvType.CLIENT) public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent { private Iterator fuelIterator; @@ -49,7 +48,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent this.ghostRecipe.addIngredient(Ingredient.of(result), (slots.get(3)).x, (slots.get(3)).y); NonNullList inputs = recipe.getIngredients(); Iterator iterator = inputs.iterator(); - for(int i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { if (!iterator.hasNext()) { return; } @@ -63,7 +62,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent if (this.fuels == null) { this.fuels = this.getFuelItems(); } - + this.fuelIterator = this.fuels.iterator(); this.currentItem = null; } @@ -75,17 +74,24 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent if (!Screen.hasControlDown()) { this.frameTime += f; } - + int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY); + //TODO: test k=0 + this.minecraft.getItemRenderer() + .renderAndDecorateItem(minecraft.player, + this.getFuel().getDefaultInstance(), + slotX, + slotY, + 0 + ); RenderSystem.depthFunc(516); GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); } } - + private Item getFuel() { if (this.currentItem == null || this.frameTime > 30.0F) { this.frameTime = 0.0F; diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index c030ed9f..c4a60fa2 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -2,7 +2,6 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.ImageButton; @@ -18,7 +17,7 @@ import ru.betterend.BetterEnd; @Environment(EnvType.CLIENT) public class EndStoneSmelterScreen extends AbstractContainerScreen implements RecipeUpdateListener { - + private final static ResourceLocation RECIPE_BUTTON_TEXTURE = new ResourceLocation("textures/gui/recipe_button.png"); private final static ResourceLocation BACKGROUND_TEXTURE = BetterEnd.makeID("textures/gui/smelter_gui.png"); @@ -32,31 +31,43 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { - recipeBook.initVisuals(narrow); - recipeBook.toggleVisibility(); - leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); - ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); - })); + leftPos = recipeBook.updateScreenPosition(width, imageWidth); + addRenderableWidget(new ImageButton( + leftPos + 20, + height / 2 - 49, + 20, + 18, + 0, + 0, + 19, + RECIPE_BUTTON_TEXTURE, + (buttonWidget) -> { + recipeBook.initVisuals(); + recipeBook.toggleVisibility(); + leftPos = recipeBook.updateScreenPosition(width, imageWidth); + ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); + } + )); titleLabelX = (imageWidth - font.width(title)) / 2; } - + @Override - public void tick() { - super.tick(); + public void containerTick() { + super.containerTick(); recipeBook.tick(); } - + @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { renderBackground(matrices); if (recipeBook.isVisible() && narrow) { renderBg(matrices, delta, mouseX, mouseY); recipeBook.render(matrices, mouseX, mouseY, delta); - } else { + } + else { recipeBook.render(matrices, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta); recipeBook.renderGhostRecipe(matrices, leftPos, topPos, true, delta); @@ -64,53 +75,64 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen= (left + imageWidth) || mouseY >= (top + imageHeight); - return this.recipeBook.hasClickedOutside(mouseX, mouseY, leftPos, topPos, imageWidth, imageHeight, button) && isMouseOut; + return this.recipeBook.hasClickedOutside( + mouseX, + mouseY, + leftPos, + topPos, + imageWidth, + imageHeight, + button + ) && isMouseOut; } - + @Override public boolean charTyped(char chr, int keyCode) { return recipeBook.charTyped(chr, keyCode) || super.charTyped(chr, keyCode); } - + @Override public void recipesUpdated() { recipeBook.recipesUpdated(); } - + @Override public RecipeBookComponent getRecipeBookComponent() { return recipeBook; } - + @Override protected void renderBg(PoseStack matrices, float delta, int mouseX, int mouseY) { if (minecraft == null) return; - RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); - minecraft.getTextureManager().bind(BACKGROUND_TEXTURE); + //TODO: verify + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, BACKGROUND_TEXTURE); + //minecraft.getTextureManager().bind(BACKGROUND_TEXTURE); blit(matrices, leftPos, topPos, 0, 0, imageWidth, imageHeight); int progress; if (menu.isBurning()) { @@ -120,7 +142,7 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { - + public final static MenuType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( - BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); + BetterEnd.makeID(EndStoneSmelter.ID), + EndStoneSmelterScreenHandler::new + ); private final Container inventory; private final ContainerData propertyDelegate; @@ -49,13 +53,13 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { addSlot(new Slot(inventory, 1, 67, 17)); addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); - - for(int i = 0; i < 3; ++i) { - for(int j = 0; j < 9; ++j) { + + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } - for(int i = 0; i < 9; ++i) { + for (int i = 0; i < 9; ++i) { addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } @@ -64,58 +68,65 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { public MenuType getType() { return HANDLER_TYPE; } - + @Override public void fillCraftSlotsStackedContents(StackedContents finder) { if (inventory instanceof StackedContentsCompatible) { ((StackedContentsCompatible) inventory).fillStackedContents(finder); } } - + @Override public void clearCraftingContent() { inventory.clearContent(); } - + @Override public boolean recipeMatches(Recipe recipe) { return recipe.matches(inventory, world); } - + @Override public int getResultSlotIndex() { return 3; } - + @Override public int getGridWidth() { return 2; } - + @Override public int getGridHeight() { return 1; } - + @Override public int getSize() { return 4; } - + @Override public RecipeBookType getRecipeBookType() { return RecipeBookType.BLAST_FURNACE; } - + + @Override + public boolean shouldMoveToInventory(int i) { + return i != this.getResultSlotIndex(); + } + @Override public boolean stillValid(Player player) { return inventory.stillValid(player); } - + protected boolean isSmeltable(ItemStack itemStack) { - return world.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), world).isPresent(); + return world.getRecipeManager() + .getRecipeFor(AlloyingRecipe.TYPE, new SimpleContainer(itemStack), world) + .isPresent(); } - + public boolean isFuel(ItemStack itemStack) { return EndStoneSmelterBlockEntity.canUseAsFuel(itemStack); } @@ -124,7 +135,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { public ItemStack quickMoveStack(Player player, int index) { Slot slot = slots.get(index); if (slot == null || !slot.hasItem()) return ItemStack.EMPTY; - + ItemStack slotStack = slot.getItem(); ItemStack itemStack = slotStack.copy(); if (index == 3) { @@ -132,38 +143,44 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { return ItemStack.EMPTY; } slot.onQuickCraft(slotStack, itemStack); - } else if (index != 2 && index != 1 && index != 0) { + } + else if (index != 2 && index != 1 && index != 0) { if (isSmeltable(slotStack)) { if (!moveItemStackTo(slotStack, 0, 2, false)) { return ItemStack.EMPTY; } - } else if (isFuel(slotStack)) { + } + else if (isFuel(slotStack)) { if (!moveItemStackTo(slotStack, 2, 3, false)) { return ItemStack.EMPTY; } - } else if (index < 31) { + } + else if (index < 31) { if (!moveItemStackTo(slotStack, 31, 40, false)) { return ItemStack.EMPTY; } - } else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { + } + else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { return ItemStack.EMPTY; } - } else if (!moveItemStackTo(slotStack, 4, 40, false)) { + } + else if (!moveItemStackTo(slotStack, 4, 40, false)) { return ItemStack.EMPTY; } - + if (slotStack.isEmpty()) { slot.set(ItemStack.EMPTY); - } else { + } + else { slot.setChanged(); } - + if (slotStack.getCount() == itemStack.getCount()) { return ItemStack.EMPTY; } - + slot.onTake(player, slotStack); - + return itemStack; } @@ -173,7 +190,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { int timeTotal = propertyDelegate.get(3); return timeTotal != 0 && time != 0 ? time * 24 / timeTotal : 0; } - + @Environment(EnvType.CLIENT) public int getFuelProgress() { int fuelTime = propertyDelegate.get(1); @@ -182,7 +199,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { } return propertyDelegate.get(0) * 13 / fuelTime; } - + @Environment(EnvType.CLIENT) public boolean isBurning() { return propertyDelegate.get(0) > 0; diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java index 06ec70a5..60b69a99 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.ItemStack; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; public class SmelterFuelSlot extends Slot { - + private final EndStoneSmelterScreenHandler handler; public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Container inventory, int index, int x, int y) { @@ -18,7 +18,7 @@ public class SmelterFuelSlot extends Slot { public boolean mayPlace(ItemStack stack) { return this.handler.isFuel(stack) || FurnaceFuelSlot.isBucket(stack); } - + public int getMaxStackSize(ItemStack stack) { return FurnaceFuelSlot.isBucket(stack) ? 1 : super.getMaxStackSize(stack); } diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java index 212eb179..3fa93cd8 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java @@ -7,38 +7,37 @@ import net.minecraft.world.item.ItemStack; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; public class SmelterOutputSlot extends Slot { - + private Player player; private int amount; - + public SmelterOutputSlot(Player player, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.player = player; } - + public boolean mayPlace(ItemStack stack) { return false; } - + public ItemStack remove(int amount) { if (this.hasItem()) { this.amount += Math.min(amount, this.getItem().getCount()); } - + return super.remove(amount); } - - public ItemStack onTake(Player player, ItemStack stack) { + + public void onTake(Player player, ItemStack stack) { this.checkTakeAchievements(stack); super.onTake(player, stack); - return stack; } - + protected void onQuickCraft(ItemStack stack, int amount) { this.amount += amount; this.checkTakeAchievements(stack); } - + protected void checkTakeAchievements(ItemStack stack) { stack.onCraftedBy(this.player.level, this.player, this.amount); if (!this.player.level.isClientSide && this.container instanceof EndStoneSmelterBlockEntity) { diff --git a/src/main/java/ru/betterend/client/models/Patterns.java b/src/main/java/ru/betterend/client/models/Patterns.java index d78a1327..9c66adda 100644 --- a/src/main/java/ru/betterend/client/models/Patterns.java +++ b/src/main/java/ru/betterend/client/models/Patterns.java @@ -1,5 +1,11 @@ package ru.betterend.client.models; +import com.google.common.collect.Maps; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import ru.betterend.BetterEnd; + import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -10,13 +16,6 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; -import com.google.common.collect.Maps; - -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import ru.betterend.BetterEnd; - public class Patterns { //Block Models public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -40,27 +39,35 @@ public class Patterns { public final static ResourceLocation BLOCK_DOOR_TOP = BetterEnd.makeID("patterns/block/door_top.json"); public final static ResourceLocation BLOCK_DOOR_TOP_HINGE = BetterEnd.makeID("patterns/block/door_top_hinge.json"); public final static ResourceLocation BLOCK_DOOR_BOTTOM = BetterEnd.makeID("patterns/block/door_bottom.json"); - public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID("patterns/block/door_bottom_hinge.json"); + public final static ResourceLocation BLOCK_DOOR_BOTTOM_HINGE = BetterEnd.makeID( + "patterns/block/door_bottom_hinge.json"); public final static ResourceLocation BLOCK_CROSS = BetterEnd.makeID("patterns/block/cross.json"); public final static ResourceLocation BLOCK_CROSS_SHADED = BetterEnd.makeID("patterns/block/cross_shaded.json"); public final static ResourceLocation BLOCK_GATE_CLOSED = BetterEnd.makeID("patterns/block/fence_gate_closed.json"); - public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID("patterns/block/wall_gate_closed.json"); + public final static ResourceLocation BLOCK_GATE_CLOSED_WALL = BetterEnd.makeID( + "patterns/block/wall_gate_closed.json"); public final static ResourceLocation BLOCK_GATE_OPEN = BetterEnd.makeID("patterns/block/fence_gate_open.json"); public final static ResourceLocation BLOCK_GATE_OPEN_WALL = BetterEnd.makeID("patterns/block/wall_gate_open.json"); public final static ResourceLocation BLOCK_TRAPDOOR = BetterEnd.makeID("patterns/block/trapdoor.json"); public final static ResourceLocation BLOCK_LADDER = BetterEnd.makeID("patterns/block/ladder.json"); public final static ResourceLocation BLOCK_BARREL_OPEN = BetterEnd.makeID("patterns/block/barrel_open.json"); - public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID("patterns/block/pedestal_default.json"); + public final static ResourceLocation BLOCK_PEDESTAL_DEFAULT = BetterEnd.makeID( + "patterns/block/pedestal_default.json"); public final static ResourceLocation BLOKC_PEDESTAL_COLUMN = BetterEnd.makeID("patterns/block/pedestal_column.json"); - public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID("patterns/block/pedestal_column_top.json"); + public final static ResourceLocation BLOCK_PEDESTAL_COLUMN_TOP = BetterEnd.makeID( + "patterns/block/pedestal_column_top.json"); public final static ResourceLocation BLOCK_PEDESTAL_TOP = BetterEnd.makeID("patterns/block/pedestal_top.json"); public final static ResourceLocation BLOCK_PEDESTAL_BOTTOM = BetterEnd.makeID("patterns/block/pedestal_bottom.json"); public final static ResourceLocation BLOCK_PEDESTAL_PILLAR = BetterEnd.makeID("patterns/block/pedestal_pillar.json"); public final static ResourceLocation BLOCK_BOOKSHELF = BetterEnd.makeID("patterns/block/bookshelf.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID("patterns/block/stone_lantern_ceil.json"); - public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/stone_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID("patterns/block/bulb_lantern_floor.json"); - public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID("patterns/block/bulb_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_CEIL = BetterEnd.makeID( + "patterns/block/stone_lantern_ceil.json"); + public final static ResourceLocation BLOCK_STONE_LANTERN_FLOOR = BetterEnd.makeID( + "patterns/block/stone_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_FLOOR = BetterEnd.makeID( + "patterns/block/bulb_lantern_floor.json"); + public final static ResourceLocation BLOCK_BULB_LANTERN_CEIL = BetterEnd.makeID( + "patterns/block/bulb_lantern_ceil.json"); public final static ResourceLocation BLOCK_PETAL_COLORED = BetterEnd.makeID("models/block/block_petal_colored.json"); public final static ResourceLocation BLOCK_COMPOSTER = BetterEnd.makeID("patterns/block/composter.json"); public final static ResourceLocation BLOCK_COLORED = BetterEnd.makeID("patterns/block/block_colored.json"); @@ -68,13 +75,17 @@ public class Patterns { public final static ResourceLocation BLOCK_BARS_SIDE = BetterEnd.makeID("patterns/block/bars_side.json"); public final static ResourceLocation BLOCK_ANVIL = BetterEnd.makeID("patterns/block/anvil.json"); public final static ResourceLocation BLOCK_CHAIN = BetterEnd.makeID("patterns/block/chain.json"); - public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); + public final static ResourceLocation BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID( + "patterns/block/chandelier_floor.json"); public final static ResourceLocation BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); public final static ResourceLocation BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); public final static ResourceLocation BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); public final static ResourceLocation BLOCK_FURNACE_LIT = BetterEnd.makeID("patterns/block/furnace_glow.json"); public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); + public final static ResourceLocation BLOCK_FLOWER_POT = BetterEnd.makeID("patterns/block/flower_pot.json"); + public final static ResourceLocation BLOCK_FLOWER_POT_SOIL = BetterEnd.makeID("patterns/block/flower_pot_soil.json"); + public final static ResourceLocation BLOCK_POTTED_LEAVES = BetterEnd.makeID("patterns/block/potted_leaves.json"); //Item Models public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); @@ -85,24 +96,24 @@ public class Patterns { public final static ResourceLocation ITEM_GENERATED = BetterEnd.makeID("patterns/item/pattern_item_generated.json"); public final static ResourceLocation ITEM_HANDHELD = BetterEnd.makeID("patterns/item/pattern_item_handheld.json"); public final static ResourceLocation ITEM_SPAWN_EGG = BetterEnd.makeID("patterns/item/pattern_item_spawn_egg.json"); - + public static Optional createItemGenerated(String name) { return createJson(ITEM_GENERATED, name); } - + public static Optional createBlockSimple(String name) { return Patterns.createJson(Patterns.BLOCK_BASE, name, name); } + public static Optional createBlockPillar(String name) { return Patterns.createJson(Patterns.BLOCK_PILLAR, name, name); } public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { - return buffer.lines().collect(Collectors.joining()) - .replace("%parent%", parent) - .replace("%block%", block); - } catch (Exception ex) { + return buffer.lines().collect(Collectors.joining()).replace("%parent%", parent).replace("%block%", block); + } + catch (Exception ex) { return null; } } @@ -111,29 +122,31 @@ public class Patterns { ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { return Optional.ofNullable(createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block)); - } catch (Exception ex) { + } + catch (Exception ex) { return Optional.empty(); } } - + public static Optional createJson(ResourceLocation patternId, String texture) { Map textures = Maps.newHashMap(); textures.put("%texture%", texture); return createJson(patternId, textures); } - + public static Optional createJson(ResourceLocation patternId, Map textures) { ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { - String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining()); + String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines() + .collect(Collectors.joining()); for (Entry texture : textures.entrySet()) { json = json.replace(texture.getKey(), texture.getValue()); } return Optional.of(json); - } catch (Exception ex) { + } + catch (Exception ex) { return Optional.empty(); } } - + } diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java index 6f729286..c85799c2 100644 --- a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -2,8 +2,8 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -18,14 +18,16 @@ import net.minecraft.world.entity.player.PlayerModelPart; import net.minecraft.world.item.ItemStack; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.registry.EndEntitiesRenders; public class ArmoredElytraLayer> extends ElytraLayer { - private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); - - public ArmoredElytraLayer(RenderLayerParent renderLayerParent) { - super(renderLayerParent); + private final ArmoredElytraModel elytraModel; + + public ArmoredElytraLayer(RenderLayerParent renderLayerParent, EntityModelSet entityModelSet) { + super(renderLayerParent, entityModelSet); + elytraModel = new ArmoredElytraModel<>(entityModelSet.bakeLayer(EndEntitiesRenders.ARMORED_ELYTRA)); } - + public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { ItemStack itemStack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); if (itemStack.getItem() instanceof FallFlyingItem) { @@ -34,16 +36,23 @@ public class ArmoredElytraLayer AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) { wingsTexture = abstractClientPlayer.getElytraTextureLocation(); - } else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer.isModelPartShown(PlayerModelPart.CAPE)) { + } + else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer + .isModelPartShown(PlayerModelPart.CAPE)) { wingsTexture = abstractClientPlayer.getCloakTextureLocation(); } } - + poseStack.pushPose(); poseStack.translate(0.0D, 0.0D, 0.125D); getParentModel().copyPropertiesTo(elytraModel); elytraModel.setupAnim(livingEntity, f, g, j, k, l); - VertexConsumer vertexConsumer = ItemRenderer.getArmorFoilBuffer(multiBufferSource, RenderType.armorCutoutNoCull(wingsTexture), false, itemStack.hasFoil()); + VertexConsumer vertexConsumer = ItemRenderer.getArmorFoilBuffer( + multiBufferSource, + RenderType.armorCutoutNoCull(wingsTexture), + false, + itemStack.hasFoil() + ); elytraModel.renderToBuffer(poseStack, vertexConsumer, i, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); poseStack.popPose(); } diff --git a/src/main/java/ru/betterend/client/render/BeamRenderer.java b/src/main/java/ru/betterend/client/render/BeamRenderer.java index 88de8add..18a77275 100644 --- a/src/main/java/ru/betterend/client/render/BeamRenderer.java +++ b/src/main/java/ru/betterend/client/render/BeamRenderer.java @@ -5,7 +5,6 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -22,7 +21,7 @@ public class BeamRenderer { int maxBY = minY + maxY; float delta = maxY < 0 ? tick : -tick; - float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); + float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); float xIn = -beamIn; float minV = Mth.clamp(fractDelta - 1.0F, 0.0F, 1.0F); float maxV = (float) maxY * (0.5F / beamIn) + minV; @@ -32,32 +31,152 @@ public class BeamRenderer { matrices.pushPose(); matrices.mulPose(Vector3f.YP.rotation(-rotation)); - renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, beamIn, 0.0F, 0.0F, beamIn, 0.0F, xIn, xIn, 0.0F, 0.0F, 1.0F, minV, maxV); + renderBeam( + matrices, + vertexConsumer, + red, + green, + blue, + alpha, + minY, + maxBY, + beamIn, + 0.0F, + 0.0F, + beamIn, + 0.0F, + xIn, + xIn, + 0.0F, + 0.0F, + 1.0F, + minV, + maxV + ); float xOut = -beamOut; maxV = (float) maxY + minV; - renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, xOut, xOut, beamOut, xOut, xOut, beamOut, beamOut, beamOut, 0.0F, 1.0F, minV, maxV); + renderBeam( + matrices, + vertexConsumer, + red, + green, + blue, + alpha, + minY, + maxBY, + xOut, + xOut, + beamOut, + xOut, + xOut, + beamOut, + beamOut, + beamOut, + 0.0F, + 1.0F, + minV, + maxV + ); matrices.popPose(); } - + private static void renderBeam(PoseStack matrices, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, float x4, float d4, float minU, float maxU, float minV, float maxV) { PoseStack.Pose entry = matrices.last(); Matrix4f matrix4f = entry.pose(); - Matrix3f matrix3f = entry.normal(); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x1, d1, x2, d2, minU, maxU, minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x4, d4, x3, d3, minU, maxU, minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x2, d2, x4, d4, minU, maxU, minV, maxV); - renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x3, d3, x1, d1, minU, maxU, minV, maxV); + Matrix3f matrix3f = entry.normal(); + renderBeam( + matrix4f, + matrix3f, + vertexConsumer, + red, + green, + blue, + alpha, + maxY, + minY, + x1, + d1, + x2, + d2, + minU, + maxU, + minV, + maxV + ); + renderBeam( + matrix4f, + matrix3f, + vertexConsumer, + red, + green, + blue, + alpha, + maxY, + minY, + x4, + d4, + x3, + d3, + minU, + maxU, + minV, + maxV + ); + renderBeam( + matrix4f, + matrix3f, + vertexConsumer, + red, + green, + blue, + alpha, + maxY, + minY, + x2, + d2, + x4, + d4, + minU, + maxU, + minV, + maxV + ); + renderBeam( + matrix4f, + matrix3f, + vertexConsumer, + red, + green, + blue, + alpha, + maxY, + minY, + x3, + d3, + x1, + d1, + minU, + maxU, + minV, + maxV + ); } - + private static void renderBeam(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float minX, float minD, float maxX, float maxD, float minU, float maxU, float minV, float maxV) { addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxX, minY, maxD, maxU, minV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxX, maxY, maxD, maxU, maxV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, minX, maxY, minD, minU, maxV); addVertex(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, minX, minY, minD, minU, minV); } - + private static void addVertex(Matrix4f matrix4f, Matrix3f matrix3f, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, float x, float y, float d, float u, float v) { - vertexConsumer.vertex(matrix4f, x, y, d).color(red, green, blue, alpha).uv(u, v).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(15728880).normal(matrix3f, 0.0F, 1.0F, 0.0F).endVertex(); + vertexConsumer.vertex(matrix4f, x, y, d) + .color(red, green, blue, alpha) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(15728880) + .normal(matrix3f, 0.0F, 1.0F, 0.0F) + .endVertex(); } } diff --git a/src/main/java/ru/betterend/client/render/BetterEndSkyRenderer.java b/src/main/java/ru/betterend/client/render/BetterEndSkyRenderer.java new file mode 100644 index 00000000..a1f7f084 --- /dev/null +++ b/src/main/java/ru/betterend/client/render/BetterEndSkyRenderer.java @@ -0,0 +1,407 @@ +package ru.betterend.client.render; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; +import net.fabricmc.fabric.api.client.rendering.v1.DimensionRenderingRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.util.BackgroundInfo; +import ru.bclib.util.MHelper; +import ru.betterend.BetterEnd; + +import java.util.Random; + +public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRenderer { + private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); + private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); + private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); + private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); + private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); + + private VertexBuffer nebula1; + private VertexBuffer nebula2; + private VertexBuffer horizon; + private VertexBuffer stars1; + private VertexBuffer stars2; + private VertexBuffer stars3; + private VertexBuffer stars4; + private VertexBuffer fog; + private Vector3f axis1; + private Vector3f axis2; + private Vector3f axis3; + private Vector3f axis4; + + private boolean initialised; + + private void initialise() { + if (!initialised) { + initStars(); + Random random = new Random(131); + axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis1.normalize(); + axis2.normalize(); + axis3.normalize(); + axis4.normalize(); + initialised = true; + } + } + + @Override + public void render(WorldRenderContext context) { + if (context.world() == null || context.matrixStack() == null) { + return; + } + + initialise(); + + Matrix4f projectionMatrix = context.projectionMatrix(); + PoseStack matrices = context.matrixStack(); + + float time = ((context.world().getDayTime() + context.tickDelta()) % 360000) * 0.000017453292F; + float time2 = time * 2; + float time3 = time * 3; + + FogRenderer.levelFogColor(); + RenderSystem.depthMask(false); + RenderSystem.enableTexture(); + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(1.0F ,1.0F ,1.0F ,1.0F); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + + float blindA = 1F - BackgroundInfo.blindness; + float blind02 = blindA * 0.2F; + float blind06 = blindA * 0.6F; + + if (blindA > 0) { + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time, 0, false)); + RenderSystem.setShaderTexture(0, HORIZON); + renderBuffer(matrices, projectionMatrix, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, -time, 0, false)); + RenderSystem.setShaderTexture(0, NEBULA_1); + renderBuffer(matrices, projectionMatrix, nebula1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time2, 0, false)); + RenderSystem.setShaderTexture(0, NEBULA_2); + renderBuffer(matrices, projectionMatrix, nebula2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + RenderSystem.setShaderTexture(0, STARS); + + matrices.pushPose(); + matrices.mulPose(axis3.rotation(time)); + renderBuffer(matrices, projectionMatrix, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis4.rotation(time2)); + renderBuffer(matrices, projectionMatrix, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + matrices.popPose(); + } + + float a = (BackgroundInfo.fogDensity - 1F); + if (a > 0) { + if (a > 1) a = 1; + RenderSystem.setShaderTexture(0, FOG); + renderBuffer( + matrices, + projectionMatrix, + fog, + DefaultVertexFormat.POSITION_TEX, + BackgroundInfo.fogColorRed, + BackgroundInfo.fogColorGreen, + BackgroundInfo.fogColorBlue, + a); + } + + RenderSystem.disableTexture(); + + if (blindA > 0) { + matrices.pushPose(); + matrices.mulPose(axis1.rotation(time3)); + renderBuffer(matrices, projectionMatrix, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis2.rotation(time2)); + renderBuffer(matrices, projectionMatrix, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + matrices.popPose(); + } + + RenderSystem.enableTexture(); + RenderSystem.depthMask(true); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableBlend(); + } + + private void renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + RenderSystem.setShaderColor(r, g, b, a); + if (format == DefaultVertexFormat.POSITION) { + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionShader()); + } + else { + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); + } + } + + private void initStars() { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + stars1 = buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); + stars2 = buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); + stars3 = buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); + stars4 = buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); + nebula1 = buildBufferFarFog(buffer, nebula1, 40, 60, 30, 11515); + nebula2 = buildBufferFarFog(buffer, nebula2, 40, 60, 10, 14151); + horizon = buildBufferHorizon(buffer, horizon); + fog = buildBufferFog(buffer, fog); + } + + private VertexBuffer buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(); + makeStars(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(); + makeUVStars(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(); + makeFarFog(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(); + makeCylinder(bufferBuilder, 16, 50, 100); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { + if (buffer != null) { + buffer.close(); + } + + buffer = new VertexBuffer(); + makeCylinder(bufferBuilder, 16, 50, 70); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private void makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + + double px = posX * 100.0; + double py = posY * 100.0; + double pz = posZ * 100.0; + + double angle = Math.atan2(posX, posZ); + double sin1 = Math.sin(angle); + double cos1 = Math.cos(angle); + angle = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double sin2 = Math.sin(angle); + double cos2 = Math.cos(angle); + angle = random.nextDouble() * Math.PI * 2.0; + double sin3 = Math.sin(angle); + double cos3 = Math.cos(angle); + + for (int index = 0; index < 4; ++index) { + double x = (double) ((index & 2) - 1) * size; + double y = (double) ((index + 1 & 2) - 1) * size; + double aa = x * cos3 - y * sin3; + double ab = y * cos3 + x * sin3; + double dy = aa * sin2 + 0.0 * cos2; + double ae = 0.0 * sin2 - aa * cos2; + double dx = ae * sin1 - ab * cos1; + double dz = ab * sin1 + ae * cos1; + buffer.vertex(px + dx, py + dy, pz + dz).endVertex(); + } + } + } + } + + private void makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + + double px = posX * 100.0; + double py = posY * 100.0; + double pz = posZ * 100.0; + + double angle = Math.atan2(posX, posZ); + double sin1 = Math.sin(angle); + double cos1 = Math.cos(angle); + angle = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double sin2 = Math.sin(angle); + double cos2 = Math.cos(angle); + angle = random.nextDouble() * Math.PI * 2.0; + double sin3 = Math.sin(angle); + double cos3 = Math.cos(angle); + + float minV = random.nextInt(4) / 4F; + for (int index = 0; index < 4; ++index) { + double x = (double) ((index & 2) - 1) * size; + double y = (double) ((index + 1 & 2) - 1) * size; + double aa = x * cos3 - y * sin3; + double ab = y * cos3 + x * sin3; + double dy = aa * sin2 + 0.0 * cos2; + double ae = 0.0 * sin2 - aa * cos2; + double dx = ae * sin1 - ab * cos1; + double dz = ab * sin1 + ae * cos1; + float texU = (index >> 1) & 1; + float texV = (((index + 1) >> 1) & 1) / 4F + minV; + buffer.vertex(px + dx, py + dy, pz + dz).uv(texU, texV).endVertex(); + } + } + } + } + + private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() - 0.5; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + double distance = 2.0; + + if (length < 1.0 && length > 0.001) { + length = distance / Math.sqrt(length); + size *= distance; + posX *= length; + posY *= length; + posZ *= length; + + double px = posX * 100.0; + double py = posY * 100.0; + double pz = posZ * 100.0; + + double angle = Math.atan2(posX, posZ); + double sin1 = Math.sin(angle); + double cos1 = Math.cos(angle); + angle = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double sin2 = Math.sin(angle); + double cos2 = Math.cos(angle); + angle = random.nextDouble() * Math.PI * 2.0; + double sin3 = Math.sin(angle); + double cos3 = Math.cos(angle); + + for (int index = 0; index < 4; ++index) { + double x = (double) ((index & 2) - 1) * size; + double y = (double) ((index + 1 & 2) - 1) * size; + double aa = x * cos3 - y * sin3; + double ab = y * cos3 + x * sin3; + double dy = aa * sin2 + 0.0 * cos2; + double ae = 0.0 * sin2 - aa * cos2; + double dx = ae * sin1 - ab * cos1; + double dz = ab * sin1 + ae * cos1; + float texU = (index >> 1) & 1; + float texV = ((index + 1) >> 1) & 1; + buffer.vertex(px + dx, py + dy, pz + dz).uv(texU, texV).endVertex(); + } + } + } + } + + private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + for (int i = 0; i < segments; i++) { + double a1 = (double) i * Math.PI * 2.0 / (double) segments; + double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; + double px1 = Math.sin(a1) * radius; + double pz1 = Math.cos(a1) * radius; + double px2 = Math.sin(a2) * radius; + double pz2 = Math.cos(a2) * radius; + + float u0 = (float) i / (float) segments; + float u1 = (float) (i + 1) / (float) segments; + + buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); + buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); + buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); + buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); + } + } +} diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index c75dfc93..cb48989c 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -4,16 +4,22 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; - import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; public class EndCrystalRenderer { - private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal.png"); - private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation("textures/entity/end_crystal/end_crystal_beam.png"); + private static final ResourceLocation CRYSTAL_TEXTURE = new ResourceLocation( + "textures/entity/end_crystal/end_crystal.png"); + private static final ResourceLocation CRYSTAL_BEAM_TEXTURE = new ResourceLocation( + "textures/entity/end_crystal/end_crystal_beam.png"); private static final RenderType END_CRYSTAL; private static final ModelPart CORE; private static final ModelPart FRAME; @@ -42,13 +48,31 @@ public class EndCrystalRenderer { matrices.popPose(); } + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild( + "FRAME", + CubeListBuilder.create().texOffs(0, 0).addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + "CORE", + CubeListBuilder.create().texOffs(32, 0).addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), + PartPose.ZERO + ); + + return LayerDefinition.create(modelData, 64, 32); + } + static { END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); - FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - CORE = new ModelPart(64, 32, 32, 0); - CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + FRAME = root.getChild("FRAME"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index f9100d9d..1d250918 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -3,8 +3,12 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; - import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -15,6 +19,7 @@ import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.AuroraCrystalBlock; +// TODO make crystals bright public class EternalCrystalRenderer { private static final RenderType RENDER_LAYER; private static final ModelPart[] SHARDS; @@ -27,13 +32,31 @@ public class EternalCrystalRenderer { matrices.pushPose(); matrices.scale(0.6F, 0.6F, 0.6F); matrices.mulPose(Vector3f.YP.rotation(rotation)); - CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + CORE.render( + matrices, + vertexConsumer, + light, + OverlayTexture.NO_OVERLAY, + colors[0], + colors[1], + colors[2], + colors[3] + ); for (int i = 0; i < 4; i++) { matrices.pushPose(); float offset = Mth.sin(rotation * 2 + i) * 0.15F; matrices.translate(0, offset, 0); - SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); + SHARDS[i].render( + matrices, + vertexConsumer, + light, + OverlayTexture.NO_OVERLAY, + colors[0], + colors[1], + colors[2], + colors[3] + ); matrices.popPose(); } @@ -57,14 +80,51 @@ public class EternalCrystalRenderer { return ColorUtil.toFloatArray(ColorUtil.color(r, g, b)); } + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild( + "SHARDS_0", + CubeListBuilder.create().texOffs(2, 4).addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + "SHARDS_1", + CubeListBuilder.create().texOffs(2, 4).addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + "SHARDS_2", + CubeListBuilder.create().texOffs(2, 4).addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + "SHARDS_3", + CubeListBuilder.create().texOffs(2, 4).addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + "CORE", + CubeListBuilder.create().texOffs(0, 0).addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f), + PartPose.ZERO + ); + + return LayerDefinition.create(modelData, 16, 16); + } + static { - RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); + RENDER_LAYER = RenderType.itemEntityTranslucentCull(BetterEnd.makeID("textures/entity/eternal_crystal.png")); SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - CORE = new ModelPart(16, 16, 0, 0); - CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + SHARDS[0] = root.getChild("SHARDS_0"); + SHARDS[1] = root.getChild("SHARDS_1"); + SHARDS[2] = root.getChild("SHARDS_2"); + SHARDS[3] = root.getChild("SHARDS_3"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index e66cdee8..9b19e613 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -2,14 +2,13 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; @@ -24,50 +23,49 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) -public class PedestalItemRenderer extends BlockEntityRenderer { - - public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { - super(dispatcher); +public class PedestalItemRenderer implements BlockEntityRenderer { + public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) { + super(); } - + @Override - public void render(T blockEntity, float tickDelta, PoseStack matrices, - MultiBufferSource vertexConsumers, int light, int overlay) { - + public void render(T blockEntity, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) { Level world = blockEntity.getLevel(); if (world == null || blockEntity.isEmpty()) return; - + BlockState state = world.getBlockState(blockEntity.getBlockPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; ItemStack activeItem = blockEntity.getItem(0); - + matrices.pushPose(); Minecraft minecraft = Minecraft.getInstance(); - BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null); + BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0); Vector3f translate = model.getTransforms().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); - matrices.translate(translate.x(), translate.y(), translate.z()); - matrices.translate(0.5, pedestal.getHeight(state), 0.5); + matrices.translate(translate.x() + 0.5, translate.y() + pedestal.getHeight(state), translate.z() + 0.5); if (activeItem.getItem() instanceof BlockItem) { matrices.scale(1.5F, 1.5F, 1.5F); - } else { + } + else { matrices.scale(1.25F, 1.25F, 1.25F); } - int age = blockEntity.getAge(); + int age = (int) (minecraft.level.getGameTime() % 314); if (state.is(EndBlocks.ETERNAL_PEDESTAL) && state.getValue(EternalPedestal.ACTIVATED)) { float[] colors = EternalCrystalRenderer.colors(age); int y = blockEntity.getBlockPos().getY(); BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, 0.16F); - float altitude = Mth.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; + float altitude = Mth.sin((age + tickDelta) / 10.0F) * 0.1F + 0.1F; matrices.translate(0.0D, altitude, 0.0D); } if (activeItem.getItem() == Items.END_CRYSTAL) { - EndCrystalRenderer.render(age, blockEntity.getMaxAge(), tickDelta, matrices, vertexConsumers, light); - } else if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { + EndCrystalRenderer.render(age, 314, tickDelta, matrices, vertexConsumers, light); + } + else if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { EternalCrystalRenderer.render(age, tickDelta, matrices, vertexConsumers, light); - } else { + } + else { float rotation = (age + tickDelta) / 25.0F + 6.0F; matrices.mulPose(Vector3f.YP.rotation(rotation)); minecraft.getItemRenderer().render(activeItem, ItemTransforms.TransformType.GROUND, false, matrices, vertexConsumers, light, overlay, model); diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/complexmaterials/ColoredMaterial.java similarity index 75% rename from src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java rename to src/main/java/ru/betterend/complexmaterials/ColoredMaterial.java index 9ae68e51..f27aa10a 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/complexmaterials/ColoredMaterial.java @@ -1,62 +1,72 @@ -package ru.betterend.blocks.complex; - -import java.util.Map; -import java.util.function.Function; - -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.core.Registry; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.DyeItem; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.material.MaterialColor; -import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.BlocksHelper; -import ru.betterend.BetterEnd; -import ru.betterend.config.Configs; -import ru.betterend.registry.EndBlocks; - -public class ColoredMaterial { - private static final Map DYES = Maps.newHashMap(); - private static final Map COLORS = Maps.newHashMap(); - private final Map colors = Maps.newHashMap(); - - public ColoredMaterial(Function constructor, Block source, boolean craftEight) { - this(constructor, source, COLORS, DYES, craftEight); - } - - public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { - String id = Registry.BLOCK.getKey(source).getPath(); - colors.forEach((color, name) -> { - String blockName = id + "_" + name; - Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); - EndBlocks.registerBlock(blockName, block); - if (craftEight) { - GridRecipe.make(BetterEnd.MOD_ID, blockName, block).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); - } - else { - GridRecipe.make(BetterEnd.MOD_ID, blockName, block).checkConfig(Configs.RECIPE_CONFIG).setList("#D").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); - } - this.colors.put(color, block); - BlocksHelper.addBlockColor(block, color); - }); - } - - public Block getByColor(DyeColor color) { - return colors.get(color.getMaterialColor().col); - } - - public Block getByColor(int color) { - return colors.get(color); - } - - static { - for (DyeColor color: DyeColor.values()) { - int colorRGB = color.getMaterialColor().col; - COLORS.put(colorRGB, color.getName()); - DYES.put(colorRGB, DyeItem.byColor(color)); - } - } -} +package ru.betterend.complexmaterials; + +import com.google.common.collect.Maps; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.DyeItem; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.MaterialColor; +import ru.bclib.recipes.GridRecipe; +import ru.bclib.util.BlocksHelper; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.registry.EndBlocks; + +import java.util.Map; +import java.util.function.Function; + +public class ColoredMaterial { + private static final Map DYES = Maps.newHashMap(); + private static final Map COLORS = Maps.newHashMap(); + private final Map colors = Maps.newHashMap(); + + public ColoredMaterial(Function constructor, Block source, boolean craftEight) { + this(constructor, source, COLORS, DYES, craftEight); + } + + public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { + String id = Registry.BLOCK.getKey(source).getPath(); + colors.forEach((color, name) -> { + String blockName = id + "_" + name; + Block block = constructor.apply(FabricBlockSettings.copyOf(source).mapColor(MaterialColor.COLOR_BLACK)); + EndBlocks.registerBlock(blockName, block); + if (craftEight) { + GridRecipe.make(BetterEnd.MOD_ID, blockName, block) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(8) + .setShape("###", "#D#", "###") + .addMaterial('#', source) + .addMaterial('D', dyes.get(color)) + .build(); + } + else { + GridRecipe.make(BetterEnd.MOD_ID, blockName, block) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#D") + .addMaterial('#', source) + .addMaterial('D', dyes.get(color)) + .build(); + } + this.colors.put(color, block); + BlocksHelper.addBlockColor(block, color); + }); + } + + public Block getByColor(DyeColor color) { + return colors.get(color.getMaterialColor().col); + } + + public Block getByColor(int color) { + return colors.get(color); + } + + static { + for (DyeColor color : DyeColor.values()) { + int colorRGB = color.getMaterialColor().col; + COLORS.put(colorRGB, color.getName()); + DYES.put(colorRGB, DyeItem.byColor(color)); + } + } +} diff --git a/src/main/java/ru/betterend/complexmaterials/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/complexmaterials/CrystalSubblocksMaterial.java new file mode 100644 index 00000000..1582a268 --- /dev/null +++ b/src/main/java/ru/betterend/complexmaterials/CrystalSubblocksMaterial.java @@ -0,0 +1,133 @@ +package ru.betterend.complexmaterials; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; +import ru.bclib.api.TagAPI; +import ru.bclib.blocks.BaseSlabBlock; +import ru.bclib.blocks.BaseStairsBlock; +import ru.bclib.blocks.BaseWallBlock; +import ru.bclib.recipes.GridRecipe; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.EndPedestal; +import ru.betterend.blocks.basis.LitBaseBlock; +import ru.betterend.blocks.basis.LitPillarBlock; +import ru.betterend.config.Configs; +import ru.betterend.recipe.CraftingRecipes; +import ru.betterend.registry.EndBlocks; + +public class CrystalSubblocksMaterial { + public final Block polished; + public final Block tiles; + public final Block pillar; + public final Block stairs; + public final Block slab; + public final Block wall; + public final Block pedestal; + public final Block bricks; + public final Block brick_stairs; + public final Block brick_slab; + public final Block brick_wall; + + public CrystalSubblocksMaterial(String name, Block source) { + FabricBlockSettings material = FabricBlockSettings.copyOf(source); + polished = EndBlocks.registerBlock(name + "_polished", new LitBaseBlock(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new LitBaseBlock(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new LitPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(source)); + slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(source)); + wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(source)); + pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(source)); + bricks = EndBlocks.registerBlock(name + "_bricks", new LitBaseBlock(material)); + brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); + brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); + brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); + + // Recipes // + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', source) + .setGroup("end_bricks") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', bricks) + .setGroup("end_tile") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', polished) + .setGroup("end_small_tile") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("#", "#") + .addMaterial('#', slab) + .setGroup("end_pillar") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', source) + .setGroup("end_stone_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', source) + .setGroup("end_stone_slabs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', bricks) + .setGroup("end_stone_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', bricks) + .setGroup("end_stone_slabs") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###", "###") + .addMaterial('#', source) + .setGroup("end_wall") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###", "###") + .addMaterial('#', bricks) + .setGroup("end_wall") + .build(); + + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); + + // Item Tags // + TagAPI.addTag(ItemTags.SLABS, slab, brick_slab); + TagAPI.addTag(ItemTags.STONE_BRICKS, bricks); + TagAPI.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); + TagAPI.addTag(ItemTags.STONE_TOOL_MATERIALS, source); + + // Block Tags // + TagAPI.addTag(BlockTags.STONE_BRICKS, bricks); + TagAPI.addTag(BlockTags.WALLS, wall, brick_wall); + TagAPI.addTag(BlockTags.SLABS, slab, brick_slab); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/complexmaterials/EndWoodenComplexMaterial.java b/src/main/java/ru/betterend/complexmaterials/EndWoodenComplexMaterial.java new file mode 100644 index 00000000..4e01fbf0 --- /dev/null +++ b/src/main/java/ru/betterend/complexmaterials/EndWoodenComplexMaterial.java @@ -0,0 +1,45 @@ +package ru.betterend.complexmaterials; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MaterialColor; +import ru.bclib.complexmaterials.WoodenComplexMaterial; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class EndWoodenComplexMaterial extends WoodenComplexMaterial { + private Block bark; + private Block log; + + public EndWoodenComplexMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { + super(BetterEnd.MOD_ID, name, name, woodColor, planksColor); + } + + public EndWoodenComplexMaterial init() { + return (EndWoodenComplexMaterial) super.init(EndBlocks.getBlockRegistry(), EndItems.getItemRegistry(), Configs.RECIPE_CONFIG); + } + + public boolean isTreeLog(Block block) { + return block == getLog() || block == getBark(); + } + + public boolean isTreeLog(BlockState state) { + return isTreeLog(state.getBlock()); + } + + public Block getLog() { + if (log == null) { + log = getBlock("log"); + } + return log; + } + + public Block getBark() { + if (bark == null) { + bark = getBlock("bark"); + } + return bark; + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java b/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java new file mode 100644 index 00000000..53183d2d --- /dev/null +++ b/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java @@ -0,0 +1,499 @@ +package ru.betterend.complexmaterials; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Item.Properties; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tier; +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.MaterialColor; +import ru.bclib.api.TagAPI; +import ru.bclib.blocks.BaseBlock; +import ru.bclib.blocks.BaseChainBlock; +import ru.bclib.blocks.BaseDoorBlock; +import ru.bclib.blocks.BaseMetalBarsBlock; +import ru.bclib.blocks.BaseOreBlock; +import ru.bclib.blocks.BaseSlabBlock; +import ru.bclib.blocks.BaseStairsBlock; +import ru.bclib.blocks.BaseTrapdoorBlock; +import ru.bclib.blocks.WoodenPressurePlateBlock; +import ru.bclib.items.ModelProviderItem; +import ru.bclib.items.tool.BaseAxeItem; +import ru.bclib.items.tool.BaseHoeItem; +import ru.bclib.items.tool.BaseShovelItem; +import ru.bclib.items.tool.BaseSwordItem; +import ru.bclib.recipes.AnvilRecipe; +import ru.bclib.recipes.FurnaceRecipe; +import ru.bclib.recipes.GridRecipe; +import ru.bclib.recipes.SmithingTableRecipe; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.config.Configs; +import ru.betterend.item.EndArmorItem; +import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndPickaxe; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class MetalMaterial { + public final Block ore; + public final Block block; + public final Block tile; + public final Block bars; + public final Block pressurePlate; + public final Block door; + public final Block trapdoor; + public final Block chain; + public final Block stairs; + public final Block slab; + + public final Block chandelier; + public final Block bulb_lantern; + public final ColoredMaterial bulb_lantern_colored; + + public final Block anvilBlock; + + public final Item rawOre; + public final Item nugget; + public final Item ingot; + + public final Item shovelHead; + public final Item pickaxeHead; + public final Item axeHead; + public final Item hoeHead; + public final Item swordBlade; + public final Item swordHandle; + + public final Item shovel; + public final Item sword; + public final Item pickaxe; + public final Item axe; + public final Item hoe; + public final Item hammer; + + public final Item forgedPlate; + public final Item helmet; + public final Item chestplate; + public final Item leggings; + public final Item boots; + + public final Tag.Named alloyingOre; + + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + true, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), + EndItems.makeEndItemSettings(), + material, + armor + ); + } + + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + true, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) + .mapColor(color) + .hardness(hardness) + .resistance(resistance), + EndItems.makeEndItemSettings(), + material, + armor + ); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + false, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), + EndItems.makeEndItemSettings(), + material, + armor + ); + } + + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + false, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) + .mapColor(color) + .hardness(hardness) + .resistance(resistance), + EndItems.makeEndItemSettings(), + material, + armor + ); + } + + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { + BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings) + .hardness(1) + .resistance(1) + .luminance(15) + .sound(SoundType.LANTERN); + final int level = material.getLevel(); + + rawOre = hasOre ? EndItems.registerEndItem(name + "_raw", new ModelProviderItem(itemSettings)) : null; + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseOreBlock(()->rawOre, 1, 3, 1)) : null; + alloyingOre = hasOre ? TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_alloying") : null; + if (hasOre) { + TagAPI.addTag(alloyingOre, ore, rawOre); + } + + block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); + tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); + stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); + slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(tile)); + door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(block)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(block)); + bars = EndBlocks.registerBlock(name + "_bars", new BaseMetalBarsBlock(block)); + chain = EndBlocks.registerBlock(name + "_chain", new BaseChainBlock(block.defaultMaterialColor())); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(block)); + + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); + bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); + bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); + + nugget = EndItems.registerEndItem(name + "_nugget", new ModelProviderItem(itemSettings)); + ingot = EndItems.registerEndItem(name + "_ingot", new ModelProviderItem(itemSettings)); + + shovelHead = EndItems.registerEndItem(name + "_shovel_head"); + pickaxeHead = EndItems.registerEndItem(name + "_pickaxe_head"); + axeHead = EndItems.registerEndItem(name + "_axe_head"); + hoeHead = EndItems.registerEndItem(name + "_hoe_head"); + swordBlade = EndItems.registerEndItem(name + "_sword_blade"); + swordHandle = EndItems.registerEndItem(name + "_sword_handle"); + + shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); + sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); + pickaxe = EndItems.registerEndTool(name + "_pickaxe", new EndPickaxe(material, 1, -2.8F, itemSettings)); + axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); + hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); + hammer = EndItems.registerEndTool( + name + "_hammer", + new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings) + ); + + forgedPlate = EndItems.registerEndItem(name + "_forged_plate"); + helmet = EndItems.registerEndItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); + chestplate = EndItems.registerEndItem( + name + "_chestplate", + new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings) + ); + leggings = EndItems.registerEndItem( + name + "_leggings", + new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings) + ); + boots = EndItems.registerEndItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); + + anvilBlock = EndBlocks.registerBlock( + name + "_anvil", + new EndAnvilBlock(this, block.defaultMaterialColor(), level) + ); + + if (hasOre) { + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_ingot") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_raw", rawOre, ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_ingot") + .buildWithBlasting(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy") + .setInput(alloyingOre, alloyingOre) + .setOutput(ingot, 3) + .setExpiriense(2.1F) + .build(); + } + + // Basic recipes + GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_nuggets", ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', nugget) + .setGroup("end_metal_ingots_nug") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_nuggets_from_ingot", nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(9) + .setList("#") + .addMaterial('#', ingot) + .setGroup("end_metal_nuggets_ing") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_block", block) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', ingot) + .setGroup("end_metal_blocks") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_block", ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(9) + .setList("#") + .addMaterial('#', block) + .setGroup("end_metal_ingots") + .build(); + + // Block recipes + GridRecipe.make(BetterEnd.MOD_ID, name + "_tile", tile) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', block) + .setGroup("end_metal_tiles") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bars", bars) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(16) + .setShape("###", "###") + .addMaterial('#', ingot) + .setGroup("end_metal_bars") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##") + .addMaterial('#', ingot) + .setGroup("end_metal_plates") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_door", door) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(3) + .setShape("##", "##", "##") + .addMaterial('#', ingot) + .setGroup("end_metal_doors") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_trapdoor", trapdoor) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', ingot) + .setGroup("end_metal_trapdoors") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', block, tile) + .setGroup("end_metal_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', block, tile) + .setGroup("end_metal_slabs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_chain", chain) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("N", "#", "N") + .addMaterial('#', ingot) + .addMaterial('N', nugget) + .setGroup("end_metal_chain") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_anvil", anvilBlock) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", " I ", "III") + .addMaterial('#', block, tile) + .addMaterial('I', ingot) + .setGroup("end_metal_anvil") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bulb_lantern", bulb_lantern) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("C", "I", "#") + .addMaterial('C', chain) + .addMaterial('I', ingot) + .addMaterial('#', EndItems.GLOWING_BULB) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_chandelier", chandelier) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("I#I", " # ") + .addMaterial('#', ingot) + .addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier") + .build(); + + // Tools & armor into nuggets + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_axe_nugget", axe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hoe_nugget", hoe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_pickaxe_nugget", pickaxe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_sword_nugget", sword, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hammer_nugget", hammer, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_helmet_nugget", helmet, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_chestplate_nugget", chestplate, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_leggings_nugget", leggings, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_boots_nugget", boots, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + + // Tool parts from ingots + AnvilRecipe.create(name + "_shovel_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(shovelHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_pickaxe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(3) + .setOutput(pickaxeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_axe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(3) + .setOutput(axeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_hoe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(2) + .setOutput(hoeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_sword_blade") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(swordBlade) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_forged_plate") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(forgedPlate) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + + // Tools from parts + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hammer") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(hammer) + .setBase(block) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_axe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(axe) + .setBase(axeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_pickaxe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(pickaxe) + .setBase(pickaxeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hoe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(hoe) + .setBase(hoeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword_handle") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(swordHandle) + .setBase(ingot) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(sword) + .setBase(swordBlade) + .setAddition(swordHandle) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_shovel") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(shovel) + .setBase(shovelHead) + .setAddition(Items.STICK) + .build(); + + // Armor crafting + GridRecipe.make(BetterEnd.MOD_ID, name + "_helmet", helmet) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_helmets") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_chestplate", chestplate) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# #", "###", "###") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_chestplates") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_leggings", leggings) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_leggings") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_boots", boots) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# #", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_boots") + .build(); + + TagAPI.addTag(BlockTags.ANVIL, anvilBlock); + TagAPI.addTag(BlockTags.BEACON_BASE_BLOCKS, block); + TagAPI.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); + TagAPI.addTag(TagAPI.BLOCK_DRAGON_IMMUNE, ore, bars); + TagAPI.addTag(TagAPI.ITEM_HAMMERS, hammer); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/complexmaterials/StoneMaterial.java b/src/main/java/ru/betterend/complexmaterials/StoneMaterial.java new file mode 100644 index 00000000..107471e6 --- /dev/null +++ b/src/main/java/ru/betterend/complexmaterials/StoneMaterial.java @@ -0,0 +1,198 @@ +package ru.betterend.complexmaterials; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.MaterialColor; +import ru.bclib.api.TagAPI; +import ru.bclib.blocks.BaseBlock; +import ru.bclib.blocks.BaseFurnaceBlock; +import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.bclib.blocks.BaseSlabBlock; +import ru.bclib.blocks.BaseStairsBlock; +import ru.bclib.blocks.BaseStoneButtonBlock; +import ru.bclib.blocks.BaseWallBlock; +import ru.bclib.blocks.StonePressurePlateBlock; +import ru.bclib.recipes.GridRecipe; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.EndPedestal; +import ru.betterend.blocks.FlowerPotBlock; +import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.config.Configs; +import ru.betterend.recipe.CraftingRecipes; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; + +public class StoneMaterial { + public final Block stone; + + public final Block polished; + public final Block tiles; + public final Block pillar; + public final Block stairs; + public final Block slab; + public final Block wall; + public final Block button; + public final Block pressurePlate; + public final Block pedestal; + public final Block lantern; + + public final Block bricks; + public final Block brickStairs; + public final Block brickSlab; + public final Block brickWall; + public final Block furnace; + public final Block flowerPot; + + public StoneMaterial(String name, MaterialColor color) { + FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).mapColor(color); + + stone = EndBlocks.registerBlock(name, new BaseBlock(material)); + polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); + stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(stone)); + slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(stone)); + wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(stone)); + button = EndBlocks.registerBlock(name + "_button", new BaseStoneButtonBlock(stone)); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new StonePressurePlateBlock(stone)); + pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); + lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); + + bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); + brickStairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); + brickSlab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); + brickWall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); + furnace = EndBlocks.registerBlock(name + "_furnace", new BaseFurnaceBlock(bricks)); + flowerPot = EndBlocks.registerBlock(name + "_flower_pot", new FlowerPotBlock(bricks)); + + // Recipes // + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', stone) + .setGroup("end_bricks") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', bricks) + .setGroup("end_tile") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', polished) + .setGroup("end_small_tile") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("#", "#") + .addMaterial('#', slab) + .setGroup("end_pillar") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', stone) + .setGroup("end_stone_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', stone) + .setGroup("end_stone_slabs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brickStairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', bricks) + .setGroup("end_stone_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brickSlab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', bricks) + .setGroup("end_stone_slabs") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###", "###") + .addMaterial('#', stone) + .setGroup("end_wall") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brickWall) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###", "###") + .addMaterial('#', bricks) + .setGroup("end_wall") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, name + "_button", button) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', stone) + .setGroup("end_stone_buttons") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##") + .addMaterial('#', stone) + .setGroup("end_stone_plates") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_lantern", lantern) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("S", "#", "S") + .addMaterial('#', EndItems.CRYSTAL_SHARDS) + .addMaterial('S', slab, brickSlab) + .setGroup("end_stone_lanterns") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_furnace", furnace) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #", "###") + .addMaterial('#', stone) + .setGroup("end_stone_ITEM_FURNACES") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_flower_pot", flowerPot) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(3) + .setShape("# #", " # ") + .addMaterial('#', bricks) + .setGroup("end_pots") + .build(); + + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); + + // Item Tags // + TagAPI.addTag(ItemTags.SLABS, slab, brickSlab); + TagAPI.addTag(ItemTags.STONE_BRICKS, bricks); + TagAPI.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); + TagAPI.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); + TagAPI.addTag(TagAPI.ITEM_FURNACES, furnace); + + // Block Tags // + TagAPI.addTag(BlockTags.STONE_BRICKS, bricks); + TagAPI.addTag(BlockTags.WALLS, wall, brickWall); + TagAPI.addTag(BlockTags.SLABS, slab, brickSlab); + TagAPI.addTags(pressurePlate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); + TagAPI.addTag(TagAPI.BLOCK_END_STONES, stone); + + TagAPI.addTag(TagAPI.BLOCK_DRAGON_IMMUNE, stone, stairs, slab, wall); + + TagAPI.addTag(TagAPI.BLOCK_GEN_TERRAIN, stone); + TagAPI.addTag(TagAPI.BLOCK_END_GROUND, stone); + } +} \ No newline at end of file diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 98c5d859..effb9d62 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -13,11 +13,12 @@ public class Configs { public static final PathConfig BLOCK_CONFIG = new PathConfig(BetterEnd.MOD_ID, "blocks"); public static final PathConfig ITEM_CONFIG = new PathConfig(BetterEnd.MOD_ID, "items"); public static final IdConfig BIOME_CONFIG = new EntryConfig(BetterEnd.MOD_ID, "biomes"); - public static final PathConfig GENERATOR_CONFIG = new PathConfig(BetterEnd.MOD_ID, "generator"); + public static final PathConfig GENERATOR_CONFIG = new PathConfig(BetterEnd.MOD_ID, "generator", false); public static final PathConfig RECIPE_CONFIG = new PathConfig(BetterEnd.MOD_ID, "recipes"); - + public static final PathConfig ENCHANTMENT_CONFIG = new PathConfig(BetterEnd.MOD_ID, "enchantments"); + @Environment(value = EnvType.CLIENT) - public static final PathConfig CLENT_CONFIG = new PathConfig(BetterEnd.MOD_ID, "client"); + public static final PathConfig CLENT_CONFIG = new PathConfig(BetterEnd.MOD_ID, "client", false); public static void saveConfigs() { ENTITY_CONFIG.saveChanges(); @@ -26,6 +27,7 @@ public class Configs { ITEM_CONFIG.saveChanges(); GENERATOR_CONFIG.saveChanges(); RECIPE_CONFIG.saveChanges(); + ENCHANTMENT_CONFIG.saveChanges(); if (BCLib.isClient()) { CLENT_CONFIG.saveChanges(); diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index 0b2e2394..103f36bb 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -6,8 +6,8 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.Potions; +import ru.bclib.mixin.common.PotionBrewingAccessor; import ru.betterend.BetterEnd; -import ru.betterend.mixin.common.PotionBrewingAccessor; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/effects/EndStatusEffects.java b/src/main/java/ru/betterend/effects/EndStatusEffects.java index 1a7edb84..f0948097 100644 --- a/src/main/java/ru/betterend/effects/EndStatusEffects.java +++ b/src/main/java/ru/betterend/effects/EndStatusEffects.java @@ -8,12 +8,12 @@ import ru.betterend.BetterEnd; import ru.betterend.effects.status.EndVeilEffect; public class EndStatusEffects { - public final static MobEffectInstance CRYSTALITE_HEALTH_REGEN = new MobEffectInstance(MobEffects.REGENERATION, 40, 0, true, false, true); - public final static MobEffectInstance CRYSTALITE_DIG_SPEED = new MobEffectInstance(MobEffects.DIG_SPEED, 40, 0, true, false, true); - public final static MobEffectInstance CRYSTALITE_MOVE_SPEED = new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 40, 0, true, false, true); - + public final static MobEffectInstance CRYSTALITE_HEALTH_REGEN = new MobEffectInstance(MobEffects.REGENERATION, 80, 0, true, false, true); + public final static MobEffectInstance CRYSTALITE_DIG_SPEED = new MobEffectInstance(MobEffects.DIG_SPEED, 80, 0, true, false, true); + public final static MobEffectInstance CRYSTALITE_MOVE_SPEED = new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 80, 0, true, false, true); + public final static MobEffect END_VEIL = registerEffect("end_veil", new EndVeilEffect()); - + public static MobEffect registerEffect(String name, E effect) { return Registry.register(Registry.MOB_EFFECT, BetterEnd.makeID(name), effect); } diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java index 57d040e9..852c5854 100644 --- a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -5,9 +5,9 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentCategory; public class EndVeilEnchantment extends Enchantment { - + public EndVeilEnchantment() { - super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); + super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[] {EquipmentSlot.HEAD}); } @Override diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index eff6cbb3..cbe52844 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -4,7 +4,7 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; public class EndVeilEffect extends MobEffect { - + public EndVeilEffect() { super(MobEffectCategory.BENEFICIAL, 0x0D554A); } diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index e58053f4..60a6a0f8 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -1,9 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundGameEventPacket; import net.minecraft.network.syncher.EntityDataAccessor; @@ -30,20 +26,25 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.phys.AABB; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; public class CubozoaEntity extends AbstractSchoolingFish { public static final int VARIANTS = 2; - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); - private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); - + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId( + CubozoaEntity.class, + EntityDataSerializers.BYTE + ); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId( + CubozoaEntity.class, + EntityDataSerializers.BYTE + ); + public CubozoaEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); @@ -64,21 +65,21 @@ public class CubozoaEntity extends AbstractSchoolingFish { this.refreshDimensions(); return data; } - + @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(VARIANT, (byte) 0); this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); } - + @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getVariant()); tag.putByte("Scale", getByteScale()); } - + @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); @@ -91,21 +92,22 @@ public class CubozoaEntity extends AbstractSchoolingFish { } @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("Variant", entityData.get(VARIANT)); tag.putByte("Scale", entityData.get(SCALE)); return bucket; } - + public static AttributeSupplier.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(Attributes.MAX_HEALTH, 2.0) - .add(Attributes.FOLLOW_RANGE, 16.0) - .add(Attributes.MOVEMENT_SPEED, 0.5); + return LivingEntity + .createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.5); } - + public int getVariant() { return (int) this.entityData.get(VARIANT); } @@ -113,19 +115,11 @@ public class CubozoaEntity extends AbstractSchoolingFish { public byte getByteScale() { return this.entityData.get(SCALE); } - + public float getScale() { return getByteScale() / 32F + 0.75F; } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - AABB box = new AABB(pos).inflate(16); - List list = world.getEntitiesOfClass(CubozoaEntity.class, box, (entity) -> { - return true; - }); - return list.size() < 9; - } - + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height * 0.5F; } @@ -138,7 +132,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { this.level.addFreshEntity(drop); } } - + @Override protected SoundEvent getFlopSound() { return SoundEvents.SALMON_FLOP; @@ -148,7 +142,10 @@ public class CubozoaEntity extends AbstractSchoolingFish { public void playerTouch(Player player) { if (player instanceof ServerPlayer && player.hurt(DamageSource.mobAttack(this), 0.5F)) { if (!this.isSilent()) { - ((ServerPlayer) player).connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.PUFFER_FISH_STING, 0.0F)); + ((ServerPlayer) player).connection.send(new ClientboundGameEventPacket( + ClientboundGameEventPacket.PUFFER_FISH_STING, + 0.0F + )); } if (random.nextBoolean()) { player.addEffect(new MobEffectInstance(MobEffects.POISON, 20, 0)); diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 63ff1ed3..7778cfcc 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -1,16 +1,14 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -21,24 +19,25 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.ai.util.RandomPos; -import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.phys.Vec3; +import ru.bclib.entity.DespawnableAnimal; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndSounds; -public class DragonflyEntity extends Animal implements FlyingAnimal { +import java.util.EnumSet; + +public class DragonflyEntity extends DespawnableAnimal implements FlyingAnimal { public DragonflyEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new FlyingMoveControl(this, 20, true); @@ -47,20 +46,21 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); this.xpReward = 1; } - + public static AttributeSupplier.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(Attributes.MAX_HEALTH, 8.0D) - .add(Attributes.FOLLOW_RANGE, 16.0D) - .add(Attributes.FLYING_SPEED, 1.0D) - .add(Attributes.MOVEMENT_SPEED, 0.1D); + return LivingEntity + .createLivingAttributes() + .add(Attributes.MAX_HEALTH, 8.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 1.0D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); } @Override public boolean canBeLeashed(Player player) { return false; } - + @Override protected PathNavigation createNavigation(Level world) { FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { @@ -68,7 +68,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { BlockState state = this.level.getBlockState(pos); return state.isAir() || !state.getMaterial().blocksMotion(); } - + public void tick() { super.tick(); } @@ -78,12 +78,12 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { birdNavigation.setCanPassDoors(true); return birdNavigation; } - + @Override public float getWalkTargetValue(BlockPos pos, LevelReader world) { return world.getBlockState(pos).isAir() ? 10.0F : 0.0F; } - + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -91,65 +91,65 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { this.goalSelector.addGoal(3, new FollowParentGoal(this, 1.0D)); this.goalSelector.addGoal(4, new WanderAroundGoal()); } - + @Override public boolean isPushable() { return false; } - + @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } - + @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; } - + + @Override + public boolean isFlying() { + return !this.onGround; + } + @Override public boolean isNoGravity() { return true; } - + @Override public SoundEvent getAmbientSound() { return EndSounds.ENTITY_DRAGONFLY; } - + @Override protected float getSoundVolume() { return MHelper.randRange(0.25F, 0.5F, random); } - + class DragonflyLookControl extends LookControl { DragonflyLookControl(Mob entity) { super(entity); } - + protected boolean resetXRotOnTick() { return true; } } - + class WanderAroundGoal extends Goal { WanderAroundGoal() { this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } - + public boolean canUse() { return DragonflyEntity.this.navigation.isDone() && DragonflyEntity.this.random.nextInt(10) == 0; } - + public boolean canContinueToUse() { return DragonflyEntity.this.navigation.isInProgress(); } - + public void start() { Vec3 vec3d = this.getRandomLocation(); if (vec3d != null) { @@ -160,19 +160,29 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { DragonflyEntity.this.navigation.moveTo(path, 1.0D); } } - catch (Exception e) {} + catch (Exception e) { + } } super.start(); } - + private Vec3 getRandomLocation() { int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16); Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F); - Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); + Vec3 airPos = HoverRandomPos.getPos(DragonflyEntity.this, 8, 7, rotation.x, rotation.z, 1.5707964F, 3, 1); if (airPos != null) { if (isInVoid(airPos)) { for (int i = 0; i < 8; i++) { - airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); + airPos = HoverRandomPos.getPos( + DragonflyEntity.this, + 16, + 7, + rotation.x, + rotation.z, + MHelper.PI2, + 3, + 1 + ); if (airPos != null && !isInVoid(airPos)) { return airPos; } @@ -184,22 +194,25 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } return airPos; } - return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); + return AirAndWaterRandomPos.getPos( + DragonflyEntity.this, + 8, + 4, + -2, + rotation.x, + rotation.z, + 1.5707963705062866D + ); } - + private boolean isInVoid(Vec3 pos) { int h = BlocksHelper.downRay(DragonflyEntity.this.level, new BlockPos(pos), 128); return h > 100; } } - + @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.DRAGONFLY.create(world); } - - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); - return y > 0 && pos.getY() >= y; - } } diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index dec0cad8..a89adfd2 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -1,9 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - -import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; @@ -12,7 +8,9 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.EntityDamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.MobSpawnType; @@ -21,12 +19,15 @@ import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.AbstractSchoolingFish; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.AABB; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; @@ -34,8 +35,14 @@ public class EndFishEntity extends AbstractSchoolingFish { public static final int VARIANTS_NORMAL = 5; public static final int VARIANTS_SULPHUR = 3; public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); - private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId( + EndFishEntity.class, + EntityDataSerializers.BYTE + ); + private static final EntityDataAccessor SCALE = SynchedEntityData.defineId( + EndFishEntity.class, + EntityDataSerializers.BYTE + ); public EndFishEntity(EntityType entityType, Level world) { super(entityType, world); @@ -75,7 +82,7 @@ public class EndFishEntity extends AbstractSchoolingFish { tag.putByte("Variant", (byte) getVariant()); tag.putByte("Scale", getByteScale()); } - + @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); @@ -86,31 +93,31 @@ public class EndFishEntity extends AbstractSchoolingFish { this.entityData.set(SCALE, tag.getByte("Scale")); } } - + @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("variant", entityData.get(VARIANT)); tag.putByte("scale", entityData.get(SCALE)); return bucket; } - + @Override protected SoundEvent getFlopSound() { return SoundEvents.TROPICAL_FISH_FLOP; } - + @Override protected SoundEvent getAmbientSound() { return SoundEvents.SALMON_AMBIENT; } - + @Override protected SoundEvent getDeathSound() { return SoundEvents.SALMON_DEATH; } - + @Override protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.SALMON_HURT; @@ -128,10 +135,11 @@ public class EndFishEntity extends AbstractSchoolingFish { } public static AttributeSupplier.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(Attributes.MAX_HEALTH, 2.0) - .add(Attributes.FOLLOW_RANGE, 16.0) - .add(Attributes.MOVEMENT_SPEED, 0.75); + return LivingEntity + .createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0) + .add(Attributes.FOLLOW_RANGE, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.75); } public int getVariant() { @@ -146,15 +154,17 @@ public class EndFishEntity extends AbstractSchoolingFish { return getByteScale() / 32F + 0.75F; } - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - AABB box = new AABB(pos).inflate(16); - List list = world.getEntitiesOfClass(EndFishEntity.class, box, (entity) -> { return true; }); - return list.size() < 9; - } - @Override protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { - ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); + Item item = source.isFire() ? EndItems.END_FISH_COOKED : EndItems.END_FISH_RAW; + if (causedByPlayer && source instanceof EntityDamageSource) { + EntityDamageSource damageSource = (EntityDamageSource) source; + ItemStack handItem = ((Player) damageSource.getEntity()).getItemInHand(InteractionHand.MAIN_HAND); + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FIRE_ASPECT, handItem) > 0) { + item = EndItems.END_FISH_COOKED; + } + } + ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(item)); this.level.addFreshEntity(drop); } } diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index 24662f26..f44cb34c 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -1,9 +1,5 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.particles.ParticleOptions; @@ -34,19 +30,25 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.AABB; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; +import java.util.EnumSet; +import java.util.Random; + public class EndSlimeEntity extends Slime { - private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndSlimeEntity.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId( + EndSlimeEntity.class, + EntityDataSerializers.BYTE + ); private static final MutableBlockPos POS = new MutableBlockPos(); public EndSlimeEntity(EntityType entityType, Level world) { @@ -59,18 +61,22 @@ public class EndSlimeEntity extends Slime { this.goalSelector.addGoal(2, new FaceTowardTargetGoal()); this.goalSelector.addGoal(3, new RandomLookGoal()); this.goalSelector.addGoal(5, new MoveGoal()); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { - return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; - })); + this.targetSelector.addGoal( + 1, + new NearestAttackableTargetGoal(this, Player.class, 10, true, false, (livingEntity) -> { + return Math.abs(livingEntity.getY() - this.getY()) <= 4.0D; + }) + ); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, IronGolem.class, true)); } public static AttributeSupplier.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(Attributes.MAX_HEALTH, 1.0D) - .add(Attributes.ATTACK_DAMAGE, 1.0D) - .add(Attributes.FOLLOW_RANGE, 16.0D) - .add(Attributes.MOVEMENT_SPEED, 0.15D); + return LivingEntity + .createLivingAttributes() + .add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.MOVEMENT_SPEED, 0.15D); } @Override @@ -89,7 +95,7 @@ public class EndSlimeEntity extends Slime { this.refreshDimensions(); return data; } - + @Override protected void defineSynchedData() { super.defineSynchedData(); @@ -101,7 +107,7 @@ public class EndSlimeEntity extends Slime { super.addAdditionalSaveData(tag); tag.putByte("Variant", (byte) getSlimeType()); } - + @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); @@ -109,14 +115,14 @@ public class EndSlimeEntity extends Slime { this.entityData.set(VARIANT, tag.getByte("Variant")); } } - + @Override protected ParticleOptions getParticleType() { return ParticleTypes.PORTAL; } @Override - public void remove() { + public void remove(RemovalReason reason) { int i = this.getSize(); if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { Component text = this.getCustomName(); @@ -133,18 +139,25 @@ public class EndSlimeEntity extends Slime { if (this.isPersistenceRequired()) { slimeEntity.setPersistenceRequired(); } - + slimeEntity.setSlimeType(type); slimeEntity.setCustomName(text); slimeEntity.setNoAi(bl); slimeEntity.setInvulnerable(this.isInvulnerable()); ((ISlime) slimeEntity).be_setSlimeSize(j, true); slimeEntity.refreshDimensions(); - slimeEntity.moveTo(this.getX() + (double) g, this.getY() + 0.5D, this.getZ() + (double) h, this.random.nextFloat() * 360.0F, 0.0F); + slimeEntity.moveTo( + this.getX() + (double) g, + this.getY() + 0.5D, + this.getZ() + (double) h, + this.random.nextFloat() * 360.0F, + 0.0F + ); this.level.addFreshEntity(slimeEntity); } } - this.removed = true; + + ((ISlime) this).entityRemove(reason); } @Override @@ -174,7 +187,7 @@ public class EndSlimeEntity extends Slime { protected void setMossy() { setSlimeType(1); } - + public boolean isMossy() { return getSlimeType() == 1; } @@ -182,7 +195,7 @@ public class EndSlimeEntity extends Slime { protected void setLake() { setSlimeType(2); } - + public boolean isLake() { return getSlimeType() == 2; } @@ -190,7 +203,7 @@ public class EndSlimeEntity extends Slime { protected void setAmber(boolean mossy) { this.entityData.set(VARIANT, (byte) 3); } - + public boolean isAmber() { return this.entityData.get(VARIANT) == 3; } @@ -199,27 +212,26 @@ public class EndSlimeEntity extends Slime { return this.entityData.get(VARIANT) == 0; } - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); + public static boolean canSpawn(EntityType entityType, LevelAccessor world, MobSpawnType spawnType, BlockPos pos, Random random) { + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { + return false; + } + BCLBiome biome = BiomeAPI.getFromBiome(world.getBiome(pos)); + if (biome == EndBiomes.CHORUS_FOREST || biome == EndBiomes.MEGALAKE) { + return true; + } + if (biome == EndBiomes.MEGALAKE_GROVE && random.nextBoolean()) { + return true; + } + return random.nextInt(4) == 0 && isWaterNear(world, pos); } - private static boolean isPermanentBiome(ServerLevelAccessor world, BlockPos pos) { - Biome biome = world.getBiome(pos); - return BiomeAPI.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; - } - - private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { - AABB box = new AABB(pos).inflate(radius); - List list = world.getEntitiesOfClass(EndSlimeEntity.class, box, (entity) -> { return true; }); - return list.size() <= maxCount; - } - - private static boolean isWaterNear(ServerLevelAccessor world, BlockPos pos, int radius, int radius2) { - for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { + private static boolean isWaterNear(LevelAccessor world, BlockPos pos) { + for (int x = pos.getX() - 32; x <= pos.getX() + 32; x++) { POS.setX(x); - for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; z++) { + for (int z = pos.getZ() - 32; z <= pos.getZ() + 32; z++) { POS.setZ(z); - for (int y = pos.getY() - radius2; y <= pos.getY() + radius2; y++) { + for (int y = pos.getY() - 8; y <= pos.getY() + 8; y++) { POS.setY(y); if (world.getBlockState(POS).getBlock() == Blocks.WATER) { return true; @@ -234,7 +246,7 @@ public class EndSlimeEntity extends Slime { public MoveGoal() { this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); } - + public boolean canUse() { if (EndSlimeEntity.this.isPassenger()) { return false; @@ -252,67 +264,61 @@ public class EndSlimeEntity extends Slime { return true; } - + public void tick() { ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.0D); } } - + class SwimmingGoal extends Goal { public SwimmingGoal() { this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); EndSlimeEntity.this.getNavigation().setCanFloat(true); } - + public boolean canUse() { - return (EndSlimeEntity.this.isInWater() - || EndSlimeEntity.this.isInLava()) - && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + return (EndSlimeEntity.this.isInWater() || EndSlimeEntity.this.isInLava()) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } - + public void tick() { if (EndSlimeEntity.this.getRandom().nextFloat() < 0.8F) { EndSlimeEntity.this.getJumpControl().jump(); } - + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).move(1.2D); } } - + class RandomLookGoal extends Goal { private float targetYaw; private int timer; - + public RandomLookGoal() { this.setFlags(EnumSet.of(Goal.Flag.LOOK)); } - + public boolean canUse() { - return EndSlimeEntity.this.getTarget() == null - && (EndSlimeEntity.this.onGround - || EndSlimeEntity.this.isInWater() - || EndSlimeEntity.this.isInLava() - || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) - && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + return EndSlimeEntity.this.getTarget() == null && (EndSlimeEntity.this.onGround || EndSlimeEntity.this.isInWater() || EndSlimeEntity.this + .isInLava() || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } - + public void tick() { if (--this.timer <= 0) { this.timer = 40 + EndSlimeEntity.this.getRandom().nextInt(60); this.targetYaw = (float) EndSlimeEntity.this.getRandom().nextInt(360); } - + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(this.targetYaw, false); } } - + class FaceTowardTargetGoal extends Goal { private int ticksLeft; - + public FaceTowardTargetGoal() { this.setFlags(EnumSet.of(Goal.Flag.LOOK)); } - + public boolean canUse() { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { @@ -322,15 +328,16 @@ public class EndSlimeEntity extends Slime { return false; } else { - return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + return livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable ? false : EndSlimeEntity.this + .getMoveControl() instanceof EndSlimeMoveControl; } } - + public void start() { this.ticksLeft = 300; super.start(); } - + public boolean canContinueToUse() { LivingEntity livingEntity = EndSlimeEntity.this.getTarget(); if (livingEntity == null) { @@ -339,44 +346,47 @@ public class EndSlimeEntity extends Slime { else if (!livingEntity.isAlive()) { return false; } - else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { + else if (livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable) { return false; } else { return --this.ticksLeft > 0; } } - + public void tick() { EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage()); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look( + EndSlimeEntity.this.getYRot(), + EndSlimeEntity.this.isDealsDamage() + ); } } - + class EndSlimeMoveControl extends MoveControl { private float targetYaw; private int ticksUntilJump; private boolean jumpOften; - + public EndSlimeMoveControl(EndSlimeEntity slime) { super(slime); - this.targetYaw = 180.0F * slime.yRot / 3.1415927F; + this.targetYaw = 180.0F * slime.getYRot() / 3.1415927F; } - + public void look(float targetYaw, boolean jumpOften) { this.targetYaw = targetYaw; this.jumpOften = jumpOften; } - + public void move(double speed) { this.speedModifier = speed; this.operation = MoveControl.Operation.MOVE_TO; } - + public void tick() { - this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F); - this.mob.yHeadRot = this.mob.yRot; - this.mob.yBodyRot = this.mob.yRot; + this.mob.setYRot(this.rotlerp(this.mob.getYRot(), this.targetYaw, 90.0F)); + this.mob.yHeadRot = this.mob.getYRot(); + this.mob.yBodyRot = this.mob.getYRot(); if (this.operation != MoveControl.Operation.MOVE_TO) { this.mob.setZza(0.0F); } @@ -389,10 +399,14 @@ public class EndSlimeEntity extends Slime { if (this.jumpOften) { this.ticksUntilJump /= 3; } - + EndSlimeEntity.this.getJumpControl().jump(); if (EndSlimeEntity.this.doPlayJumpSound()) { - EndSlimeEntity.this.playSound(EndSlimeEntity.this.getJumpSound(), EndSlimeEntity.this.getSoundVolume(), getJumpSoundPitch()); + EndSlimeEntity.this.playSound( + EndSlimeEntity.this.getJumpSound(), + EndSlimeEntity.this.getSoundVolume(), + getJumpSoundPitch() + ); } } else { @@ -404,10 +418,10 @@ public class EndSlimeEntity extends Slime { else { this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); } - + } } - + private float getJumpSoundPitch() { float f = EndSlimeEntity.this.isTiny() ? 1.4F : 0.8F; return ((EndSlimeEntity.this.random.nextFloat() - EndSlimeEntity.this.random.nextFloat()) * 0.2F + 1.0F) * f; diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index 100bccac..5cf84c96 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -1,8 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; @@ -12,7 +9,6 @@ import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; @@ -23,9 +19,7 @@ import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; import ru.bclib.util.MHelper; import ru.betterend.registry.EndSounds; @@ -42,53 +36,67 @@ public class ShadowWalkerEntity extends Monster { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, Player.class, true)); } - + public static AttributeSupplier.Builder createMobAttributes() { - return Monster.createMonsterAttributes() - .add(Attributes.FOLLOW_RANGE, 35.0) - .add(Attributes.MOVEMENT_SPEED, 0.15) - .add(Attributes.ATTACK_DAMAGE, 4.5) - .add(Attributes.ARMOR, 2.0) - .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); + return Monster + .createMonsterAttributes() + .add(Attributes.FOLLOW_RANGE, 35.0) + .add(Attributes.MOVEMENT_SPEED, 0.15) + .add(Attributes.ATTACK_DAMAGE, 4.5) + .add(Attributes.ARMOR, 2.0) + .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); } @Override public void tick() { super.tick(); - level.addParticle(ParticleTypes.ASH, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - level.addParticle(ParticleTypes.SMOKE, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); - level.addParticle(ParticleTypes.ENTITY_EFFECT, - getX() + random.nextGaussian() * 0.2, - getY() + random.nextGaussian() * 0.5 + 1, - getZ() + random.nextGaussian() * 0.2, - 0, 0, 0); + level.addParticle( + ParticleTypes.ASH, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, + 0, + 0 + ); + level.addParticle( + ParticleTypes.SMOKE, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, + 0, + 0 + ); + level.addParticle( + ParticleTypes.ENTITY_EFFECT, + getX() + random.nextGaussian() * 0.2, + getY() + random.nextGaussian() * 0.5 + 1, + getZ() + random.nextGaussian() * 0.2, + 0, + 0, + 0 + ); } @Override protected SoundEvent getAmbientSound() { return EndSounds.ENTITY_SHADOW_WALKER; } - + @Override protected SoundEvent getHurtSound(DamageSource source) { return EndSounds.ENTITY_SHADOW_WALKER_DAMAGE; } - + @Override protected SoundEvent getDeathSound() { return EndSounds.ENTITY_SHADOW_WALKER_DEATH; } - + @Override - protected void playStepSound(BlockPos pos, BlockState state) {} + protected void playStepSound(BlockPos pos, BlockState state) { + } @Override protected float getSoundVolume() { @@ -96,7 +104,7 @@ public class ShadowWalkerEntity extends Monster { } @Override - protected float getVoicePitch() { + public float getVoicePitch() { return MHelper.randRange(0.75F, 1.25F, random); } @@ -112,34 +120,25 @@ public class ShadowWalkerEntity extends Monster { return attack; } - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - if (Monster.checkMonsterSpawnRules(type, world, spawnReason, pos, random)) { - AABB box = new AABB(pos).inflate(16); - List entities = world.getEntitiesOfClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); - return entities.size() < 6; - } - return false; - } - private final class AttackGoal extends MeleeAttackGoal { private final ShadowWalkerEntity walker; private int ticks; - + public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { - super(walker, speed, pauseWhenMobIdle); - this.walker = walker; - } - + super(walker, speed, pauseWhenMobIdle); + this.walker = walker; + } + public void start() { super.start(); this.ticks = 0; } - + public void stop() { super.stop(); this.walker.setAggressive(false); } - + public void tick() { super.tick(); ++this.ticks; diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 4c54e387..f3afc4f3 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,11 +1,5 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; @@ -16,11 +10,11 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -31,21 +25,20 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.ai.util.RandomPos; -import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.pathfinder.BlockPathTypes; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import ru.bclib.entity.DespawnableAnimal; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; @@ -54,7 +47,9 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; -public class SilkMothEntity extends Animal implements FlyingAnimal { +import java.util.EnumSet; + +public class SilkMothEntity extends DespawnableAnimal implements FlyingAnimal { private BlockPos hivePos; private BlockPos entrance; private Level hiveWorld; @@ -69,11 +64,12 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } public static AttributeSupplier.Builder createMobAttributes() { - return LivingEntity.createLivingAttributes() - .add(Attributes.MAX_HEALTH, 2.0D) - .add(Attributes.FOLLOW_RANGE, 16.0D) - .add(Attributes.FLYING_SPEED, 0.4D) - .add(Attributes.MOVEMENT_SPEED, 0.1D); + return LivingEntity + .createLivingAttributes() + .add(Attributes.MAX_HEALTH, 2.0D) + .add(Attributes.FOLLOW_RANGE, 16.0D) + .add(Attributes.FLYING_SPEED, 0.4D) + .add(Attributes.MOVEMENT_SPEED, 0.1D); } public void setHive(Level world, BlockPos hive) { @@ -108,7 +104,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } } } - + @Override protected void registerGoals() { this.goalSelector.addGoal(1, new ReturnToHiveGoal()); @@ -125,7 +121,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { BlockState state = this.level.getBlockState(pos); return state.isAir() || !state.getMaterial().blocksMotion(); } - + public void tick() { super.tick(); } @@ -135,34 +131,34 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { birdNavigation.setCanPassDoors(true); return birdNavigation; } - + @Override public boolean isPushable() { return false; } - + @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } - + @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; } - + + @Override + public boolean isFlying() { + return !this.onGround; + } + @Override public boolean isNoGravity() { return true; } - + @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.SILK_MOTH.create(world); } @@ -183,42 +179,31 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { this.level.addFreshEntity(drop); } - public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { - int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); - return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); - } - - private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { - AABB box = new AABB(pos).inflate(radius); - List list = world.getEntitiesOfClass(SilkMothEntity.class, box, (entity) -> true); - return list.size() <= maxCount; - } - class MothLookControl extends LookControl { MothLookControl(Mob entity) { super(entity); } - + protected boolean resetXRotOnTick() { return true; } } - + class WanderAroundGoal extends Goal { WanderAroundGoal() { this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } - + @Override public boolean canUse() { return SilkMothEntity.this.navigation.isDone() && SilkMothEntity.this.random.nextInt(10) == 0; } - + @Override public boolean canContinueToUse() { return SilkMothEntity.this.navigation.isInProgress(); } - + @Override public void start() { Vec3 vec3d = null; @@ -235,12 +220,20 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { catch (Exception e) {} } } - + @Nullable private Vec3 getRandomLocation() { Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); - Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); - return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1); + return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos( + SilkMothEntity.this, + 8, + 4, + -2, + vec3d3.x, + vec3d3.z, + 1.5707963705062866D + ); } } @@ -251,16 +244,24 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { @Override public boolean canUse() { - return SilkMothEntity.this.hivePos != null - && SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level - && SilkMothEntity.this.navigation.isDone() - && SilkMothEntity.this.random.nextInt(16) == 0 - && SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; + return SilkMothEntity.this.hivePos != null && + SilkMothEntity.this.hiveWorld == SilkMothEntity.this.level && + SilkMothEntity.this.navigation.isDone() && + SilkMothEntity.this.random.nextInt(8) == 0 && + SilkMothEntity.this.position().distanceToSqr( + SilkMothEntity.this.hivePos.getX(), + SilkMothEntity.this.hivePos.getY(), + SilkMothEntity.this.hivePos.getZ() + ) < 16384; } @Override public boolean canContinueToUse() { - return SilkMothEntity.this.navigation.isInProgress() && level.getBlockState(entrance).isAir() && (level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) || level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); + return SilkMothEntity.this.navigation.isInProgress() && level.getBlockState(entrance) + .isAir() && (level.getBlockState(hivePos) + .is(EndBlocks.SILK_MOTH_NEST) || level + .getBlockState(hivePos) + .is(EndBlocks.SILK_MOTH_HIVE)); } @Override @@ -274,7 +275,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING)); SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(entrance, 1), 1.0D); } - catch (Exception e) {} + catch (Exception e) { + } } @Override @@ -296,10 +298,21 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { if (fullness > 3) { fullness = 3; } - BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(EndBlockProperties.FULLNESS, fullness)); + BlocksHelper.setWithUpdate( + SilkMothEntity.this.hiveWorld, + SilkMothEntity.this.hivePos, + state.setValue(EndBlockProperties.FULLNESS, fullness) + ); } - SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); - SilkMothEntity.this.remove(); + SilkMothEntity.this.level.playSound( + null, + SilkMothEntity.this.entrance, + SoundEvents.BEEHIVE_ENTER, + SoundSource.BLOCKS, + 1, + 1 + ); + SilkMothEntity.this.discard(); } else { SilkMothEntity.this.hivePos = null; diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java deleted file mode 100644 index cb0758ad..00000000 --- a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.betterend.entity.model; - -import java.util.function.Function; - -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; - -public abstract class BlockBenchModel extends EntityModel { - public BlockBenchModel() { - super(); - } - - public BlockBenchModel(Function function) { - super(function); - } - - protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { - modelRenderer.xRot = x; - modelRenderer.yRot = y; - modelRenderer.zRot = z; - } -} diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 91f0abda..624a63fd 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -2,84 +2,70 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - +import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; -public class CubozoaEntityModel extends BlockBenchModel { +public class CubozoaEntityModel extends EntityModel { + private final static int TENTACLE_COUNT = 4; + private final ModelPart model; - private final ModelPart main_cube_r1; - private final ModelPart tentacle_center_1; - private final ModelPart tentacle_1; - private final ModelPart tentacle_center_2; - private final ModelPart tentacle_2; - private final ModelPart tentacle_center_3; - private final ModelPart tentacle_3; - private final ModelPart tentacle_center_4; - private final ModelPart tentacle_4; + private final ModelPart[] tentacle_center; + private final ModelPart[] tentacle; private float scaleY; private float scaleXZ; - - public CubozoaEntityModel() { + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), + PartPose.offset(0.0F, 24.0F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + "main_cube_r1", + CubeListBuilder.create().texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), + PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F) + ); + + for (int i = 1; i <= TENTACLE_COUNT; i++) { + PartDefinition tentaclePart = bodyPart.addOrReplaceChild( + "tentacle_center_" + i, + CubeListBuilder.create(), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, i * 1.5708F, 0.0F) + ); + + tentaclePart.addOrReplaceChild( + "tentacle_" + i, + CubeListBuilder.create().texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), + PartPose.offset(0.0F, -7.0F, 4.5F) + ); + } + + return LayerDefinition.create(modelData, 48, 48); + } + + public CubozoaEntityModel(ModelPart modelPart) { super(RenderType::entityTranslucent); + tentacle = new ModelPart[TENTACLE_COUNT]; + tentacle_center = new ModelPart[TENTACLE_COUNT]; - texWidth = 48; - texHeight = 48; - - model = new ModelPart(this); - model.setPos(0.0F, 24.0F, 0.0F); - model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); - - main_cube_r1 = new ModelPart(this); - main_cube_r1.setPos(0.0F, -14.0F, 0.0F); - model.addChild(main_cube_r1); - setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); - - tentacle_center_1 = new ModelPart(this); - tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_1); - - - tentacle_1 = new ModelPart(this); - tentacle_1.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_1.addChild(tentacle_1); - tentacle_1.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_2 = new ModelPart(this); - tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_2); - setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - - - tentacle_2 = new ModelPart(this); - tentacle_2.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_2.addChild(tentacle_2); - tentacle_2.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_3 = new ModelPart(this); - tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_3); - setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - - - tentacle_3 = new ModelPart(this); - tentacle_3.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_3.addChild(tentacle_3); - tentacle_3.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_4 = new ModelPart(this); - tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_4); - setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - - - tentacle_4 = new ModelPart(this); - tentacle_4.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_4.addChild(tentacle_4); - tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + model = modelPart.getChild(PartNames.BODY); + for (int i = 1; i <= TENTACLE_COUNT; i++) { + tentacle_center[i - 1] = model.getChild("tentacle_center_" + i); + tentacle[i - 1] = tentacle_center[i - 1].getChild("tentacle_" + i); + } } @Override @@ -88,12 +74,11 @@ public class CubozoaEntityModel extends BlockBenchModel { scaleY = sin * 0.1F + 0.9F; scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - tentacle_1.xRot = sin * 0.15F; - tentacle_2.xRot = sin * 0.15F; - tentacle_3.xRot = sin * 0.15F; - tentacle_4.xRot = sin * 0.15F; + for (int i = 0; i < TENTACLE_COUNT; i++) { + tentacle[i].xRot = sin * 0.15f; + } } - + @Override public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { matrices.pushPose(); diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 88162bc2..7e363571 100644 --- a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -2,12 +2,18 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - +import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.DragonflyEntity; -public class DragonflyEntityModel extends BlockBenchModel { +public class DragonflyEntityModel extends EntityModel { private final ModelPart model; private final ModelPart head; private final ModelPart tail; @@ -18,89 +24,108 @@ public class DragonflyEntityModel extends BlockBenchModel { private final ModelPart wing_4; private final ModelPart legs_1; private final ModelPart legs_2; - - public DragonflyEntityModel() { - super(RenderType::entityCutout); - - texWidth = 64; - texHeight = 64; - - model = new ModelPart(this); - model.setPos(2.0F, 21.5F, -4.0F); - model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); - - head = new ModelPart(this); - head.setPos(-2.0F, -2.0F, 0.0F); - model.addChild(head); - setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); - - tail = new ModelPart(this); - tail.setPos(-2.0F, -2.0F, 9.0F); - model.addChild(tail); - tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); - - tail_2 = new ModelPart(this); - tail_2.setPos(0.0F, 0.0F, 7.0F); - tail.addChild(tail_2); - tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); - - wing_1 = new ModelPart(this); - wing_1.setPos(-2.0F, -4.0F, 4.0F); - model.addChild(wing_1); - wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); - - wing_2 = new ModelPart(this); - wing_2.setPos(-2.0F, -4.0F, 4.0F); - model.addChild(wing_2); - wing_2.mirror = true; - wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); - - wing_3 = new ModelPart(this); - wing_3.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_3); - wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); - - wing_4 = new ModelPart(this); - wing_4.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_4); - wing_4.mirror = true; - wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); - - legs_1 = new ModelPart(this); - legs_1.setPos(-1.0F, 0.0F, 1.0F); - model.addChild(legs_1); - setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); - - legs_2 = new ModelPart(this); - legs_2.setPos(-3.0F, 0.0F, 1.0F); - model.addChild(legs_2); - setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), + PartPose.offset(2.0F, 21.5F, -4.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.HEAD, + CubeListBuilder.create().texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, 0.3491F, 0.0F, 0.0F) + ); + + PartDefinition tailPart = bodyPart.addOrReplaceChild( + PartNames.TAIL, + CubeListBuilder.create().texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), + PartPose.offset(-2.0F, -2.0F, 9.0F) + ); + + tailPart.addOrReplaceChild( + PartNames.TAIL_FIN, + CubeListBuilder.create().texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), + PartPose.offset(0.0F, 0.0F, 7.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.LEFT_WING, + CubeListBuilder.create().texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.RIGHT_WING, + CubeListBuilder.create().mirror().texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.LEFT_WING_BASE, + CubeListBuilder.create().texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.RIGHT_WING_BASE, + CubeListBuilder.create().mirror().texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.LEFT_LEG, + CubeListBuilder.create().texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, 0.0F, 0.0F, -0.5236F) + ); + + bodyPart.addOrReplaceChild( + PartNames.RIGHT_LEG, + CubeListBuilder.create().texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.5236F) + ); + + return LayerDefinition.create(modelData, 64, 64); } - + + public DragonflyEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + model = modelPart.getChild(PartNames.BODY); + head = model.getChild(PartNames.HEAD); + tail = model.getChild(PartNames.TAIL); + tail_2 = tail.getChild(PartNames.TAIL_FIN); + wing_1 = model.getChild(PartNames.LEFT_WING); + wing_2 = model.getChild(PartNames.RIGHT_WING); + wing_3 = model.getChild(PartNames.LEFT_WING_BASE); + wing_4 = model.getChild(PartNames.RIGHT_WING_BASE); + legs_1 = model.getChild(PartNames.LEFT_LEG); + legs_2 = model.getChild(PartNames.RIGHT_LEG); + } + @Override - public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float progress = animationProgress * 2F; - + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; wing_2.zRot = -wing_1.zRot; - + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; wing_4.zRot = -wing_3.zRot; - + progress = animationProgress * 0.05F; - + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; tail_2.xRot = -tail.xRot * 1.5F; } - + @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { model.render(matrices, vertices, light, overlay); } } diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index ebfe8f7b..a6d8b0d8 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -2,63 +2,81 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - +import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndFishEntity; -public class EndFishEntityModel extends BlockBenchModel { +public class EndFishEntityModel extends EntityModel { private final ModelPart model; private final ModelPart fin_top; private final ModelPart fin_bottom; private final ModelPart flipper; private final ModelPart fin_right; private final ModelPart fin_left; - - public EndFishEntityModel() { - super(RenderType::entityCutout); - - texWidth = 32; - texHeight = 32; - - model = new ModelPart(this); - model.setPos(0.0F, 20.0F, 0.0F); - model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); - - fin_top = new ModelPart(this); - fin_top.setPos(0.0F, -2.0F, -4.0F); - model.addChild(fin_top); - setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); - - fin_bottom = new ModelPart(this); - fin_bottom.setPos(0.0F, 2.0F, -4.0F); - model.addChild(fin_bottom); - setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); - - flipper = new ModelPart(this); - flipper.setPos(0.0F, 0.0F, 2.0F); - model.addChild(flipper); - setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); - - fin_right = new ModelPart(this); - fin_right.setPos(-1.0F, 0.0F, -1.0F); - model.addChild(fin_right); - setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); - - fin_left = new ModelPart(this); - fin_left.setPos(1.0F, 0.0F, -1.0F); - model.addChild(fin_left); - setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F), + PartPose.offset(0.0F, 20.0F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.TOP_FIN, + CubeListBuilder.create().texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, -0.6981F, 0.0F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.BOTTOM_FIN, + CubeListBuilder.create().texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, 0.6981F, 0.0F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.TAIL_FIN, + CubeListBuilder.create().texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, -0.7854F, 0.0F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.RIGHT_FIN, + CubeListBuilder.create().texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, 0.7854F, 0.0F) + ); + + bodyPart.addOrReplaceChild( + PartNames.LEFT_FIN, + CubeListBuilder.create().mirror().texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, -0.7854F, 0.0F) + ); + + return LayerDefinition.create(modelData, 32, 32); } - + + public EndFishEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + model = modelPart.getChild(PartNames.BODY); + fin_top = model.getChild(PartNames.TOP_FIN); + fin_bottom = model.getChild(PartNames.BOTTOM_FIN); + flipper = model.getChild(PartNames.TAIL_FIN); + fin_right = model.getChild(PartNames.RIGHT_FIN); + fin_left = model.getChild(PartNames.LEFT_FIN); + } + @Override - public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { + public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float s1 = (float) Math.sin(animationProgress * 0.1); float s2 = (float) Math.sin(animationProgress * 0.05); flipper.yRot = s1 * 0.3F; @@ -67,10 +85,9 @@ public class EndFishEntityModel extends BlockBenchModel { fin_left.yRot = s1 * 0.3F - 0.7854F; fin_right.yRot = 0.7854F - s1 * 0.3F; } - + @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { model.render(matrices, vertices, light, overlay); } } diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 5d3bb97d..82f89b25 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -3,81 +3,146 @@ package ru.betterend.entity.model; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.bclib.util.MHelper; import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.registry.EndEntitiesRenders; public class EndSlimeEntityModel extends ListModel { - private final ModelPart flower; - private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; - - public EndSlimeEntityModel(boolean onlyShell) { - super(RenderType::entityCutout); - - this.innerCube = new ModelPart(this, 0, 16); - this.rightEye = new ModelPart(this, 32, 0); - this.leftEye = new ModelPart(this, 32, 4); - this.mouth = new ModelPart(this, 32, 8); - this.flower = new ModelPart(this); - this.crop = new ModelPart(this); - + private final ModelPart flower; + private final ModelPart crop; + + public static LayerDefinition getShellOnlyTexturedModelData() { + return getTexturedModelData(true); + } + + public static LayerDefinition getCompleteTexturedModelData() { + return getTexturedModelData(false); + } + + private static LayerDefinition getTexturedModelData(boolean onlyShell) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + if (onlyShell) { - this.innerCube.texOffs(0, 0); - this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); - } else { - this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); - this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); - - for (int i = 0; i < 4; i++) { - ModelPart petalRot = new ModelPart(this); - petalRot.yRot = MHelper.degreesToRadians(i * 45F); - - ModelPart petal = new ModelPart(this, 40, 0); - petal.setPos(-4, 8, 0); - petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - - this.flower.addChild(petalRot); - petalRot.addChild(petal); - } - - for (int i = 0; i < 2; i++) { - ModelPart petalRot = new ModelPart(this); - petalRot.yRot = MHelper.degreesToRadians(i * 90F + 45F); - - ModelPart petal = new ModelPart(this, 40, 0); - petal.setPos(-4, 8, 0); - petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - - this.crop.addChild(petalRot); - petalRot.addChild(petal); + modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO + ); + } + else { + modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + PartNames.RIGHT_EYE, + CubeListBuilder.create().texOffs(32, 0).addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + PartNames.LEFT_EYE, + CubeListBuilder.create().texOffs(32, 4).addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + PartNames.MOUTH, + CubeListBuilder.create().texOffs(32, 8).addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), + PartPose.ZERO + ); + + PartDefinition flowerPart = modelPartData.addOrReplaceChild( + "flower", + CubeListBuilder.create(), + PartPose.ZERO + ); + PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO); + + for (int i = 0; i < 6; i++) { + final PartDefinition parent = i < 4 ? flowerPart : cropPart; + final float rot = MHelper.degreesToRadians(i < 4 ? (i * 45F) : ((i - 4) * 90F + 45F)); + + PartDefinition petalRotPart = parent.addOrReplaceChild( + "petalRot_" + i, + CubeListBuilder.create(), + PartPose.offsetAndRotation(0, 0, 0, 0, rot, 0) + ); + + + petalRotPart.addOrReplaceChild( + "petal_" + i, + CubeListBuilder.create().texOffs(40, 0).addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), + PartPose.offset(-4, 8, 0) + ); } } + + return LayerDefinition.create(modelData, 64, 32); } - + + public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell) { + super(RenderType::entityCutout); + + ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL); + + innerCube = modelPart.getChild(PartNames.BODY); + if (!onlyShell) { + rightEye = modelPart.getChild(PartNames.RIGHT_EYE); + leftEye = modelPart.getChild(PartNames.LEFT_EYE); + mouth = modelPart.getChild(PartNames.MOUTH); + flower = modelPart.getChild("flower"); + crop = modelPart.getChild("crop"); + } + else { + rightEye = null; + leftEye = null; + mouth = null; + flower = null; + crop = null; + } + } + @Override - public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, - float headPitch) { + public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { } - + public void renderFlower(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { flower.render(matrices, vertices, light, overlay); } - + public void renderCrop(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { crop.render(matrices, vertices, light, overlay); } - + + private boolean isOnlyShell() { + return rightEye == null; + } + @Override public Iterable parts() { - return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + if (isOnlyShell()) { + return ImmutableList.of(this.innerCube); + } + else { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } } } diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 5d21fafe..5ea45b4b 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -2,13 +2,19 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - +import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; -public class SilkMothEntityModel extends BlockBenchModel { +public class SilkMothEntityModel extends EntityModel { private final ModelPart legsL; private final ModelPart cube_r1; private final ModelPart cube_r2; @@ -24,99 +30,126 @@ public class SilkMothEntityModel extends BlockBenchModel { private final ModelPart wingR_r1; private final ModelPart wingL_r1; private final ModelPart abdomen_r1; - - public SilkMothEntityModel() { - super(RenderType::entityCutout); - - texWidth = 64; - texHeight = 64; - - legsL = new ModelPart(this); - legsL.setPos(1.5F, 19.9F, -0.45F); - setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); - - cube_r1 = new ModelPart(this); - cube_r1.setPos(0.0F, 0.0F, -1.0F); - legsL.addChild(cube_r1); - setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); - cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r2 = new ModelPart(this); - cube_r2.setPos(0.5F, 0.1F, -0.05F); - legsL.addChild(cube_r2); - setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); - cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r3 = new ModelPart(this); - cube_r3.setPos(0.0F, 0.0F, 0.9F); - legsL.addChild(cube_r3); - setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); - cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - legsR = new ModelPart(this); - legsR.setPos(-1.5F, 19.9F, -0.55F); - setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); - - cube_r4 = new ModelPart(this); - cube_r4.setPos(0.0F, 0.0F, -1.0F); - legsR.addChild(cube_r4); - setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); - cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r5 = new ModelPart(this); - cube_r5.setPos(0.5F, 0.1F, -0.05F); - legsR.addChild(cube_r5); - setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); - cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r6 = new ModelPart(this); - cube_r6.setPos(0.0F, 0.0F, 0.9F); - legsR.addChild(cube_r6); - setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); - cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); - - head_pivot = new ModelPart(this); - head_pivot.setPos(0.0F, 18.0F, -3.0F); - head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); - - tendril_r_r1 = new ModelPart(this); - tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r1); - setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); - tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); - - tendril_r_r2 = new ModelPart(this); - tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r2); - setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); - tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); - - bb_main = new ModelPart(this); - bb_main.setPos(0.0F, 24.0F, 0.0F); - bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); - - wingR_r1 = new ModelPart(this); - wingR_r1.setPos(-1.5F, -6.5F, 0.5F); - bb_main.addChild(wingR_r1); - setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); - wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); - - wingL_r1 = new ModelPart(this); - wingL_r1.setPos(1.5F, -6.5F, 0.5F); - bb_main.addChild(wingL_r1); - setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); - wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); - - abdomen_r1 = new ModelPart(this); - abdomen_r1.setPos(1.0F, -3.9F, 0.0F); - bb_main.addChild(abdomen_r1); - setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition legsL = modelPartData.addOrReplaceChild( + PartNames.LEFT_LEG, + CubeListBuilder.create().texOffs(0, 0), + PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, 0.0f, 0.0f, 0.6981f) + ); + + legsL.addOrReplaceChild( + "cube_r1", + CubeListBuilder.create().texOffs(0, 13).addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f) + ); + + legsL.addOrReplaceChild( + "cube_r2", + CubeListBuilder.create().texOffs(0, 15).addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f) + ); + + legsL.addOrReplaceChild( + "cube_r3", + CubeListBuilder.create().texOffs(0, 14).addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f) + ); + + PartDefinition legsR = modelPartData.addOrReplaceChild( + PartNames.RIGHT_LEG, + CubeListBuilder.create().texOffs(0, 0), + PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, 0.0f, 3.1416f, -0.6545f) + ); + + legsR.addOrReplaceChild( + "cube_r4", + CubeListBuilder.create().texOffs(0, 10).addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f) + ); + + legsR.addOrReplaceChild( + "cube_r5", + CubeListBuilder.create().texOffs(0, 11).addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f) + ); + + legsR.addOrReplaceChild( + "cube_r6", + CubeListBuilder.create().texOffs(0, 12).addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f) + ); + + PartDefinition head_pivot = modelPartData.addOrReplaceChild( + PartNames.HEAD, + CubeListBuilder.create().texOffs(15, 10).addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), + PartPose.offset(0.0f, 18.0f, -3.0f) + ); + + head_pivot.addOrReplaceChild( + "tendril_r_r1", + CubeListBuilder.create().mirror().texOffs(23, 0).addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, 0.0f, 0.0f, 0.3927f) + ); + + head_pivot.addOrReplaceChild( + "tendril_r_r2", + CubeListBuilder.create().texOffs(23, 0).addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, 0.0f, 0.0f, -0.3927f) + ); + + PartDefinition bb_main = modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(19, 19).addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), + PartPose.offset(0.0f, 24.0f, 0.0f) + ); + + bb_main.addOrReplaceChild( + PartNames.RIGHT_WING, + CubeListBuilder.create().mirror().texOffs(0, 5).addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, 0.0f, 0.0f, 0.3927f) + ); + + bb_main.addOrReplaceChild( + PartNames.LEFT_WING, + CubeListBuilder.create().texOffs(0, 5).addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, 0.0f, 0.0f, -0.3927f) + ); + + bb_main.addOrReplaceChild( + "abdomen_r1", + CubeListBuilder.create().texOffs(0, 10).addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), + PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, -0.3927f, 0.0f, 0.0f) + ); + + return LayerDefinition.create(modelData, 64, 64); } - + + public SilkMothEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + legsL = modelPart.getChild(PartNames.LEFT_LEG); + cube_r1 = legsL.getChild("cube_r1"); + cube_r2 = legsL.getChild("cube_r2"); + cube_r3 = legsL.getChild("cube_r3"); + legsR = modelPart.getChild(PartNames.RIGHT_LEG); + cube_r4 = legsR.getChild("cube_r4"); + cube_r5 = legsR.getChild("cube_r5"); + cube_r6 = legsR.getChild("cube_r6"); + head_pivot = modelPart.getChild(PartNames.HEAD); + tendril_r_r1 = head_pivot.getChild("tendril_r_r1"); + tendril_r_r2 = head_pivot.getChild("tendril_r_r2"); + bb_main = modelPart.getChild(PartNames.BODY); + wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING); + wingL_r1 = bb_main.getChild(PartNames.LEFT_WING); + abdomen_r1 = bb_main.getChild("abdomen_r1"); + } + @Override - public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; wingL_r1.zRot = -wingR_r1.zRot; head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; @@ -126,10 +159,9 @@ public class SilkMothEntityModel extends BlockBenchModel { legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; legsL.zRot = -legsR.zRot; } - + @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { bb_main.render(matrices, vertices, light, overlay); head_pivot.render(matrices, vertices, light, overlay); legsL.render(matrices, vertices, light, overlay); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 5b6b78fe..334e85a1 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -2,10 +2,9 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -13,33 +12,43 @@ import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityCubozoa extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final RenderType[] GLOW = new RenderType[2]; - - public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + + public RendererEntityCubozoa(EntityRendererProvider.Context ctx) { + super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { return GLOW[0]; } - + @Override public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, CubozoaEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + this.getParentModel() + .renderToBuffer(matrices, + vertexConsumer, + 15728640, + OverlayTexture.NO_OVERLAY, + 1.0F, + 1.0F, + 1.0F, + 1.0F + ); } - }); + }); } - + @Override protected void scale(CubozoaEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } - + @Override public ResourceLocation getTextureLocation(CubozoaEntity entity) { return TEXTURE[entity.getVariant()]; diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java index 37e82160..7679f989 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java @@ -1,30 +1,31 @@ package ru.betterend.entity.render; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.DragonflyEntity; import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityDragonfly extends MobRenderer { - private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); - private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - - public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); - this.addLayer(new EyesLayer(this) { - @Override - public RenderType renderType() { - return GLOW; - } - }); - } - - @Override - public ResourceLocation getTextureLocation(DragonflyEntity entity) { - return TEXTURE; - } + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); + private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); + + public RendererEntityDragonfly(EntityRendererProvider.Context ctx) { + super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); + this.addLayer(new EyesLayer(this) { + @Override + public RenderType renderType() { + return GLOW; + } + }); + } + + @Override + public ResourceLocation getTextureLocation(DragonflyEntity entity) { + return TEXTURE; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index fce70f61..95e81065 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -2,10 +2,9 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -13,41 +12,48 @@ import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.model.EndFishEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndFish extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; - - public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + + public RendererEntityEndFish(EntityRendererProvider.Context ctx) { + super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { return GLOW[0]; } - + @Override - public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity, - float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, - float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndFishEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getVariant()]); - this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, - 1.0F, 1.0F, 1.0F, 1.0F); + this.getParentModel() + .renderToBuffer(matrices, + vertexConsumer, + 15728640, + OverlayTexture.NO_OVERLAY, + 1.0F, + 1.0F, + 1.0F, + 1.0F + ); } }); } - + @Override protected void scale(EndFishEntity entity, PoseStack matrixStack, float f) { float scale = entity.getScale(); matrixStack.scale(scale, scale, scale); } - + @Override public ResourceLocation getTextureLocation(EndFishEntity entity) { return TEXTURE[entity.getVariant()]; } - + static { for (int i = 0; i < EndFishEntity.VARIANTS; i++) { TEXTURE[i] = BetterEnd.makeID("textures/entity/end_fish/end_fish_" + i + ".png"); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 3fad8fc1..af5379d3 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -2,10 +2,9 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; @@ -21,42 +20,47 @@ import ru.betterend.entity.model.EndSlimeEntityModel; public class RendererEntityEndSlime extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final RenderType GLOW[] = new RenderType[4]; - - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addLayer(new OverlayFeatureRenderer(this)); + + public RendererEntityEndSlime(EntityRendererProvider.Context ctx) { + super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f); + this.addLayer(new OverlayFeatureRenderer(this, ctx)); this.addLayer(new EyesLayer>(this) { @Override public RenderType renderType() { return GLOW[0]; } - + @Override - public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity, - float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, - float headPitch) { + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, EndSlimeEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]); - this.getParentModel().renderToBuffer(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY, - 1.0F, 1.0F, 1.0F, 1.0F); + this.getParentModel() + .renderToBuffer(matrices, + vertexConsumer, + 15728640, + OverlayTexture.NO_OVERLAY, + 1.0F, + 1.0F, + 1.0F, + 1.0F + ); if (entity.isLake()) { this.getParentModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.NO_OVERLAY); } } }); } - + @Override public ResourceLocation getTextureLocation(EndSlimeEntity entity) { return TEXTURE[entity.getSlimeType()]; } - + @Override - public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack, - MultiBufferSource vertexConsumerProvider, int i) { + public void render(EndSlimeEntity slimeEntity, float f, float g, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i) { this.shadowRadius = 0.25F * (float) slimeEntity.getSize(); super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i); } - + @Override protected void scale(EndSlimeEntity slimeEntity, PoseStack matrixStack, float f) { matrixStack.scale(0.999F, 0.999F, 0.999F); @@ -66,43 +70,60 @@ public class RendererEntityEndSlime extends MobRenderer - extends RenderLayer> { - private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); - private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); - - public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { + + private final class OverlayFeatureRenderer extends RenderLayer> { + private final EndSlimeEntityModel modelOrdinal; + private final EndSlimeEntityModel modelLake; + + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext, EntityRendererProvider.Context ctx) { super(featureRendererContext); + modelOrdinal = new EndSlimeEntityModel<>(ctx.getModelSet(), true); + modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true); } - - public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, - float f, float g, float h, float j, float k, float l) { + + public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { if (!livingEntity.isInvisible()) { if (livingEntity.isLake()) { - VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); - this.getParentModel().renderFlower(matrixStack, vertexConsumer, i, - LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); - } else if (livingEntity.isAmber() || livingEntity.isChorus()) { - VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderType.entityCutout(this.getTextureLocation(livingEntity))); - this.getParentModel().renderCrop(matrixStack, vertexConsumer, i, - LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F)); + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityCutout(this.getTextureLocation( + livingEntity))); + this.getParentModel() + .renderFlower(matrixStack, + vertexConsumer, + i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F) + ); } - + else if (livingEntity.isAmber() || livingEntity.isChorus()) { + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityCutout(this.getTextureLocation( + livingEntity))); + this.getParentModel() + .renderCrop(matrixStack, + vertexConsumer, + i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F) + ); + } + EndSlimeEntityModel model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal; this.getParentModel().copyPropertiesTo(model); model.prepareMobModel(livingEntity, f, g, h); model.setupAnim(livingEntity, f, g, j, k, l); - VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderType.entityTranslucent(this.getTextureLocation(livingEntity))); - model.renderToBuffer(matrixStack, vertexConsumer, i, - LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); + VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderType.entityTranslucent(this.getTextureLocation( + livingEntity))); + model.renderToBuffer( + matrixStack, + vertexConsumer, + i, + LivingEntityRenderer.getOverlayCoords(livingEntity, 0.0F), + 1.0F, + 1.0F, + 1.0F, + 1.0F + ); } } } - + static { TEXTURE[0] = BetterEnd.makeID("textures/entity/end_slime/end_slime.png"); TEXTURE[1] = BetterEnd.makeID("textures/entity/end_slime/end_slime_mossy.png"); diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index d75db944..da3df3d6 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -1,20 +1,21 @@ package ru.betterend.entity.render; import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.ShadowWalkerEntity; -public class RendererEntityShadowWalker - extends HumanoidMobRenderer> { +public class RendererEntityShadowWalker extends HumanoidMobRenderer> { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); - - public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); + + public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) { + super(ctx, new PlayerModel(ctx.bakeLayer(ModelLayers.PLAYER), false), 0.5F); + //super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); } - + @Override public ResourceLocation getTextureLocation(ShadowWalkerEntity zombieEntity) { return TEXTURE; diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java index 7d3a2745..3ee6fed8 100644 --- a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -1,21 +1,22 @@ package ru.betterend.entity.render; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.SilkMothEntity; import ru.betterend.entity.model.SilkMothEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class SilkMothEntityRenderer extends MobRenderer { - private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); - - public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); - } - - @Override - public ResourceLocation getTextureLocation(SilkMothEntity entity) { - return TEXTURE; - } + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + + public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f); + } + + @Override + public ResourceLocation getTextureLocation(SilkMothEntity entity) { + return TEXTURE; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/events/ItemTooltipCallback.java b/src/main/java/ru/betterend/events/ItemTooltipCallback.java index 3173e5f6..b2d36fb7 100644 --- a/src/main/java/ru/betterend/events/ItemTooltipCallback.java +++ b/src/main/java/ru/betterend/events/ItemTooltipCallback.java @@ -1,7 +1,5 @@ package ru.betterend.events; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.event.Event; @@ -11,17 +9,22 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import java.util.List; + @Environment(EnvType.CLIENT) public interface ItemTooltipCallback { /** * Fired after the game has appended all base tooltip lines to the list. */ - Event EVENT = EventFactory.createArrayBacked(ItemTooltipCallback.class, callbacks -> (player, stack, context, lines) -> { - for (ItemTooltipCallback callback : callbacks) { - callback.getTooltip(player, stack, context, lines); + Event EVENT = EventFactory.createArrayBacked( + ItemTooltipCallback.class, + callbacks -> (player, stack, context, lines) -> { + for (ItemTooltipCallback callback : callbacks) { + callback.getTooltip(player, stack, context, lines); + } } - }); - + ); + /** * Called when an item stack's tooltip is rendered. Text added to {@code lines} will be * rendered with the tooltip. diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java b/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java index 8c6aca1a..573ac70b 100644 --- a/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java @@ -7,11 +7,14 @@ import net.minecraft.server.level.ServerPlayer; public interface PlayerAdvancementsCallback { - Event PLAYER_ADVANCEMENT_COMPLETE = EventFactory.createArrayBacked(PlayerAdvancementsCallback.class, callbacks -> (player, advancement, criterionName) -> { - for (PlayerAdvancementsCallback event : callbacks) { - event.onAdvancementComplete(player, advancement, criterionName); + Event PLAYER_ADVANCEMENT_COMPLETE = EventFactory.createArrayBacked( + PlayerAdvancementsCallback.class, + callbacks -> (player, advancement, criterionName) -> { + for (PlayerAdvancementsCallback event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } } - }); - + ); + void onAdvancementComplete(ServerPlayer player, Advancement advancement, String criterionName); } diff --git a/src/main/java/ru/betterend/integration/EnderscapeIntegration.java b/src/main/java/ru/betterend/integration/EnderscapeIntegration.java new file mode 100644 index 00000000..83099d0c --- /dev/null +++ b/src/main/java/ru/betterend/integration/EnderscapeIntegration.java @@ -0,0 +1,48 @@ +package ru.betterend.integration; + +import net.minecraft.core.MappedRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.integration.modmenu.ModIntegration; +import ru.bclib.world.features.BCLFeature; + +public class EnderscapeIntegration extends ModIntegration { + public EnderscapeIntegration() { + super("enderscape"); + } + + @Override + public void init() { + Class enderscape = getClass("net.enderscape.Enderscape"); + Class enderscapeIslandsBiome = getClass("net.enderscape.world.biomes.EnderscapeIslandsBiome"); + MappedRegistry biomes = getStaticFieldValue(enderscape, "ENDERSCAPE_BIOME"); + biomes.entrySet().forEach(entry -> { + ResourceKey key = entry.getKey(); + Biome biome = getBiome(key.location().getPath()); + if (enderscapeIslandsBiome.isInstance(entry.getValue())) { + BiomeAPI.registerEndVoidBiome(biome); + } + else { + BiomeAPI.registerEndLandBiome(biome); + } + }); + + BCLFeature scatteredShadowQuartzOre = getFeature("scattered_shadow_quartz_ore", Decoration.UNDERGROUND_DECORATION); + BCLFeature voidNebuliteOre = getFeature("void_nebulite_ore", Decoration.UNDERGROUND_DECORATION); + BCLFeature nebuliteOre = getFeature("nebulite_ore", Decoration.UNDERGROUND_DECORATION); + + BiomeAPI.registerEndBiomeModification((biomeID, biome) -> { + if (!biomeID.getNamespace().equals("enderscape")) { + BiomeAPI.addBiomeFeature(biome, scatteredShadowQuartzOre); + BiomeAPI.addBiomeFeature(biome, voidNebuliteOre); + BiomeAPI.addBiomeFeature(biome, nebuliteOre); + } + }); + + TagAPI.addTag(TagAPI.BLOCK_GEN_TERRAIN, getBlock("nebulite_ore")); + TagAPI.addTag(TagAPI.BLOCK_GEN_TERRAIN, getBlock("shadow_quartz_ore")); + } +} diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index c123c9a9..f2c7d178 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -1,22 +1,21 @@ package ru.betterend.integration; +import com.google.common.collect.Maps; +import net.minecraft.world.level.ItemLike; +import ru.bclib.integration.modmenu.ModIntegration; +import ru.bclib.util.ColorUtil; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.complexmaterials.ColoredMaterial; +import ru.betterend.registry.EndBlocks; + import java.awt.Color; import java.util.Map; -import com.google.common.collect.Maps; - -import net.minecraft.world.level.ItemLike; -import ru.bclib.integration.ModIntegration; -import ru.bclib.util.ColorUtil; -import ru.betterend.blocks.HydraluxPetalColoredBlock; -import ru.betterend.blocks.complex.ColoredMaterial; -import ru.betterend.registry.EndBlocks; - public class FlamboyantRefabricatedIntegration extends ModIntegration { public FlamboyantRefabricatedIntegration() { super("flamboyant"); } - + @Override public void init() { Map colors = Maps.newHashMap(); diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index f611af4d..837b8fb8 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -5,7 +5,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import ru.bclib.api.ModIntegrationAPI; -import ru.bclib.integration.ModIntegration; +import ru.bclib.integration.modmenu.ModIntegration; import ru.bclib.recipes.GridRecipe; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -18,6 +18,7 @@ public class Integrations { public static final ModIntegration BYG = ModIntegrationAPI.register(new BYGIntegration()); public static final ModIntegration NOURISH = ModIntegrationAPI.register(new NourishIntegration()); public static final ModIntegration FLAMBOYANT_REFABRICATED = ModIntegrationAPI.register(new FlamboyantRefabricatedIntegration()); + public static final ModIntegration ENDERSCAPE = ModIntegrationAPI.register(new EnderscapeIntegration()); private static boolean hasHydrogen; @@ -33,12 +34,12 @@ public class Integrations { }); GridRecipe.make(BetterEnd.MOD_ID, "guide_book", GuideBookItem.GUIDE_BOOK) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST) - .addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST) + .addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS) + .build(); } hasHydrogen = FabricLoader.getInstance().isModLoaded("hydrogen"); } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index 71f6cd47..4d17a020 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -2,15 +2,15 @@ package ru.betterend.integration; import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; -import ru.bclib.integration.ModIntegration; -import ru.bclib.util.TagHelper; +import ru.bclib.api.TagAPI; +import ru.bclib.integration.modmenu.ModIntegration; import ru.betterend.registry.EndItems; public class NourishIntegration extends ModIntegration { public NourishIntegration() { super("nourish"); } - + @Override public void init() { Tag.Named fats = getItemTag("fats"); @@ -18,17 +18,13 @@ public class NourishIntegration extends ModIntegration { Tag.Named protein = getItemTag("protein"); Tag.Named sweets = getItemTag("sweets"); - TagHelper.addTag( - fats, - EndItems.END_FISH_RAW, - EndItems.END_FISH_COOKED - ); - TagHelper.addTag( + TagAPI.addTag(fats, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED); + TagAPI.addTag( fruit, EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED, EndItems.BLOSSOM_BERRY, - EndItems.SHADOW_BERRY_JELLY, + EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY, EndItems.BLOSSOM_BERRY_JELLY, EndItems.AMBER_ROOT_RAW, @@ -36,7 +32,7 @@ public class NourishIntegration extends ModIntegration { EndItems.CHORUS_MUSHROOM_COOKED, EndItems.BOLUX_MUSHROOM_COOKED ); - TagHelper.addTag( + TagAPI.addTag( protein, EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED, @@ -44,7 +40,7 @@ public class NourishIntegration extends ModIntegration { EndItems.BOLUX_MUSHROOM_COOKED, EndItems.CAVE_PUMPKIN_PIE ); - TagHelper.addTag( + TagAPI.addTag( sweets, EndItems.SHADOW_BERRY_JELLY, EndItems.SWEET_BERRY_JELLY, diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 18ceff7a..8d58b147 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -11,5 +11,6 @@ public class BYGBlocks { public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new BaseVineBlock()); - public static void register() {} + public static void register() { + } } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 7306d1dd..7d00ea2a 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,82 +1,26 @@ package ru.betterend.integration.byg; -import java.util.List; -import java.util.stream.Collectors; - -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.behavior.WeightedList; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import ru.bclib.api.BiomeAPI; -import ru.bclib.api.TagAPI; -import ru.bclib.integration.ModIntegration; -import ru.bclib.util.TagHelper; -import ru.bclib.world.biomes.BCLBiome; +import ru.bclib.integration.modmenu.ModIntegration; import ru.betterend.integration.EndBiomeIntegration; -import ru.betterend.integration.Integrations; -import ru.betterend.integration.byg.biomes.BYGBiomes; -import ru.betterend.integration.byg.features.BYGFeatures; -import ru.betterend.registry.EndBiomes; public class BYGIntegration extends ModIntegration implements EndBiomeIntegration { public BYGIntegration() { super("byg"); } - + @Override public void init() { - Block block = Integrations.BYG.getBlock("ivis_phylium"); + /*Block block = Integrations.BYG.getBlock("ivis_phylium"); if (block != null) { - TagHelper.addTags(block, TagAPI.END_GROUND, TagAPI.GEN_TERRAIN); + TagAPI.addTags(block, TagAPI.BLOCK_END_GROUND, TagAPI.BLOCK_GEN_TERRAIN); } BYGBlocks.register(); BYGFeatures.register(); - BYGBiomes.register(); + BYGBiomes.register();*/ } - + @Override public void addBiomes() { - BYGBiomes.addBiomes(); - - Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); - List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); - - if (biomes != null && biomeClass != null) { - biomes.forEach((obj) -> { - Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); - if (biome != null) { - ResourceLocation biomeID = BuiltinRegistries.BIOME.getKey(biome); - BCLBiome endBiome = BiomeAPI.getBiome(biomeID); - Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); - if (edge != null) { - ResourceLocation edgeID = BuiltinRegistries.BIOME.getKey(edge); - EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); - EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); - BCLBiome edgeBiome = BiomeAPI.getBiome(edgeID); - endBiome.setEdge(edgeBiome); - } - else { - Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); - if (isVoid != null && isVoid.booleanValue()) { - EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); - EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); - } - WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); - if (subBiomes != null) { - subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { - BCLBiome subBiome = BiomeAPI.getBiome(id); - EndBiomes.LAND_BIOMES.removeMutableBiome(id); - EndBiomes.VOID_BIOMES.removeMutableBiome(id); - if (!endBiome.containsSubBiome(subBiome)) { - EndBiomes.SUBBIOMES.add(subBiome); - endBiome.addSubBiome(subBiome); - } - }); - } - } - } - }); - } + //BYGBiomes.addBiomes(); } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 013afbe9..9d01f412 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -1,5 +1,6 @@ package ru.betterend.integration.byg.biomes; +import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.EndBiome; @@ -11,7 +12,7 @@ public class BYGBiomes { //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); public static void register() { - System.out.println("Registered " + OLD_BULBIS_GARDENS); + BetterEnd.LOGGER.info("Registered " + OLD_BULBIS_GARDENS); } public static void addBiomes() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 61e48d18..c3471b12 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -1,65 +1,84 @@ package ru.betterend.integration.byg.biomes; -import java.util.List; - import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import ru.bclib.BCLib; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; -public class NightshadeRedwoods extends EndBiome { +import java.util.List; + +public class NightshadeRedwoods extends EndBiome.Config { public NightshadeRedwoods() { - super(makeDef()); + super("nightshade_redwoods"); } - - private static BCLBiomeDef makeDef() { + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { Biome biome = Integrations.BYG.getBiome("nightshade_forest"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - - BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("nightshade_redwoods")) - .setFogColor(140, 108, 47) - .setFogDensity(1.5F) - .setWaterAndFogColor(55, 70, 186) - .setFoliageColor(122, 17, 155) - .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(biome.getGenerationSettings().getSurfaceBuilder().get()) - .setGrassColor(48, 13, 89) - .setPlantsColor(200, 125, 9) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) - .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) - .addFeature(BYGFeatures.NIGHTSHADE_MOSS); - + + builder.fogColor(140, 108, 47) + .fogDensity(1.5F) + .waterAndFogColor(55, 70, 186) + .foliageColor(122, 17, 155) + .particles( + ParticleTypes.REVERSE_PORTAL, + 0.002F + ) + //TODO: 1.18 surface rules +// .setSurface(biome.getGenerationSettings() +// .getSurfaceBuilder() +// .get()) + .grassColor(48, 13, 89) + .plantsColor(200, 125, 9) + .feature(EndFeatures.END_LAKE_RARE) + .feature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) + .feature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .feature(BYGFeatures.NIGHTSHADE_MOSS); + if (BCLib.isClient()) { - SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); - SoundEvent music = effects.getBackgroundMusic().get().getEvent(); - SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); - SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); - def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + SoundEvent loop = effects.getAmbientLoopSoundEvent() + .get(); + SoundEvent music = effects.getBackgroundMusic() + .get() + .getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings() + .get() + .getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings() + .get() + .getSoundEvent(); + builder.loop(loop) + .music(music) + .additions(additions) + .mood(mood); } - biome.getGenerationSettings().features().forEach((list) -> { - list.forEach((feature) -> { - def.addFeature(Decoration.VEGETAL_DECORATION, feature.get()); - }); - }); - - for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + biome.getGenerationSettings() + .features() + .forEach((list) -> { + list.forEach((feature) -> { + builder.feature(Decoration.VEGETAL_DECORATION, feature.get()); + }); + }); + + for (MobCategory group : MobCategory.values()) { + List list = biome.getMobSettings() + .getMobs(group) + .unwrap(); list.forEach((entry) -> { - def.addMobSpawn(entry); + builder.spawn((EntityType) entry.type, 1, entry.minCount, entry.maxCount); }); } - - return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 27bcd5a0..ac724454 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -1,92 +1,117 @@ package ru.betterend.integration.byg.biomes; -import java.util.List; -import java.util.function.Supplier; - import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.Features; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import ru.bclib.BCLib; -import ru.bclib.world.biomes.BCLBiomeDef; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; -public class OldBulbisGardens extends EndBiome { +import java.util.List; +import java.util.function.Supplier; + + +public class OldBulbisGardens extends EndBiome.Config { public OldBulbisGardens() { - super(makeDef()); + super("old_bulbis_gardens"); } - - private static BCLBiomeDef makeDef() { + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); - Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); - BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("old_bulbis_gardens")) - .setFogColor(215, 132, 207) - .setFogDensity(1.8F) - .setWaterAndFogColor(40, 0, 56) - .setFoliageColor(122, 17, 155) - .setParticles(ParticleTypes.REVERSE_PORTAL, 0.002F) - .setSurface(ivis, origin) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE); - +// Block origin = biome.getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial() +// .getBlock(); + builder.fogColor(215, 132, 207) + .fogDensity(1.8F) + .waterAndFogColor(40, 0, 56) + .foliageColor(122, 17, 155) + .particles( + ParticleTypes.REVERSE_PORTAL, + 0.002F + ) + //TODO: 1.18 surface rules + //.surface(ivis, origin) + .feature(EndFeatures.END_LAKE_RARE) + .feature(BYGFeatures.OLD_BULBIS_TREE); + if (BCLib.isClient()) { - SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); - SoundEvent music = effects.getBackgroundMusic().get().getEvent(); - SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); - SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); - def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + SoundEvent loop = effects.getAmbientLoopSoundEvent() + .get(); + SoundEvent music = effects.getBackgroundMusic() + .get() + .getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings() + .get() + .getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings() + .get() + .getSoundEvent(); + builder.loop(loop) + .music(music) + .additions(additions) + .mood(mood); } - - for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + + for (MobCategory group : MobCategory.values()) { + List list = biome.getMobSettings() + .getMobs(group) + .unwrap(); list.forEach((entry) -> { - def.addMobSpawn(entry); + builder.spawn((EntityType) entry.type, 1, entry.minCount, entry.maxCount); }); } - - List>>> features = biome.getGenerationSettings().features(); - List>> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); + + List>> features = biome.getGenerationSettings() + .features(); + List> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); if (vegetal.size() > 2) { - Supplier> getter; + Supplier getter; // Trees (first two features) // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) for (int i = 0; i < 2; i++) { getter = vegetal.get(i); - ConfiguredFeature feature = getter.get(); + PlacedFeature feature = getter.get(); ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); - feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1)); - def.addFeature(Decoration.VEGETAL_DECORATION, feature); + feature = Registry.register( + BuiltinRegistries.PLACED_FEATURE, + id, + //TODO: 1.18 Check if this is correct + feature//.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1) + ); + builder.feature(Decoration.VEGETAL_DECORATION, feature); } // Grasses and other features for (int i = 2; i < vegetal.size(); i++) { getter = vegetal.get(i); - ConfiguredFeature feature = getter.get(); - def.addFeature(Decoration.VEGETAL_DECORATION, feature); + PlacedFeature feature = getter.get(); + builder.feature(Decoration.VEGETAL_DECORATION, feature); } } - - def.addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT); - - return def; + + builder.feature(EndFeatures.PURPLE_POLYPORE) + .feature(BYGFeatures.IVIS_MOSS_WOOD) + .feature(BYGFeatures.IVIS_MOSS) + .feature(BYGFeatures.IVIS_VINE) + .feature(BYGFeatures.IVIS_SPROUT); } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 1a906683..20cd4e86 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -12,18 +12,51 @@ import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; public class BYGFeatures { - public static final BCLFeature OLD_BULBIS_TREE = redisterVegetation("old_bulbis_tree", new OldBulbisTreeFeature(), 1); - public static final BCLFeature IVIS_SPROUT = redisterVegetation("ivis_sprout", new SinglePlantFeature(Integrations.BYG.getBlock("ivis_sprout"), 6, 2), 6); - public static final BCLFeature IVIS_VINE = redisterVegetation("ivis_vine", new VineFeature(BYGBlocks.IVIS_VINE, 24), 5); - public static final BCLFeature IVIS_MOSS = redisterVegetation("ivis_moss", new WallPlantFeature(BYGBlocks.IVIS_MOSS, 6), 1); - public static final BCLFeature IVIS_MOSS_WOOD = redisterVegetation("ivis_moss_wood", new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), 15); - public static final BCLFeature NIGHTSHADE_MOSS = redisterVegetation("nightshade_moss", new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 2); - public static final BCLFeature NIGHTSHADE_MOSS_WOOD = redisterVegetation("nightshade_moss_wood", new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 8); + public static final BCLFeature OLD_BULBIS_TREE = redisterVegetation( + "old_bulbis_tree", + new OldBulbisTreeFeature(), + 1 + ); + public static final BCLFeature IVIS_SPROUT = redisterVegetation( + "ivis_sprout", + new SinglePlantFeature(Integrations.BYG.getBlock("ivis_sprout"), 6, 2), + 6 + ); + public static final BCLFeature IVIS_VINE = redisterVegetation( + "ivis_vine", + new VineFeature(BYGBlocks.IVIS_VINE, 24), + 5 + ); + public static final BCLFeature IVIS_MOSS = redisterVegetation( + "ivis_moss", + new WallPlantFeature(BYGBlocks.IVIS_MOSS, 6), + 1 + ); + public static final BCLFeature IVIS_MOSS_WOOD = redisterVegetation( + "ivis_moss_wood", + new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), + 15 + ); + public static final BCLFeature NIGHTSHADE_MOSS = redisterVegetation( + "nightshade_moss", + new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), + 2 + ); + public static final BCLFeature NIGHTSHADE_MOSS_WOOD = redisterVegetation( + "nightshade_moss_wood", + new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), + 8 + ); - public static final BCLFeature NIGHTSHADE_REDWOOD_TREE = redisterVegetation("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); + public static final BCLFeature NIGHTSHADE_REDWOOD_TREE = redisterVegetation( + "nightshade_redwood_tree", + new NightshadeRedwoodTreeFeature(), + 1 + ); public static final BCLFeature BIG_ETHER_TREE = redisterVegetation("big_ether_tree", new BigEtherTreeFeature(), 1); - public static void register() {} + public static void register() { + } private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4883e4a5..de5ad664 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -1,15 +1,11 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; - import com.google.common.base.Function; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -19,27 +15,32 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; +import java.util.List; +import java.util.Random; + public class BigEtherTreeFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + BlockState log = Integrations.BYG.getDefaultState("ether_log"); BlockState wood = Integrations.BYG.getDefaultState("ether_wood"); Function splinePlacer = (bpos) -> { return log; }; Function replace = (state) -> { - return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().isReplaceable(); + return state.is(TagAPI.BLOCK_END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial() + .isReplaceable(); }; - + int height = MHelper.randRange(40, 60, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 2F, 0, 2F); SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); - + int count = height / 15; for (int i = 1; i < count; i++) { float splinePos = (float) i / (float) count; @@ -55,22 +56,22 @@ public class BigEtherTreeFeature extends DefaultFeature { List br = SplineHelper.copySpline(branch); SplineHelper.offsetParts(br, random, 0, 1, 1); SplineHelper.rotateSpline(br, angle); - + SplineHelper.offset(br, start); SplineHelper.fillSpline(br, world, wood, pos, replace); } } - + sdf.setReplaceFunction((state) -> { - return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().isReplaceable(); + return state.is(TagAPI.BLOCK_END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial() + .isReplaceable(); }).addPostProcess((info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { return wood; } return info.getState(); }).fillRecursive(world, pos); - + return true; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 43cd3689..ef330a00 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -1,12 +1,8 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; - import com.google.common.base.Function; import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,7 +10,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -31,26 +27,30 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; +import java.util.List; +import java.util.Random; + public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); BlockState wood = Integrations.BYG.getDefaultState("nightshade_wood"); BlockState leaves = Integrations.BYG.getDefaultState("nightshade_leaves"); BlockState leaves_flower = Integrations.BYG.getDefaultState("flowering_nightshade_leaves"); - + Function splinePlacer = (bpos) -> { return log; }; Function replace = (state) -> { - return state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().isReplaceable(); + return state.is(TagAPI.BLOCK_END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getMaterial() + .isReplaceable(); }; Function post = (info) -> { if (info.getState().equals(log) && (!info.getStateUp().equals(log) || !info.getStateDown().equals(log))) { @@ -61,15 +61,15 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { Function ignore = (state) -> { return state.equals(log) || state.equals(wood); }; - + int height = MHelper.randRange(40, 60, random); List trunk = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, height / 4); SplineHelper.offsetParts(trunk, random, 0.8F, 0, 0.8F); - + if (!SplineHelper.canGenerate(trunk, pos, world, replace)) { return false; } - + int count = height >> 2; float start = trunk.size() / 3F; float delta = trunk.size() * 0.6F; @@ -88,11 +88,13 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { SplineHelper.offset(branch, offset); SplineHelper.fillSpline(branch, world, wood, pos, replace); } - + SDF sdf = SplineHelper.buildSDF(trunk, 2.3F, 0.8F, splinePlacer); SDF roots = new SDFSphere().setRadius(2F).setBlock(log); - roots = new SDFFlatWave().setIntensity(2F).setRaysCount(MHelper.randRange(5, 7, random)) - .setAngle(random.nextFloat() * MHelper.PI2).setSource(roots); + roots = new SDFFlatWave().setIntensity(2F) + .setRaysCount(MHelper.randRange(5, 7, random)) + .setAngle(random.nextFloat() * MHelper.PI2) + .setSource(roots); sdf = new SDFSmoothUnion().setRadius(2F).setSourceA(sdf).setSourceB(roots); sdf.setReplaceFunction(replace).addPostProcess(post).fillRecursive(world, pos); Vector3f last = SplineHelper.getPos(trunk, trunk.size() - 1.35F); @@ -100,7 +102,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); BlocksHelper.setWithoutUpdate(world, p, y == 4 ? wood : log); } - + for (int y = 0; y < 16; y++) { BlockPos p = pos.offset(last.x() + 0.5, last.y() + y, last.z() + 0.5); if (world.isEmptyBlock(p)) { @@ -122,7 +124,7 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } } } - + MutableBlockPos mut = new MutableBlockPos(); Function leavesPost1 = (info) -> { if (info.getState().equals(log) || info.getState().equals(wood)) { @@ -172,19 +174,25 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { } return info.getState(); }; - + SDF canopy = new SDFCappedCone().setRadius1(12F).setRadius2(1f).setHeight(height * 0.3F).setBlock(leaves); canopy = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-3F, 3F, random); }).setSource(canopy); - canopy.addPostProcess(leavesPost1).addPostProcess(leavesPost2).fillRecursiveIgnore(world, - pos.offset(0, height * 0.75, 0), ignore); - + canopy.addPostProcess(leavesPost1) + .addPostProcess(leavesPost2) + .fillRecursiveIgnore(world, pos.offset(0, height * 0.75, 0), ignore); + return true; } - + static { - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.25F, 0.1F, 0), new Vector3f(0.40F, 0.2F, 0), - new Vector3f(0.50F, 0.4F, 0), new Vector3f(0.55F, 0.6F, 0)); + BRANCH = Lists.newArrayList( + new Vector3f(0, 0, 0), + new Vector3f(0.25F, 0.1F, 0), + new Vector3f(0.40F, 0.2F, 0), + new Vector3f(0.50F, 0.4F, 0), + new Vector3f(0.55F, 0.6F, 0) + ); } } diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 41830663..b874a391 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -1,18 +1,13 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.AABB; @@ -29,34 +24,37 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class OldBulbisTreeFeature extends DefaultFeature { private static final List SPLINE; private static final List ROOT; private static final List LEAF; private static final List SIDE; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - if (!world.getBlockState(pos.below(4)).getBlock().is(TagAPI.GEN_TERRAIN)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + if (!world.getBlockState(pos.below(4)).is(TagAPI.BLOCK_GEN_TERRAIN)) return false; + BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); BlockState wood = Integrations.BYG.getDefaultState("bulbis_wood"); - BlockState cap = Integrations.BYG - .getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); + BlockState cap = Integrations.BYG.getDefaultState(random.nextBoolean() ? "bulbis_shell" : "purple_bulbis_shell"); BlockState glow = Integrations.BYG.getDefaultState("purple_shroomlight"); - + Function replacement = (state) -> { - if (state.equals(stem) || state.equals(wood) || state.is(TagAPI.END_GROUND) - || state.getMaterial().equals(Material.PLANT)) { + if (state.equals(stem) || state.equals(wood) || state.is(TagAPI.BLOCK_END_GROUND) || state.getMaterial() + .equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); }; - + float size = MHelper.randRange(10, 20, random); float addSize = MHelper.randRange(1, 1.7F, random); float addRad = addSize * 0.5F + 0.5F; @@ -79,50 +77,49 @@ public class OldBulbisTreeFeature extends DefaultFeature { SDF branch = SplineHelper.buildSDF(spline, 2.3F * addRad, 1.3F * addRad, (bpos) -> { return stem; }); - + Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.35F; bigSphere(world, pos.offset(vec.x(), vec.y(), vec.z()), radius, cap, glow, wood, replacement, random); vec = SplineHelper.getPos(spline, 0.3F); makeRoots(world, pos.offset(vec.x(), vec.y(), vec.z()), size * 0.4F + 5, random, wood, replacement); - + sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); } - + sdf.setReplaceFunction(replacement).addPostProcess((info) -> { - if (info.getState().equals(stem) - && (!info.getStateUp().equals(stem) || !info.getStateDown().equals(stem))) { + if (info.getState().equals(stem) && (!info.getStateUp().equals(stem) || !info.getStateDown() + .equals(stem))) { return wood; } return info.getState(); }).fillArea(world, pos, limits); - + return true; } - - private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, - BlockState wood, Function replacement, Random random) { + + private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, BlockState wood, Function replacement, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); - + SDF sphereInner = new SDFSphere().setRadius(radius * 0.53F).setBlock(Blocks.AIR); sphereInner = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); }).setSource(sphereInner); - + SDF sphereGlow = new SDFSphere().setRadius(radius * 0.6F).setBlock(glow); sphereGlow = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1) * 2F; }).setSource(sphereGlow); sphereGlow = new SDFSubtraction().setSourceA(sphereGlow).setSourceB(sphereInner); - + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sphereInner); - + float offsetY = radius * 1.7F; sphere = new SDFUnion().setSourceA(sphere).setSourceB(sphereGlow); sphere = new SDFTranslate().setTranslate(0, offsetY, 0).setSource(sphere); - + int leafCount = (int) (radius * 0.5F) + 2; for (int i = 0; i < 4; i++) { float angle = (float) i / 4 * MHelper.PI2; @@ -130,13 +127,13 @@ public class OldBulbisTreeFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, radius * 1.4F); SplineHelper.fillSplineForce(spline, world, wood, pos, replacement); - + for (int j = 0; j < leafCount; j++) { float delta = ((float) j / (float) (leafCount - 1)); float scale = (float) Math.sin(delta * Math.PI) * 0.8F + 0.2F; float index = Mth.lerp(delta, 1F, 3.9F); Vector3f point = SplineHelper.getPos(spline, index); - + List side = SplineHelper.copySpline(SIDE); SplineHelper.rotateSpline(side, angle); SplineHelper.scale(side, scale * radius); @@ -144,40 +141,59 @@ public class OldBulbisTreeFeature extends DefaultFeature { SplineHelper.fillSplineForce(side, world, wood, p, replacement); } } - + sphere.fillArea(world, pos, new AABB(pos.above((int) offsetY)).inflate(radius * 1.3F)); } - - private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, - Function replacement) { + + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, Function replacement) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.BLOCK_GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, replacement); } } } - + static { - SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F)); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + SPLINE = Lists.newArrayList( + new Vector3f(0.00F, 0.00F, 0.00F), + new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), + new Vector3f(0.30F, 0.55F, 0.00F), + new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F) + ); + + ROOT = Lists.newArrayList( + new Vector3f(0F, 1F, 0), + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - - LEAF = Lists.newArrayList(new Vector3f(0.00F, 0.0F, 0), new Vector3f(0.10F, 0.4F, 0), - new Vector3f(0.40F, 0.8F, 0), new Vector3f(0.75F, 0.9F, 0), new Vector3f(1.00F, 0.8F, 0)); - - SIDE = Lists.newArrayList(new Vector3f(0, -0.3F, -0.5F), new Vector3f(0, -0.1F, -0.3F), - new Vector3f(0, 0.0F, 0.0F), new Vector3f(0, -0.1F, 0.3F), new Vector3f(0, -0.3F, 0.5F)); + + LEAF = Lists.newArrayList( + new Vector3f(0.00F, 0.0F, 0), + new Vector3f(0.10F, 0.4F, 0), + new Vector3f(0.40F, 0.8F, 0), + new Vector3f(0.75F, 0.9F, 0), + new Vector3f(1.00F, 0.8F, 0) + ); + + SIDE = Lists.newArrayList( + new Vector3f(0, -0.3F, -0.5F), + new Vector3f(0, -0.1F, -0.3F), + new Vector3f(0, 0.0F, 0.0F), + new Vector3f(0, -0.1F, 0.3F), + new Vector3f(0, -0.3F, 0.5F) + ); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 507cfc15..9b9abaec 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,44 +1,45 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import org.jetbrains.annotations.NotNull; +import ru.betterend.registry.EndBlocks; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIAlloyingCategory implements TransferRecipeCategory { - - @Override - public @NotNull ResourceLocation getIdentifier() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); +public class REIAlloyingCategory implements DisplayCategory { + private final EntryStack ICON; + + REIAlloyingCategory(EntryStack icon) { + ICON = icon; } @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.END_STONE_SMELTER; + public @NotNull CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.ALLOYING; + } + + @Override + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getIcon() { + return ICON; } @Override @@ -49,39 +50,65 @@ public class REIAlloyingCategory implements TransferRecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 9))); - widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)).animationDurationMS(10000)); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 5, bounds.y + 5), - new TranslatableComponent("category.rei.cooking.time&xp", df.format(display.getXp()), df.format(smeltTime / 20D))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); - widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(smeltTime)); - List> inputEntries = display.getInputEntries(); - widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); + widgets.add(Widgets.createBurningFire(new Point(startPoint.x - 9, startPoint.y + 20)) + .animationDurationMS(10000)); + widgets.add(Widgets.createLabel( + new Point(bounds.x + bounds.width - 5, bounds.y + 5), + new TranslatableComponent("category.rei.cooking.time&xp", + df.format(display.getXp()), + df.format(smeltTime / 20D) + ) + ).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)) + .animationDurationTicks(smeltTime)); + List inputEntries = display.getInputEntries(); + widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)) + .entries(inputEntries.get(0)) + .markInput()); if (inputEntries.size() > 1) { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); - } else { - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)) + .entries(inputEntries.get(1)) + .markInput()); } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + else { + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)) + .entries(Lists.newArrayList()) + .markInput()); + } + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)) + .entries(display.getOutputEntries().get(0)) + .disableBackground() + .markOutput()); return widgets; } - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, - IntList redSlots) { + //TODO: 1.18 REI find replacement + //@Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAlloyingDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); matrices.translate(0, 0, 400); if (redSlots.contains(0)) { - GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 1, startPoint.x - 20 + 16, startPoint.y + 1 + 16, 1090453504); - GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 1, startPoint.x + 1 + 16, startPoint.y + 1 + 16, 1090453504); + GuiComponent.fill( + matrices, + startPoint.x - 20, + startPoint.y + 1, + startPoint.x - 20 + 16, + startPoint.y + 1 + 16, + 1090453504 + ); + GuiComponent.fill( + matrices, + startPoint.x + 1, + startPoint.y + 1, + startPoint.x + 1 + 16, + startPoint.y + 1 + 16, + 1090453504 + ); } matrices.popPose(); } - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } - @Override public int getDisplayHeight() { return 49; diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java index 5937c021..f9deb7d8 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingDisplay.java @@ -1,79 +1,67 @@ package ru.betterend.integration.rei; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.NotNull; +import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import ru.betterend.recipe.builders.AlloyingRecipe; + import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import org.jetbrains.annotations.NotNull; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.crafting.BlastingRecipe; -import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; -import ru.betterend.recipe.builders.AlloyingRecipe; - -public class REIAlloyingDisplay implements TransferRecipeDisplay { - +public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDisplay { + private static List fuel; private Recipe recipe; - private List> input; - private List output; private float xp; private double smeltTime; + public REIAlloyingDisplay(AlloyingRecipe recipe) { - this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getSmeltTime(); + this(recipe, recipe.getExperience(), recipe.getSmeltTime()); } - public REIAlloyingDisplay(BlastingRecipe recipe) { + protected REIAlloyingDisplay(Recipe recipe, float xp, double smeltTime) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getCookingTime(); + this.xp = xp; + this.smeltTime = smeltTime; } + public static List getFuel() { return fuel; } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @Override - public @NotNull List> getInputEntries() { - return this.input; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.ALLOYING; } - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } public float getXp() { return this.xp; @@ -86,26 +74,33 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { public Optional> getOptionalRecipe() { return Optional.ofNullable(recipe); } - + @Override public int getWidth() { return 2; } - + @Override public int getHeight() { return 1; } - - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + // } static { - fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() - .map(Item::getDefaultInstance).map(EntryStack::create) - .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel") - .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); + fuel = EndStoneSmelterBlockEntity.availableFuels() + .keySet() + .stream() + .map(Item::getDefaultInstance) + .map(EntryStacks::of) + .map(e -> e.setting( + EntryStack.Settings.TOOLTIP_APPEND_EXTRA, + stack -> Collections.singletonList(new TranslatableComponent( + "category.rei.smelting.fuel").withStyle(ChatFormatting.YELLOW)) + )) + .collect(Collectors.toList()); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 8b7a552a..673ab572 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -1,91 +1,106 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DisplayRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.widgets.Slot; -import me.shedaniel.rei.api.widgets.Tooltip; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; - -public class REIAlloyingFuelCategory implements RecipeCategory { +public class REIAlloyingFuelCategory implements DisplayCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); - + @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } - + @Override - public @NotNull String getCategoryName() { - return I18n.get("category.rei.fuel"); + public @NotNull Component getTitle() { + return new TranslatableComponent("category.rei.fuel"); } - + @Override public int getDisplayHeight() { return 49; } - + @Override - public @NotNull EntryStack getLogo() { - return EntryStack.create(Items.COAL); + public @NotNull EntryStack getIcon() { + return EntryStacks.of(Items.COAL); } - + @Override - public @NotNull List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + public List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); List widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - widgets.add(Widgets.createLabel(new Point(bounds.x + 26, bounds.getMaxY() - 15), new TranslatableComponent("category.rei.fuel.time", burnTime)) - .color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); - widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)).animationDurationTicks(recipeDisplay.getFuelTime())); - widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)).entries(recipeDisplay.getInputEntries().get(0)).markInput()); + widgets.add(Widgets.createLabel( + new Point(bounds.x + 26, bounds.getMaxY() - 15), + new TranslatableComponent("category.rei.fuel.time", burnTime) + ).color(0xFF404040, 0xFFBBBBBB).noShadow().leftAligned()); + widgets.add(Widgets.createBurningFire(new Point(bounds.x + 6, startPoint.y + 1)) + .animationDurationTicks(recipeDisplay.getFuelTime())); + widgets.add(Widgets.createSlot(new Point(bounds.x + 6, startPoint.y + 18)) + .entries(recipeDisplay.getInputEntries().get(0)) + .markInput()); return widgets; } - + @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAlloyingFuelDisplay recipe) { - Slot slot = Widgets.createSlot(new Point(0, 0)).entries(recipe.getInputEntries().get(0)).disableBackground().disableHighlight(); + public DisplayRenderer getDisplayRenderer(REIAlloyingFuelDisplay recipe) { + Slot slot = Widgets.createSlot(new Point(0, 0)) + .entries(recipe.getInputEntries().get(0)) + .disableBackground() + .disableHighlight(); String burnItems = DECIMAL_FORMAT.format(recipe.getFuelTime() / 200d); - return new RecipeEntry() { - private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); - + return new DisplayRenderer() { + private TranslatableComponent text = new TranslatableComponent( + "category.rei.fuel.time_short.items", + burnItems + ); + @Override public int getHeight() { return 22; } - + @Nullable @Override public Tooltip getTooltip(Point point) { - if (slot.containsMouse(point)) - return slot.getCurrentTooltip(point); + if (slot.containsMouse(point)) return slot.getCurrentTooltip(point); return null; } - + @Override public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { slot.setZ(getZ() + 50); slot.getBounds().setLocation(bounds.x + 4, bounds.y + 2); slot.render(matrices, mouseX, mouseY, delta); - Minecraft.getInstance().font.drawShadow(matrices, text.getVisualOrderText(), bounds.x + 25, bounds.y + 8, -1); + Minecraft.getInstance().font.drawShadow( + matrices, + text.getVisualOrderText(), + bounds.x + 25, + bounds.y + 8, + -1 + ); } }; } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java index d9e9d827..eeed9804 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -1,40 +1,36 @@ package ru.betterend.integration.rei; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import net.minecraft.nbt.CompoundTag; + import java.util.Collections; import java.util.List; -import org.jetbrains.annotations.NotNull; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeDisplay; -import net.minecraft.resources.ResourceLocation; - -public class REIAlloyingFuelDisplay implements RecipeDisplay { - private final EntryStack fuel; +public class REIAlloyingFuelDisplay extends BasicDisplay { private final int fuelTime; - - public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { - this.fuel = fuel; + + public REIAlloyingFuelDisplay(List fuel, CompoundTag tag) { + this(fuel, tag.getInt("fuelTime")); + } + + public REIAlloyingFuelDisplay(List fuel, int fuelTime) { + super(fuel, Collections.emptyList()); this.fuelTime = fuelTime; } - + /*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { + this.fuel = fuel; + this.fuelTime = fuelTime; + }*/ + @Override - public @NotNull List> getInputEntries() { - return Collections.singletonList(Collections.singletonList(fuel)); - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.emptyList(); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } - + public int getFuelTime() { return fuelTime; } - + } diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index fddf1a83..ef1220e1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,50 +1,53 @@ package ru.betterend.integration.rei; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.util.LangUtil; -public class REIAnvilCategory implements TransferRecipeCategory { +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; - @Override - public @NotNull ResourceLocation getIdentifier() { - return REIPlugin.SMITHING; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); +public class REIAnvilCategory implements DisplayCategory { + private final EntryStack[] ANVILS; + + REIAnvilCategory(EntryStack[] anvils) { + ANVILS = anvils; } @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.ANVILS[0]; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.SMITHING; } + @Override + public @NotNull Component getTitle() { + return new TranslatableComponent(Blocks.ANVIL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getIcon() { + return ANVILS[0]; + } + + @Override public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -53,49 +56,66 @@ public class REIAnvilCategory implements TransferRecipeCategory int x = startPoint.x + 10; int y = startPoint.y; widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); - List> inputEntries = display.getInputEntries(); - List materials = inputEntries.get(1); + List inputEntries = display.getInputEntries(); + EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { - Block block = ((BlockItem) anvil.getItem()).getBlock(); + List> anvils = Arrays.stream(ANVILS).filter(anvil -> { + Object value = anvil.getValue(); + if (value instanceof ItemStack) { + value = ((ItemStack) value).getItem(); + } + Block block = ((BlockItem) value).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; } return anvilLevel == 1; }).collect(Collectors.toList()); - materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); - widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), - new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createLabel( + new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), + new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage()) + ).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)) + .entries(display.getOutputEntries().get(0)) + .disableBackground() + .markOutput()); widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); - + return widgets; } - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, - IntList redSlots) { + //TODO: 1.18 REI, find replacement + //@Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIAnvilDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); matrices.translate(0, 0, 400); if (redSlots.contains(0)) { - GuiComponent.fill(matrices, startPoint.x - 20, startPoint.y + 3, startPoint.x - 20 + 16, startPoint.y + 3 + 16, 1090453504); - GuiComponent.fill(matrices, startPoint.x + 1, startPoint.y + 3, startPoint.x + 1 + 16, startPoint.y + 3 + 16, 1090453504); + GuiComponent.fill( + matrices, + startPoint.x - 20, + startPoint.y + 3, + startPoint.x - 20 + 16, + startPoint.y + 3 + 16, + 1090453504 + ); + GuiComponent.fill( + matrices, + startPoint.x + 1, + startPoint.y + 3, + startPoint.x + 1 + 16, + startPoint.y + 3 + 16, + 1090453504 + ); } matrices.popPose(); } - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); - } - @Override public int getDisplayHeight() { return 60; } - + } diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 3ca2f929..d1b32775 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -1,81 +1,61 @@ package ru.betterend.integration.rei; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.NotNull; +import ru.bclib.recipes.AnvilRecipe; + import java.util.Collections; -import java.util.List; import java.util.Optional; -import org.jetbrains.annotations.NotNull; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.recipe.builders.AnvilRecipe; - -public class REIAnvilDisplay implements TransferRecipeDisplay { +public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final AnvilRecipe recipe; - private final List> input; - private final List output; public REIAnvilDisplay(AnvilRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); + + inputs.get(1).forEach(entryStack -> { + if (entryStack.getValue() instanceof ItemStack itemStack) { + itemStack.setCount(recipe.getInputCount()); + } + }); } public int getDamage() { return recipe.getDamage(); } - - public int getInputCount() { - return recipe.getInputCount(); - } - + public int getAnvilLevel() { return recipe.getAnvilLevel(); } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - - @Override - public @NotNull List> getInputEntries() { - return this.input; - } @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } - @Override - public @NotNull List> getRequiredEntries() { - return input; - } - @Override public int getWidth() { return 2; } - + @Override public int getHeight() { return 1; } - - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - AbstractContainerMenu container) { - return input; - } } diff --git a/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java new file mode 100644 index 00000000..5a133156 --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java @@ -0,0 +1,9 @@ +package ru.betterend.integration.rei; + +import net.minecraft.world.item.crafting.BlastingRecipe; + +public class REIBlastingDisplay extends REIAlloyingDisplay { + public REIBlastingDisplay(BlastingRecipe recipe) { + super(recipe, recipe.getExperience(), recipe.getCookingTime()); + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java index 9d6a0118..5365baf4 100644 --- a/src/main/java/ru/betterend/integration/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,14 +1,9 @@ package ru.betterend.integration.rei; -import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; -import me.shedaniel.rei.server.ContainerInfoHandler; -import ru.betterend.client.gui.EndStoneSmelterScreenHandler; -import ru.betterend.recipe.builders.AlloyingRecipe; - public class REIContainer implements Runnable { - + @Override public void run() { - ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); + //ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 5acb5b12..0be2955a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,50 +1,46 @@ package ru.betterend.integration.rei; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; -public class REIInfusionCategory implements TransferRecipeCategory { +import java.util.ArrayList; +import java.util.List; + +public class REIInfusionCategory implements DisplayCategory { private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); - - @Override - public @NotNull ResourceLocation getIdentifier() { - return InfusionRecipe.ID; - } - - @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + private final EntryStack ICON; + + REIInfusionCategory(EntryStack icon) { + ICON = icon; } @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.INFUSION_RITUAL; + public @NotNull CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; } @Override - public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + } + + @Override + public @NotNull EntryStack getIcon() { + return ICON; } @Override @@ -52,27 +48,60 @@ public class REIInfusionCategory implements TransferRecipeCategory widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - List> inputEntries = display.getInputEntries(); - List> outputEntries = display.getResultingEntries(); + List inputEntries = display.getInputEntries(); + List outputEntries = display.getOutputEntries(); + if (inputEntries.size() < 9) { + List newList = new ArrayList(9); + newList.addAll(inputEntries); + for (int i = inputEntries.size(); i < 9; i++) { + newList.add(EntryIngredient.empty()); + } + inputEntries = newList; + } widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)).entries(inputEntries.get(3)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)).entries(inputEntries.get(5)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)).entries(inputEntries.get(7)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)).entries(inputEntries.get(2)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)).entries(inputEntries.get(4)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)).entries(inputEntries.get(6)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)).entries(inputEntries.get(8)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)).entries(outputEntries.get(0)).disableBackground().markOutput()); - widgets.add(Widgets.createLabel(new Point(bounds.getMaxX() - 5, bounds.y + 6), new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime())) - .noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)) + .entries(inputEntries.get(1)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 28, centerPoint.y)) + .entries(inputEntries.get(3)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y + 28)) + .entries(inputEntries.get(5)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 28, centerPoint.y)) + .entries(inputEntries.get(7)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y - 24)) + .entries(inputEntries.get(2)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 24, centerPoint.y + 24)) + .entries(inputEntries.get(4)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y + 24)) + .entries(inputEntries.get(6)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x - 24, centerPoint.y - 24)) + .entries(inputEntries.get(8)) + .disableBackground() + .markInput()); + widgets.add(Widgets.createSlot(new Point(centerPoint.x + 80, centerPoint.y)) + .entries(outputEntries.get(0)) + .disableBackground() + .markOutput()); + widgets.add(Widgets.createLabel( + new Point(bounds.getMaxX() - 5, bounds.y + 6), + new TranslatableComponent("category.rei.infusion.time&val", display.getInfusionTime()) + ).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); return widgets; } - - @Override - public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} @Override public int getDisplayHeight() { diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index d8411bc9..a6fd9e9f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -1,38 +1,29 @@ package ru.betterend.integration.rei; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.recipe.builders.AlloyingRecipe; +import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.InfusionRecipe; -public class REIInfusionDisplay implements TransferRecipeDisplay { +import java.util.Collections; +import java.util.Optional; + +public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final InfusionRecipe recipe; - private final List> input; - private final List output; private final int time; public REIInfusionDisplay(InfusionRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = Lists.newArrayList(); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.time = recipe.getInfusionTime(); - - recipe.getIngredients().forEach(ingredient -> { - input.add(EntryStack.ofIngredient(ingredient)); - }); } public int getInfusionTime() { @@ -40,42 +31,32 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - - @Override - public @NotNull List> getInputEntries() { - return this.input; - } @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { - return AlloyingRecipe.ID; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; } - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } - + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } + @Override public int getWidth() { return 0; } - + @Override public int getHeight() { return 0; } - - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + //} } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index e05fd55d..3371c605 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,89 +1,97 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.plugin.common.DefaultPlugin; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.Blocks; +import ru.bclib.blocks.BaseFurnaceBlock; +import ru.bclib.recipes.AnvilRecipe; +import ru.betterend.BetterEnd; +import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.recipe.builders.InfusionRecipe; +import ru.betterend.registry.EndBlocks; + import java.util.List; import java.util.stream.Collectors; -import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeHelper; -import me.shedaniel.rei.api.plugins.REIPluginV0; -import me.shedaniel.rei.plugin.DefaultPlugin; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.BlastingRecipe; -import net.minecraft.world.level.block.Blocks; -import ru.bclib.blocks.BaseFurnaceBlock; -import ru.betterend.BetterEnd; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.recipe.builders.AnvilRecipe; -import ru.betterend.recipe.builders.InfusionRecipe; -import ru.betterend.registry.EndBlocks; - -@Environment(EnvType.CLIENT) -public class REIPlugin implements REIPluginV0 { - +//https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); - public final static ResourceLocation ALLOYING = AlloyingRecipe.ID; - public final static ResourceLocation SMITHING = AnvilRecipe.ID; - public final static ResourceLocation INFUSION = InfusionRecipe.ID; - - public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); - public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); - public final static EntryStack[] FURNACES; - public final static EntryStack[] ANVILS; - + public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of( + BetterEnd.MOD_ID, + "alloying_fuel" + ); + public final static CategoryIdentifier ALLOYING = CategoryIdentifier.of( + BetterEnd.MOD_ID, + AlloyingRecipe.GROUP + ); + public final static CategoryIdentifier SMITHING = CategoryIdentifier.of( + BetterEnd.MOD_ID, + AnvilRecipe.ID.getPath() + ); + public final static CategoryIdentifier INFUSION = CategoryIdentifier.of( + BetterEnd.MOD_ID, + InfusionRecipe.GROUP + ); + @Override - public ResourceLocation getPluginIdentifier() { - return PLUGIN_ID; + public void registerDisplays(DisplayRegistry registry) { + registry.registerRecipeFiller(AlloyingRecipe.class, AlloyingRecipe.TYPE, REIAlloyingDisplay::new); + registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new); + registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); + registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); + + //TODO: 1.18 REI fix this +// FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { +// if (time >= 2000) { +// final List list = Collections.singletonList(EntryIngredients.of(item)); +// registry.add(new REIAlloyingFuelDisplay(list, time)); +// } +// }); } @Override - public void registerRecipeDisplays(RecipeHelper recipeHelper) { - recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); - recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); - FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { - if (time >= 2000) { - recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); - } - }); - } - - @Override - public void registerOthers(RecipeHelper recipeHelper) { - recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVILS); - recipeHelper.removeAutoCraftButton(ALLOYING_FUEL); - recipeHelper.removeAutoCraftButton(SMITHING); - - recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); - recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); - } - - @Override - public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories( - new REIAlloyingFuelCategory(), - new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory()); - } - - static { - List anvils = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() - .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); - anvils.add(0, EntryStack.create(Blocks.ANVIL)); - ANVILS = anvils.toArray(new EntryStack[0]); - FURNACES = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() - .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) - .toArray(new EntryStack[0]); + public void registerCategories(CategoryRegistry registry) { + EntryStack endStoneSmelter = EntryStacks.of(EndBlocks.END_STONE_SMELTER); + EntryStack infusionRitual = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); + List> anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks() + .stream() + .filter(EndAnvilBlock.class::isInstance) + .collect(Collectors.toList()))); + anvils.add(0, EntryStacks.of(Blocks.ANVIL)); + List> ITEM_FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks() + .stream() + .filter(BaseFurnaceBlock.class::isInstance) + .collect(Collectors.toList()))); + EntryStack[] anvilsArray = anvils.toArray(new EntryStack[0]); + EntryStack[] ITEM_FURNACESArray = ITEM_FURNACES.toArray(new EntryStack[0]); + + registry.add( + new REIAlloyingFuelCategory(), + new REIAlloyingCategory(endStoneSmelter), + new REIInfusionCategory(infusionRitual), + new REIAnvilCategory(anvilsArray) + ); + + registry.addWorkstations(ALLOYING_FUEL, endStoneSmelter); + registry.addWorkstations(ALLOYING, endStoneSmelter); + registry.addWorkstations(INFUSION, infusionRitual); + registry.addWorkstations(SMITHING, anvilsArray); + registry.removePlusButton(ALLOYING_FUEL); + registry.removePlusButton(SMITHING); + + registry.addWorkstations(DefaultPlugin.SMELTING, ITEM_FURNACESArray); + registry.addWorkstations(DefaultPlugin.FUEL, ITEM_FURNACESArray); } } diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java deleted file mode 100644 index 9146ab8e..00000000 --- a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.betterend.interfaces; - -import java.util.List; - -import ru.betterend.recipe.builders.AnvilRecipe; - -public interface AnvilScreenHandlerExtended { - void be_updateCurrentRecipe(AnvilRecipe recipe); - AnvilRecipe be_getCurrentRecipe(); - List be_getRecipes(); - - default void be_nextRecipe() { - List recipes = be_getRecipes(); - if (recipes.size() < 2) return; - AnvilRecipe current = be_getCurrentRecipe(); - int i = recipes.indexOf(current) + 1; - if (i >= recipes.size()) { - i = 0; - } - be_updateCurrentRecipe(recipes.get(i)); - } - - default void be_previousRecipe() { - List recipes = be_getRecipes(); - if (recipes.size() < 2) return; - AnvilRecipe current = be_getCurrentRecipe(); - int i = recipes.indexOf(current) - 1; - if (i <= 0) { - i = recipes.size() - 1; - } - be_updateCurrentRecipe(recipes.get(i)); - } -} diff --git a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java deleted file mode 100644 index 9f939661..00000000 --- a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java +++ /dev/null @@ -1,3 +0,0 @@ -package ru.betterend.interfaces; - -public interface BetterEndRecipe {} diff --git a/src/main/java/ru/betterend/interfaces/FallFlyingItem.java b/src/main/java/ru/betterend/interfaces/FallFlyingItem.java index e75888d7..fbb6bc0a 100644 --- a/src/main/java/ru/betterend/interfaces/FallFlyingItem.java +++ b/src/main/java/ru/betterend/interfaces/FallFlyingItem.java @@ -4,5 +4,6 @@ import net.minecraft.resources.ResourceLocation; public interface FallFlyingItem { ResourceLocation getModelTexture(); + double getMovementFactor(); } diff --git a/src/main/java/ru/betterend/interfaces/IBiomeArray.java b/src/main/java/ru/betterend/interfaces/IBiomeArray.java deleted file mode 100644 index 9c632b6d..00000000 --- a/src/main/java/ru/betterend/interfaces/IBiomeArray.java +++ /dev/null @@ -1,8 +0,0 @@ -package ru.betterend.interfaces; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.biome.Biome; - -public interface IBiomeArray { - public void be_setBiome(Biome biome, BlockPos pos); -} diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java deleted file mode 100644 index 4dbbfde4..00000000 --- a/src/main/java/ru/betterend/interfaces/IBiomeList.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.betterend.interfaces; - -import java.util.List; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; - -public interface IBiomeList { - public List> getBiomes(); -} diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 7df19bc6..feb05e07 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,9 @@ package ru.betterend.interfaces; +import net.minecraft.world.entity.Entity; + public interface ISlime { public void be_setSlimeSize(int size, boolean heal); + + void entityRemove(Entity.RemovalReason removalReason); } diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java deleted file mode 100644 index ef19bc36..00000000 --- a/src/main/java/ru/betterend/interfaces/ISpetialItem.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.betterend.interfaces; - -public interface ISpetialItem { - public int getStackSize(); - - public boolean canPlaceOnWater(); -} diff --git a/src/main/java/ru/betterend/interfaces/MultiModelItem.java b/src/main/java/ru/betterend/interfaces/MultiModelItem.java index a486db0a..1245197f 100644 --- a/src/main/java/ru/betterend/interfaces/MultiModelItem.java +++ b/src/main/java/ru/betterend/interfaces/MultiModelItem.java @@ -2,15 +2,14 @@ package ru.betterend.interfaces; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; public interface MultiModelItem { @Environment(EnvType.CLIENT) void registerModelPredicate(); - + static void register() { - EndItems.getModItems(BetterEnd.MOD_ID).forEach(item -> { + EndItems.getModItems().forEach(item -> { if (item instanceof MultiModelItem) { ((MultiModelItem) item).registerModelPredicate(); } diff --git a/src/main/java/ru/betterend/interfaces/PottablePlant.java b/src/main/java/ru/betterend/interfaces/PottablePlant.java new file mode 100644 index 00000000..edb64ccc --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/PottablePlant.java @@ -0,0 +1,18 @@ +package ru.betterend.interfaces; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.world.level.block.Block; + +public interface PottablePlant { + boolean canPlantOn(Block block); + + default boolean canBePotted() { + return true; + } + + @Environment(EnvType.CLIENT) + default String getPottedState() { + return ""; + } +} diff --git a/src/main/java/ru/betterend/interfaces/PottableTerrain.java b/src/main/java/ru/betterend/interfaces/PottableTerrain.java new file mode 100644 index 00000000..9bf328ae --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/PottableTerrain.java @@ -0,0 +1,7 @@ +package ru.betterend.interfaces; + +public interface PottableTerrain { + default boolean canBePotted() { + return true; + } +} diff --git a/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java b/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java new file mode 100644 index 00000000..ff2f3f84 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java @@ -0,0 +1,9 @@ +package ru.betterend.interfaces; + +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public interface StructureFeaturesAccessor { + ConfiguredStructureFeature> getEndCity(); +} diff --git a/src/main/java/ru/betterend/interfaces/TargetChecker.java b/src/main/java/ru/betterend/interfaces/TargetChecker.java new file mode 100644 index 00000000..fde54ed2 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/TargetChecker.java @@ -0,0 +1,5 @@ +package ru.betterend.interfaces; + +public interface TargetChecker { + boolean isTarget(); +} diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index cfd23f30..803cf507 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -4,6 +4,8 @@ import net.minecraft.core.BlockPos; public interface TeleportingEntity { void be_setExitPos(BlockPos pos); + void be_resetExitPos(); + boolean be_canTeleport(); } diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java index b1953792..8797b6fa 100644 --- a/src/main/java/ru/betterend/item/ArmoredElytra.java +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -19,58 +19,80 @@ import ru.betterend.interfaces.MultiModelItem; import ru.betterend.registry.EndItems; public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, FallFlyingItem { - + private final ResourceLocation wingTexture; private final Item repairItem; private final double movementFactor; private final float toughness; private final int defense; - + public ArmoredElytra(String name, ArmorMaterial material, Item repairItem, int durability, double movementFactor, boolean fireproof) { - super(material, EquipmentSlot.CHEST, fireproof ? - EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC).fireResistant() : - EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC)); + super( + material, + EquipmentSlot.CHEST, + fireproof ? EndItems.makeEndItemSettings() + .durability(durability) + .rarity(Rarity.EPIC) + .fireResistant() : EndItems.makeEndItemSettings() + .durability(durability) + .rarity(Rarity.EPIC) + ); this.wingTexture = BetterEnd.makeID("textures/entity/" + name + ".png"); this.repairItem = repairItem; this.movementFactor = movementFactor; this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75); this.toughness = material.getToughness() / 1.75F; - addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], - "Armor modifier", defense, AttributeModifier.Operation.ADDITION)); - addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], - "Armor toughness", toughness, AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + Attributes.ARMOR, + new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], + "Armor modifier", + defense, + AttributeModifier.Operation.ADDITION + ) + ); + addAttributeModifier( + Attributes.ARMOR_TOUGHNESS, + new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], + "Armor toughness", + toughness, + AttributeModifier.Operation.ADDITION + ) + ); } - + @Override public double getMovementFactor() { return movementFactor; } - + @Override @Environment(EnvType.CLIENT) public ResourceLocation getModelTexture() { return wingTexture; } - + @Override public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) { return super.isValidRepairItem(itemStack, itemStack2) || itemStack2.getItem() == repairItem; } - + @Override public int getDefense() { return defense; } - + @Override public float getToughness() { return toughness; } - + @Override @Environment(EnvType.CLIENT) public void registerModelPredicate() { - FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + FabricModelPredicateProviderRegistry.register( + this, + new ResourceLocation("broken"), + (itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F + ); } } diff --git a/src/main/java/ru/betterend/item/CrystaliteArmor.java b/src/main/java/ru/betterend/item/CrystaliteArmor.java index c2e084ff..3aeeaf4c 100644 --- a/src/main/java/ru/betterend/item/CrystaliteArmor.java +++ b/src/main/java/ru/betterend/item/CrystaliteArmor.java @@ -12,14 +12,14 @@ import ru.betterend.effects.EndStatusEffects; import ru.betterend.item.material.EndArmorMaterial; public class CrystaliteArmor extends BaseArmorItem { - + public final static TranslatableComponent CHEST_DESC; public final static TranslatableComponent BOOTS_DESC; - + public CrystaliteArmor(EquipmentSlot equipmentSlot, Properties settings) { super(EndArmorMaterial.CRYSTALITE, equipmentSlot, settings); } - + public static boolean hasFullSet(LivingEntity owner) { for (ItemStack armorStack : owner.getArmorSlots()) { if (!(armorStack.getItem() instanceof CrystaliteArmor)) { @@ -28,11 +28,13 @@ public class CrystaliteArmor extends BaseArmorItem { } return true; } - + public static void applySetEffect(LivingEntity owner) { - owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_HEALTH_REGEN)); + if ((owner.tickCount & 63) == 0) { + owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_HEALTH_REGEN)); + } } - + static { Style descStyle = Style.EMPTY.applyFormats(ChatFormatting.DARK_AQUA, ChatFormatting.ITALIC); CHEST_DESC = new TranslatableComponent("tooltip.armor.crystalite_chest"); diff --git a/src/main/java/ru/betterend/item/CrystaliteBoots.java b/src/main/java/ru/betterend/item/CrystaliteBoots.java index 1b84601e..66e63151 100644 --- a/src/main/java/ru/betterend/item/CrystaliteBoots.java +++ b/src/main/java/ru/betterend/item/CrystaliteBoots.java @@ -1,9 +1,5 @@ package ru.betterend.item; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -15,21 +11,26 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; -public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier { +import java.util.List; +public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier { + public CrystaliteBoots() { super(EquipmentSlot.FEET, EndItems.makeEndItemSettings().rarity(Rarity.RARE)); } - + @Override public void applyEffect(LivingEntity owner) { - owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_MOVE_SPEED)); + if ((owner.tickCount & 63) == 0) { + owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_MOVE_SPEED)); + } } - + @Override @Environment(EnvType.CLIENT) public void appendHoverText(ItemStack stack, @Nullable Level level, List lines, TooltipFlag tooltip) { diff --git a/src/main/java/ru/betterend/item/CrystaliteChestplate.java b/src/main/java/ru/betterend/item/CrystaliteChestplate.java index 920b3706..5f3035b0 100644 --- a/src/main/java/ru/betterend/item/CrystaliteChestplate.java +++ b/src/main/java/ru/betterend/item/CrystaliteChestplate.java @@ -1,9 +1,5 @@ package ru.betterend.item; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -15,21 +11,24 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; -public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectApplier { +import java.util.List; +public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectApplier { + public CrystaliteChestplate() { super(EquipmentSlot.CHEST, EndItems.makeEndItemSettings().rarity(Rarity.RARE)); } - + @Override public void applyEffect(LivingEntity owner) { owner.addEffect(new MobEffectInstance(EndStatusEffects.CRYSTALITE_DIG_SPEED)); } - + @Override @Environment(EnvType.CLIENT) public void appendHoverText(ItemStack stack, @Nullable Level level, List lines, TooltipFlag tooltip) { diff --git a/src/main/java/ru/betterend/item/CrystaliteElytra.java b/src/main/java/ru/betterend/item/CrystaliteElytra.java index 489eaf3f..78a00940 100644 --- a/src/main/java/ru/betterend/item/CrystaliteElytra.java +++ b/src/main/java/ru/betterend/item/CrystaliteElytra.java @@ -16,53 +16,68 @@ import ru.betterend.interfaces.MultiModelItem; import ru.betterend.registry.EndItems; public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem, FallFlyingItem { - + private final ResourceLocation wingTexture; private final double movementFactor; private final int defense; private final float toughness; - + public CrystaliteElytra(int durability, double movementFactor) { super(EquipmentSlot.CHEST, EndItems.makeEndItemSettings().durability(durability).rarity(Rarity.EPIC)); this.wingTexture = BetterEnd.makeID("textures/entity/elytra_crystalite.png"); this.movementFactor = movementFactor; this.defense = (int) ((double) material.getDefenseForSlot(EquipmentSlot.CHEST) / 1.75); this.toughness = material.getToughness() / 1.75F; - addAttributeModifier(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], - "Armor modifier", defense, AttributeModifier.Operation.ADDITION)); - addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], - "Armor toughness", toughness, AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + Attributes.ARMOR, + new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], + "Armor modifier", + defense, + AttributeModifier.Operation.ADDITION + ) + ); + addAttributeModifier( + Attributes.ARMOR_TOUGHNESS, + new AttributeModifier(ARMOR_MODIFIER_UUID_PER_SLOT[2], + "Armor toughness", + toughness, + AttributeModifier.Operation.ADDITION + ) + ); } - + @Override public boolean isValidRepairItem(ItemStack itemStack, ItemStack itemStack2) { return super.isValidRepairItem(itemStack, itemStack2) || itemStack2.getItem() == EndItems.ENCHANTED_MEMBRANE; } - + @Override public double getMovementFactor() { return movementFactor; } - + @Override @Environment(EnvType.CLIENT) public ResourceLocation getModelTexture() { return wingTexture; } - + @Override public int getDefense() { return defense; } - + @Override public float getToughness() { return toughness; } - + @Override public void registerModelPredicate() { - FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + FabricModelPredicateProviderRegistry.register( + this, + new ResourceLocation("broken"), + (itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F + ); } } diff --git a/src/main/java/ru/betterend/item/CrystaliteHelmet.java b/src/main/java/ru/betterend/item/CrystaliteHelmet.java index ec297001..34ff61f6 100644 --- a/src/main/java/ru/betterend/item/CrystaliteHelmet.java +++ b/src/main/java/ru/betterend/item/CrystaliteHelmet.java @@ -1,18 +1,21 @@ package ru.betterend.item; -import java.util.UUID; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Rarity; import ru.betterend.registry.EndAttributes; import ru.betterend.registry.EndItems; -public class CrystaliteHelmet extends CrystaliteArmor { +import java.util.UUID; +public class CrystaliteHelmet extends CrystaliteArmor { + public CrystaliteHelmet() { super(EquipmentSlot.HEAD, EndItems.makeEndItemSettings().rarity(Rarity.RARE)); UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[EquipmentSlot.HEAD.getIndex()]; - addAttributeModifier(EndAttributes.BLINDNESS_RESISTANCE, new AttributeModifier(uuid, "Helmet blindness resistance", 1.0, AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + EndAttributes.BLINDNESS_RESISTANCE, + new AttributeModifier(uuid, "Helmet blindness resistance", 1.0, AttributeModifier.Operation.ADDITION) + ); } } diff --git a/src/main/java/ru/betterend/item/CrystaliteLeggings.java b/src/main/java/ru/betterend/item/CrystaliteLeggings.java index 4c8d0613..d966f848 100644 --- a/src/main/java/ru/betterend/item/CrystaliteLeggings.java +++ b/src/main/java/ru/betterend/item/CrystaliteLeggings.java @@ -1,18 +1,21 @@ package ru.betterend.item; -import java.util.UUID; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Rarity; import ru.betterend.registry.EndItems; -public class CrystaliteLeggings extends CrystaliteArmor { +import java.util.UUID; +public class CrystaliteLeggings extends CrystaliteArmor { + public CrystaliteLeggings() { super(EquipmentSlot.LEGS, EndItems.makeEndItemSettings().rarity(Rarity.RARE)); UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[EquipmentSlot.LEGS.getIndex()]; - addAttributeModifier(Attributes.MAX_HEALTH, new AttributeModifier(uuid, "Armor health boost", 4.0, AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + Attributes.MAX_HEALTH, + new AttributeModifier(uuid, "Armor health boost", 4.0, AttributeModifier.Operation.ADDITION) + ); } } diff --git a/src/main/java/ru/betterend/item/EnchantedItem.java b/src/main/java/ru/betterend/item/EnchantedItem.java index d210c855..fd033403 100644 --- a/src/main/java/ru/betterend/item/EnchantedItem.java +++ b/src/main/java/ru/betterend/item/EnchantedItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -11,20 +13,21 @@ import ru.bclib.items.ModelProviderItem; import ru.betterend.registry.EndItems; public class EnchantedItem extends ModelProviderItem { - + private final Item source; - + public EnchantedItem(Item source) { super(EndItems.makeEndItemSettings().rarity(Rarity.RARE).stacksTo(16)); this.source = source; } - + @Override public boolean isFoil(ItemStack stack) { return true; } - + @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { ResourceLocation sourceId = Registry.ITEM.getKey(source); return ModelsHelper.createItemModel(sourceId); diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java deleted file mode 100644 index 9b8b4d04..00000000 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.betterend.item; - -import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import ru.bclib.client.models.ItemModelProvider; -import ru.bclib.items.BaseAnvilItem; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.registry.EndBlocks; - -public class EndAnvilItem extends BaseAnvilItem { - - public final static String DURABILITY = "durability"; - - public EndAnvilItem(Block anvilBlock) { - super(anvilBlock, EndBlocks.makeBlockItemSettings()); - } - - @Override - protected BlockState getPlacementState(BlockPlaceContext blockPlaceContext) { - BlockState blockState = super.getPlacementState(blockPlaceContext); - ItemStack stack = blockPlaceContext.getItemInHand(); - int durability = stack.getOrCreateTag().getInt(DURABILITY); - blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); - return blockState; - } - - @Override - public BlockModel getItemModel(ResourceLocation resourceLocation) { - Block block = getBlock(); - ResourceLocation blockId = Registry.BLOCK.getKey(block); - return ((ItemModelProvider) block).getItemModel(blockId); - } -} diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 1f4bf969..ab8aa11b 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,45 +1,57 @@ package ru.betterend.item; -import java.util.UUID; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; -import ru.bclib.client.models.ItemModelProvider; +import ru.bclib.interfaces.ItemModelProvider; + +import java.util.UUID; public class EndArmorItem extends ArmorItem implements ItemModelProvider { - + protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[] { - UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), - UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), - UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), - UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150") + UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), + UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), + UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), + UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150") }; - + protected final Multimap defaultModifiers; - + public EndArmorItem(ArmorMaterial material, EquipmentSlot equipmentSlot, Properties settings) { super(material, equipmentSlot, settings); this.defaultModifiers = HashMultimap.create(); UUID uuid = ARMOR_MODIFIER_UUID_PER_SLOT[equipmentSlot.getIndex()]; - addAttributeModifier(Attributes.ARMOR, new AttributeModifier(uuid, "Armor modifier", getDefense(), AttributeModifier.Operation.ADDITION)); - addAttributeModifier(Attributes.ARMOR_TOUGHNESS, new AttributeModifier(uuid, "Armor toughness", getToughness(), AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + Attributes.ARMOR, + new AttributeModifier(uuid, "Armor modifier", getDefense(), AttributeModifier.Operation.ADDITION) + ); + addAttributeModifier( + Attributes.ARMOR_TOUGHNESS, + new AttributeModifier(uuid, "Armor toughness", getToughness(), AttributeModifier.Operation.ADDITION) + ); if (knockbackResistance > 0.0F) { - addAttributeModifier(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(uuid, "Armor knockback resistance", knockbackResistance, AttributeModifier.Operation.ADDITION)); + addAttributeModifier( + Attributes.KNOCKBACK_RESISTANCE, + new AttributeModifier(uuid, + "Armor knockback resistance", + knockbackResistance, + AttributeModifier.Operation.ADDITION + ) + ); } } - + @Override public Multimap getDefaultAttributeModifiers(EquipmentSlot equipmentSlot) { return equipmentSlot == slot ? defaultModifiers : super.getDefaultAttributeModifiers(equipmentSlot); } - + protected void addAttributeModifier(Attribute attribute, AttributeModifier modifier) { if (defaultModifiers.containsKey(attribute)) { defaultModifiers.removeAll(attribute); diff --git a/src/main/java/ru/betterend/item/EndAttribute.java b/src/main/java/ru/betterend/item/EndAttribute.java index 7ddc0bb8..03159fea 100644 --- a/src/main/java/ru/betterend/item/EndAttribute.java +++ b/src/main/java/ru/betterend/item/EndAttribute.java @@ -3,7 +3,7 @@ package ru.betterend.item; import net.minecraft.world.entity.ai.attributes.Attribute; public class EndAttribute extends Attribute { - + public EndAttribute(String description, double value) { super(description, value); } diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java index 7d7a729a..e328ed81 100644 --- a/src/main/java/ru/betterend/item/EndBucketItem.java +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -1,13 +1,14 @@ package ru.betterend.item; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.FishBucketItem; +import net.minecraft.world.item.MobBucketItem; import net.minecraft.world.level.material.Fluids; -import ru.bclib.client.models.ItemModelProvider; +import ru.bclib.interfaces.ItemModelProvider; import ru.betterend.registry.EndItems; -public class EndBucketItem extends FishBucketItem implements ItemModelProvider { +public class EndBucketItem extends MobBucketItem implements ItemModelProvider { public EndBucketItem(EntityType type) { - super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1)); + super(type, Fluids.WATER, SoundEvents.BUCKET_EMPTY, EndItems.makeEndItemSettings().stacksTo(1)); } } diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index 3e7348c4..91971e54 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -1,7 +1,5 @@ package ru.betterend.item; -import java.util.List; - import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -17,29 +15,33 @@ import ru.bclib.items.ModelProviderItem; import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; import ru.betterend.util.LangUtil; -import vazkii.patchouli.api.PatchouliAPI; + +import java.util.List; public class GuideBookItem extends ModelProviderItem { public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); - public static final Item GUIDE_BOOK = EndItems.registerEndItem(BOOK_ID, new GuideBookItem()); + public static final Item GUIDE_BOOK = EndItems.getItemRegistry().register(BOOK_ID, new GuideBookItem()); - public static void register() {} + public static void register() { + } public GuideBookItem() { super(EndItems.makeEndItemSettings().stacksTo(1)); } - @Override - public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { - if (!world.isClientSide && user instanceof ServerPlayer) { - PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); - return InteractionResultHolder.success(user.getItemInHand(hand)); - } - return InteractionResultHolder.consume(user.getItemInHand(hand)); - } - - @Override - public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { - tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); - } + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { + //TODO: reanable Patchouli once it is available for 1.18 + //PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); + return InteractionResultHolder.success(user.getItemInHand(hand)); + } + return InteractionResultHolder.consume(user.getItemInHand(hand)); + } + + @Override + public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { + tooltip.add(LangUtil.getText("book.betterend", "subtitle") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } } diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index 13358a76..fd740dd7 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -1,9 +1,5 @@ package ru.betterend.item.material; -import java.util.function.Supplier; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.LazyLoadedValue; @@ -13,21 +9,20 @@ import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.function.Supplier; + public enum EndArmorMaterial implements ArmorMaterial { - THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { + THALLASIUM("thallasium", 17, new int[] {1, 4, 5, 2}, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); - }), - TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + }), TERMINITE("terminite", 26, new int[] {3, 6, 7, 3}, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); - }), - AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { + }), AETERNIUM("aeternium", 40, new int[] {4, 7, 9, 4}, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { return Ingredient.of(EndItems.AETERNIUM_INGOT); - }), - CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { + }), CRYSTALITE("crystalite", 30, new int[] {3, 6, 8, 3}, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); }); - - private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; + + private static final int[] BASE_DURABILITY = new int[] {13, 15, 16, 11}; private final String name; private final int durabilityMultiplier; private final int[] protectionAmounts; @@ -35,12 +30,11 @@ public enum EndArmorMaterial implements ArmorMaterial { private final SoundEvent equipSound; private final float toughness; private final float knockbackResistance; + @SuppressWarnings("deprecation") private final LazyLoadedValue repairIngredient; - private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, - SoundEvent equipSound, float toughness, float knockbackResistance, - Supplier repairIngredient) { - + @SuppressWarnings("deprecation") + private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, SoundEvent equipSound, float toughness, float knockbackResistance, Supplier repairIngredient) { this.name = name; this.durabilityMultiplier = durabilityMultiplier; this.protectionAmounts = protectionAmounts; @@ -50,46 +44,45 @@ public enum EndArmorMaterial implements ArmorMaterial { this.knockbackResistance = knockbackResistance; this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } - + @Override public int getDurabilityForSlot(EquipmentSlot slot) { return BASE_DURABILITY[slot.getIndex()] * this.durabilityMultiplier; } - + @Override public int getDefenseForSlot(EquipmentSlot slot) { return this.protectionAmounts[slot.getIndex()]; } - + @Override public int getEnchantmentValue() { return this.enchantability; } - + @Override public SoundEvent getEquipSound() { return this.equipSound; } - + @Override public Ingredient getRepairIngredient() { return this.repairIngredient.get(); } - + @Override - @Environment(EnvType.CLIENT) public String getName() { return this.name; } - + @Override public float getToughness() { return this.toughness; } - + @Override public float getKnockbackResistance() { return this.knockbackResistance; } - + } diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 9c0197ae..ac7f7049 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,34 +1,32 @@ package ru.betterend.item.material; -import java.util.function.Supplier; - import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.function.Supplier; + public enum EndToolMaterial implements Tier { THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); - }), - TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { + }), TERMINITE(3, 1230, 8.5F, 3.0F, 14, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); - }), - AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { + }), AETERNIUM(5, 2196, 10.0F, 4.5F, 18, () -> { return Ingredient.of(EndItems.AETERNIUM_INGOT); }); - + private final int durability; private final float miningSpeed; private final float attackDamage; private final int miningLevel; private final int enchantability; + @SuppressWarnings("deprecation") private final LazyLoadedValue repairIngredient; - private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, - Supplier repairIngredient) { - + @SuppressWarnings("deprecation") + private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, Supplier repairIngredient) { this.durability = durability; this.miningSpeed = miningSpeed; this.attackDamage = attackDamage; @@ -36,35 +34,35 @@ public enum EndToolMaterial implements Tier { this.enchantability = enchantability; this.repairIngredient = new LazyLoadedValue<>(repairIngredient); } - + @Override public int getUses() { return this.durability; } - + @Override public float getSpeed() { return this.miningSpeed; } - + @Override public float getAttackDamageBonus() { return this.attackDamage; } - + @Override public int getLevel() { return this.miningLevel; } - + @Override public int getEnchantmentValue() { return this.enchantability; } - + @Override public Ingredient getRepairIngredient() { return this.repairIngredient.get(); } - + } diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index d5b5c1a0..2937ad9f 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -1,9 +1,14 @@ package ru.betterend.item.model; import com.google.common.collect.ImmutableList; - import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; @@ -11,23 +16,38 @@ import net.minecraft.world.phys.Vec3; public class ArmoredElytraModel extends AgeableListModel { private final ModelPart rightWing; private final ModelPart leftWing; - - public ArmoredElytraModel() { - this.leftWing = new ModelPart(this, 22, 0); - this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); - this.rightWing = new ModelPart(this, 22, 0); - this.rightWing.mirror = true; - this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild( + PartNames.LEFT_WING, + CubeListBuilder.create().texOffs(22, 0).addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + PartNames.RIGHT_WING, + CubeListBuilder.create().mirror().texOffs(22, 0).addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), + PartPose.ZERO + ); + + return LayerDefinition.create(modelData, 64, 32); } - + + public ArmoredElytraModel(ModelPart modelPart) { + leftWing = modelPart.getChild(PartNames.LEFT_WING); + rightWing = modelPart.getChild(PartNames.RIGHT_WING); + } + protected Iterable headParts() { return ImmutableList.of(); } - + protected Iterable bodyParts() { return ImmutableList.of(leftWing, rightWing); } - + public void setupAnim(T livingEntity, float f, float g, float h, float i, float j) { float rotX = 0.2617994F; float rotZ = -0.2617994F; @@ -42,13 +62,14 @@ public class ArmoredElytraModel extends AgeableListModel } rotX = coef * 0.34906584F + (1.0F - coef) * rotX; rotZ = coef * -1.5707964F + (1.0F - coef) * rotZ; - } else if (livingEntity.isCrouching()) { + } + else if (livingEntity.isCrouching()) { rotX = 0.6981317F; rotZ = -0.7853982F; rotY = 0.08726646F; wingY = 3.0F; } - + leftWing.x = 5.0F; leftWing.y = wingY; if (livingEntity instanceof AbstractClientPlayer) { @@ -59,12 +80,13 @@ public class ArmoredElytraModel extends AgeableListModel leftWing.xRot = abstractClientPlayer.elytraRotX; leftWing.yRot = abstractClientPlayer.elytraRotY; leftWing.zRot = abstractClientPlayer.elytraRotZ; - } else { + } + else { leftWing.xRot = rotX; leftWing.zRot = rotZ; leftWing.yRot = rotY; } - + rightWing.x = -leftWing.x; rightWing.yRot = -leftWing.yRot; rightWing.y = leftWing.y; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index b631ad7e..e38e846d 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -1,14 +1,8 @@ package ru.betterend.item.model; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; @@ -16,38 +10,42 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndItems; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) -public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { - private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); - private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); - private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); - private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); - private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); - private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); - private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); +public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider { + //TODO: find new registry + private final static ResourceLocation FIRST_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_1.png"); + private final static ResourceLocation SECOND_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_2.png"); + private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); + private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); + private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); - @Override - public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, - boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + //@Override + public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { if (!isStackValid(stack)) return defaultTexture; if (secondLayer) return SECOND_LAYER; return FIRST_LAYER; } - - @Override - public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, - EquipmentSlot slot, HumanoidModel defaultModel) { + + //@Override + public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { if (!isStackValid(stack)) return defaultModel; - switch(slot) { + switch (slot) { case HEAD: { return HELMET_MODEL; } case CHEST: { - if (entity instanceof AbstractClientPlayer && - ((AbstractClientPlayer) entity).getModelName().equals("slim")) { + if (entity instanceof AbstractClientPlayer && ((AbstractClientPlayer) entity).getModelName() + .equals("slim")) { CHEST_MODEL_SLIM.copyPropertiesTo(defaultModel); return CHEST_MODEL_SLIM; } @@ -69,11 +67,12 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { public Iterable getRenderedItems() { return Lists.newArrayList( - EndItems.CRYSTALITE_HELMET, - EndItems.CRYSTALITE_CHESTPLATE, - EndItems.CRYSTALITE_ELYTRA, - EndItems.CRYSTALITE_LEGGINGS, - EndItems.CRYSTALITE_BOOTS); + EndItems.CRYSTALITE_HELMET, + EndItems.CRYSTALITE_CHESTPLATE, + EndItems.CRYSTALITE_ELYTRA, + EndItems.CRYSTALITE_LEGGINGS, + EndItems.CRYSTALITE_BOOTS + ); } private boolean isStackValid(ItemStack stack) { diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index d1a37fde..4bb0b3c5 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -1,27 +1,68 @@ package ru.betterend.item.model; +import com.google.common.collect.Lists; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; + import java.util.Collections; -import com.google.common.collect.Lists; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.LivingEntity; - public class CrystaliteBootsModel extends HumanoidModel { - + public ModelPart leftBoot; public ModelPart rightBoot; - public CrystaliteBootsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPos(1.9F, 12.0F, 0.0F); - this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale + 0.25f); + modelPartData.addOrReplaceChild( + "leftBoot", + CubeListBuilder.create().texOffs(0, 32).addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(1.9f, 12.0f, 0.0f) + ); + + modelPartData.addOrReplaceChild( + "rightBoot", + CubeListBuilder.create().texOffs(0, 16).addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-1.9f, 12.0f, 0.0f) + ); + + return LayerDefinition.create(modelData, 64, 48); + } + + public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteBootsModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer( + EndEntitiesRenders.CRYSTALITE_BOOTS)); + } + + public CrystaliteBootsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + leftBoot = modelPart.getChild("leftBoot"); + rightBoot = modelPart.getChild("rightBoot"); } @Override @@ -30,7 +71,7 @@ public class CrystaliteBootsModel extends HumanoidModel { this.leftBoot.copyFrom(leftLeg); this.rightBoot.copyFrom(rightLeg); } - + @Override protected Iterable headParts() { return Collections::emptyIterator; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 1942f9d6..8752cf20 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -1,45 +1,115 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; + +import java.util.Collections; public class CrystaliteChestplateModel extends HumanoidModel { - + public ModelPart leftShoulder; public ModelPart rightShoulder; private final boolean thinArms; - public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.thinArms = thinArms; - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.body.setPos(0.0F, 0.0F, 0.0F); + public static LayerDefinition getRegularTexturedModelData() { + return getTexturedModelData(1.0f, false); + } + + public static LayerDefinition getThinTexturedModelData() { + return getTexturedModelData(1.0f, true); + } + + private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale + 0.25F); + PartDefinition body = modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(16, 16).addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), + PartPose.ZERO + ); + if (thinArms) { - this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); - } else { - this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild( + "leftShoulder", + CubeListBuilder.create() + .mirror() + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(5.0f, 2.0f, 0.0f) + ); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild( + "rightShoulder", + CubeListBuilder.create().texOffs(40, 16).addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-5.0f, 2.0f, 10.0f) + ); } + else { + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild( + "leftShoulder", + CubeListBuilder.create() + .mirror() + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(5.0f, 2.0f, 0.0f) + ); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild( + "rightShoulder", + CubeListBuilder.create().texOffs(40, 16).addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-5.0f, 2.0f, 10.0f) + ); + } + return LayerDefinition.create(modelData, 64, 48); + } + + final ModelPart localBody; + + public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet) { + return new CrystaliteChestplateModel(entityModelSet == null ? getRegularTexturedModelData().bakeRoot() : entityModelSet + .bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); + } + + public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet) { + return new CrystaliteChestplateModel(entityModelSet == null ? getThinTexturedModelData().bakeRoot() : entityModelSet + .bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); + } + + protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) { + super(modelPart, RenderType::entityTranslucent); + this.thinArms = thinArms; + localBody = modelPart.getChild(PartNames.BODY); + leftShoulder = modelPart.getChild("leftShoulder"); + rightShoulder = modelPart.getChild("rightShoulder"); } @Override @@ -56,18 +126,19 @@ public class CrystaliteChestplateModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, leftShoulder, rightShoulder); + return Lists.newArrayList(localBody, leftShoulder, rightShoulder); } @Override public void translateToHand(HumanoidArm arm, PoseStack matrices) { ModelPart modelPart = this.getArm(arm); if (this.thinArms) { - float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); + float f = 0.5F * (float) (arm == HumanoidArm.RIGHT ? 1 : -1); modelPart.x += f; modelPart.translateAndRotate(matrices); modelPart.x -= f; - } else { + } + else { modelPart.translateAndRotate(matrices); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 3513c2f4..e70f6f4d 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -1,24 +1,64 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; + +import java.util.Collections; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { - - public CrystaliteHelmetModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.hat = new ModelPart(this, 0, 0); - this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); - this.hat.setPos(0.0F, 0.0F, 0.0F); + final ModelPart myHat; + + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + //modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f); + PartDefinition hat = modelPartData.addOrReplaceChild( + PartNames.HAT, + CubeListBuilder.create().texOffs(0, 0).addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat), + PartPose.ZERO + ); + + return LayerDefinition.create(modelData, 64, 48); + } + + public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteHelmetModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer( + EndEntitiesRenders.CRYSTALITE_HELMET)); + } + + + public CrystaliteHelmetModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myHat = modelPart.getChild(PartNames.HAT); } @Override @@ -28,6 +68,6 @@ public class CrystaliteHelmetModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(hat); + return Lists.newArrayList(myHat); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index 54772ebd..233efabe 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -1,29 +1,78 @@ package ru.betterend.item.model; +import com.google.common.collect.Lists; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; + import java.util.Collections; -import com.google.common.collect.Lists; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.LivingEntity; - public class CrystaliteLeggingsModel extends HumanoidModel { - - public CrystaliteLeggingsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.body.setPos(0.0F, 0.0F, 0.0F); - this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPos(1.9F, 12.0F, 0.0F); - this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); + public static LayerDefinition getTexturedModelData() { + float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale); + modelPartData.addOrReplaceChild( + PartNames.BODY, + CubeListBuilder.create().texOffs(16, 16).addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), + PartPose.ZERO + ); + + modelPartData.addOrReplaceChild( + PartNames.LEFT_LEG, + CubeListBuilder.create().texOffs(0, 32).addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(1.9f, 12.0f, 0.0f) + ); + + modelPartData.addOrReplaceChild( + PartNames.RIGHT_LEG, + CubeListBuilder.create().texOffs(0, 16).addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-1.9f, 12.0f, 0.0f) + ); + + return LayerDefinition.create(modelData, 64, 48); } - + + final ModelPart myBody; + final ModelPart myLeftLeg; + final ModelPart myRightLeg; + + public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteLeggingsModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer( + EndEntitiesRenders.CRYSTALITE_LEGGINGS)); + } + + public CrystaliteLeggingsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myBody = modelPart.getChild(PartNames.BODY); + myLeftLeg = modelPart.getChild(PartNames.LEFT_LEG); + myRightLeg = modelPart.getChild(PartNames.RIGHT_LEG); + } + @Override protected Iterable headParts() { return Collections::emptyIterator; @@ -31,6 +80,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, rightLeg, leftLeg); + return Lists.newArrayList(myBody, myRightLeg, myLeftLeg); } } diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index fa990cf9..d5536255 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -1,17 +1,16 @@ package ru.betterend.item.tool; -import java.util.UUID; - import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap.Builder; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - import io.netty.util.internal.ThreadLocalRandom; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; import net.minecraft.tags.Tag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; @@ -28,51 +27,71 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; -import ru.bclib.client.models.ItemModelProvider; +import ru.bclib.api.TagAPI; import ru.bclib.client.models.ModelsHelper; -import ru.betterend.registry.EndTags; +import ru.bclib.interfaces.ItemModelProvider; + +import java.util.UUID; public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, ItemModelProvider { public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.createInsecureUUID(ThreadLocalRandom.current()); private final Multimap attributeModifiers; - + public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { - super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); - + //we override all methods that access BlockTags.MINEABLE_WITH_PICKAXE in the superclass, so this should not matter + super(attackDamage, attackSpeed, material, BlockTags.MINEABLE_WITH_PICKAXE, settings); + Builder builder = ImmutableMultimap.builder(); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", attackSpeed, AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_KNOCKBACK, new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, "Weapon modifier", knockback, AttributeModifier.Operation.ADDITION)); + builder.put( + Attributes.ATTACK_DAMAGE, + new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, + "Weapon modifier", + attackDamage + material.getAttackDamageBonus(), + AttributeModifier.Operation.ADDITION + ) + ); + builder.put( + Attributes.ATTACK_SPEED, + new AttributeModifier(BASE_ATTACK_SPEED_UUID, + "Weapon modifier", + attackSpeed, + AttributeModifier.Operation.ADDITION + ) + ); + builder.put( + Attributes.ATTACK_KNOCKBACK, + new AttributeModifier(ATTACK_KNOCKBACK_MODIFIER_ID, + "Weapon modifier", + knockback, + AttributeModifier.Operation.ADDITION + ) + ); this.attributeModifiers = builder.build(); } - + @Override public boolean canAttackBlock(BlockState state, Level world, BlockPos pos, Player miner) { - return state.getMaterial().equals(Material.STONE) || - state.getMaterial().equals(Material.GLASS) || - state.is(Blocks.DIAMOND_BLOCK) || - state.is(Blocks.EMERALD_BLOCK) || - state.is(Blocks.LAPIS_BLOCK) || - state.is(Blocks.REDSTONE_BLOCK); + return state.getMaterial().equals(Material.STONE) || state.getMaterial().equals(Material.GLASS) || state.is( + Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK); } - + @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { stack.hurtAndBreak(1, attacker, ((entity) -> entity.broadcastBreakEvent(EquipmentSlot.MAINHAND))); return true; } - + @Override public boolean mineBlock(ItemStack stack, Level world, BlockState state, BlockPos pos, LivingEntity miner) { if (state.getDestroySpeed(world, pos) != 0.0F) { stack.hurtAndBreak(1, miner, ((entity) -> entity.broadcastBreakEvent(EquipmentSlot.MAINHAND))); } - + return true; } - + @Override public float getDestroySpeed(ItemStack stack, BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { @@ -80,9 +99,11 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I } if (isCorrectToolForDrops(state)) { float mult; - if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK)) { + if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state + .is(Blocks.REDSTONE_BLOCK)) { mult = this.getTier().getSpeed(); - } else { + } + else { mult = this.getTier().getSpeed() / 2.0F; } return Math.max(mult, 1.0F); @@ -92,7 +113,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I @Override public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { + if (tag.equals(TagAPI.ITEM_HAMMERS)) { return this.getDestroySpeed(stack, state); } return 1.0F; @@ -100,39 +121,43 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { + if (tag.equals(TagAPI.ITEM_HAMMERS)) { return this.getTier().getLevel(); } return 0; } - + @Override public boolean isCorrectToolForDrops(BlockState state) { if (state.getMaterial().equals(Material.GLASS)) { return true; } - if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) && !state.is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { + if (!state.is(Blocks.REDSTONE_BLOCK) && !state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.EMERALD_BLOCK) && !state + .is(Blocks.LAPIS_BLOCK) && !state.getMaterial().equals(Material.STONE)) { return false; } int level = this.getTier().getLevel(); if (state.is(Blocks.IRON_ORE) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.LAPIS_ORE)) { return level >= 1; } - if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { + if (state.is(Blocks.DIAMOND_BLOCK) && !state.is(Blocks.DIAMOND_ORE) || state.is(Blocks.EMERALD_ORE) || state.is( + Blocks.EMERALD_BLOCK) || state.is(Blocks.GOLD_ORE) || state.is(Blocks.REDSTONE_ORE)) { return level >= 2; } - if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) || state.is(Blocks.ANCIENT_DEBRIS)) { + if (state.is(Blocks.OBSIDIAN) || state.is(Blocks.CRYING_OBSIDIAN) || state.is(Blocks.RESPAWN_ANCHOR) || state.is( + Blocks.ANCIENT_DEBRIS)) { return level >= 3; } return true; } - + @Override public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getDefaultAttributeModifiers(slot); } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return ModelsHelper.createHandheldItem(resourceLocation); } diff --git a/src/main/java/ru/betterend/item/tool/EndPickaxe.java b/src/main/java/ru/betterend/item/tool/EndPickaxe.java new file mode 100644 index 00000000..cdd1d3fd --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndPickaxe.java @@ -0,0 +1,21 @@ +package ru.betterend.item.tool; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.items.tool.BasePickaxeItem; + +public class EndPickaxe extends BasePickaxeItem { + public EndPickaxe(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + if (state.is(Blocks.END_STONE) && this.getTier().getLevel() > 2) { + return this.speed * 3; + } + return super.getDestroySpeed(stack, state); + } +} diff --git a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java index 296a013e..9c94ed93 100644 --- a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java @@ -1,10 +1,9 @@ package ru.betterend.mixin.client; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.resources.sounds.AbstractSoundInstance; - @Mixin(AbstractSoundInstance.class) public interface AbstractSoundInstanceAccessor { @Accessor("volume") diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java deleted file mode 100644 index 2efb8696..00000000 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ /dev/null @@ -1,96 +0,0 @@ -package ru.betterend.mixin.client; - -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.screens.inventory.AnvilScreen; -import net.minecraft.client.gui.screens.inventory.ItemCombinerScreen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.AnvilMenu; -import net.minecraft.world.item.ItemStack; -import ru.betterend.interfaces.AnvilScreenHandlerExtended; - -@Mixin(AnvilScreen.class) -public class AnvilScreenMixin extends ItemCombinerScreen { - - @Shadow - private EditBox name; - - private final List be_buttons = Lists.newArrayList(); - - public AnvilScreenMixin(AnvilMenu handler, Inventory playerInventory, Component title, - ResourceLocation texture) { - super(handler, playerInventory, title, texture); - } - - @Inject(method = "subInit", at = @At("TAIL")) - protected void be_subInit(CallbackInfo info) { - int x = (width - imageWidth) / 2; - int y = (height - imageHeight) / 2; - be_buttons.clear(); - be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), b -> be_previousRecipe())); - be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), b -> be_nextRecipe())); - } - - @Inject(method = "renderFg", at = @At("TAIL")) - protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { - be_buttons.forEach(button -> { - button.render(matrices, mouseX, mouseY, delta); - }); - } - - @Inject(method = "slotChanged", at = @At("HEAD"), cancellable = true) - public void be_onSlotUpdate(AbstractContainerMenu handler, int slotId, ItemStack stack, CallbackInfo info) { - AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; - if (anvilHandler.be_getCurrentRecipe() != null) { - if (anvilHandler.be_getRecipes().size() > 1) { - be_buttons.forEach(button -> button.visible = true); - } else { - be_buttons.forEach(button -> button.visible = false); - } - name.setValue(""); - info.cancel(); - } else { - be_buttons.forEach(button -> button.visible = false); - } - } - - private void be_nextRecipe() { - ((AnvilScreenHandlerExtended) menu).be_nextRecipe(); - } - - private void be_previousRecipe() { - ((AnvilScreenHandlerExtended) menu).be_previousRecipe(); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (minecraft != null) { - for (AbstractWidget elem : be_buttons) { - if (elem.visible && elem.mouseClicked(mouseX, mouseY, button)) { - if (minecraft.gameMode != null) { - int i = be_buttons.indexOf(elem); - minecraft.gameMode.handleInventoryButtonClick(menu.containerId, i); - return true; - } - } - } - } - return super.mouseClicked(mouseX, mouseY, button); - } -} diff --git a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java index d3e11b1a..05433101 100644 --- a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.ArmorStandArmorModel; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.world.entity.decoration.ArmorStand; 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.CallbackInfo; - -import net.minecraft.client.model.ArmorStandArmorModel; -import net.minecraft.client.renderer.entity.ArmorStandRenderer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.world.entity.decoration.ArmorStand; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(ArmorStandRenderer.class) -public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { - - public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); +public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { + + public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) { + super(context, entityModel, f); } - + @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index e15ed5fe..f88e0c5a 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -1,24 +1,24 @@ package ru.betterend.mixin.client; -import java.awt.Point; - -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; - import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BiomeColors; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; -import ru.bclib.util.BlocksHelper; +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; import ru.bclib.util.ColorUtil; +import ru.bclib.util.MHelper; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; +import java.awt.Point; +import java.util.Arrays; +import java.util.Comparator; + @Mixin(BiomeColors.class) public class BiomeColorsMixin { private static final int POISON_COLOR = ColorUtil.color(92, 160, 78); @@ -36,8 +36,7 @@ public class BiomeColorsMixin { mut.setX(pos.getX() + OFFSETS[i].x); mut.setZ(pos.getZ() + OFFSETS[i].y); if ((view.getBlockState(mut).is(EndBlocks.BRIMSTONE))) { - info.setReturnValue(i < 16 ? STREAM_COLOR : POISON_COLOR); - info.cancel(); + info.setReturnValue(i < 4 ? POISON_COLOR : STREAM_COLOR); return; } } @@ -47,21 +46,15 @@ public class BiomeColorsMixin { static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); + int index = 0; OFFSETS = new Point[20]; - for (int i = 0; i < 3; i++) { - int p = i - 1; - OFFSETS[i] = new Point(p, -2); - OFFSETS[i + 3] = new Point(p, 2); - OFFSETS[i + 6] = new Point(-2, p); - OFFSETS[i + 9] = new Point(2, p); - } - - for (int i = 0; i < 4; i++) { - int inner = i + 16; - Direction dir = BlocksHelper.HORIZONTAL[i]; - OFFSETS[inner] = new Point(dir.getStepX(), dir.getStepZ()); - dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getStepX(), OFFSETS[inner].y + dir.getStepZ()); + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + if ((x != 0 || z != 0) && (Math.abs(x) != 2 || Math.abs(z) != 2)) { + OFFSETS[index++] = new Point(x, z); + } + } } + Arrays.sort(OFFSETS, Comparator.comparingInt(pos -> MHelper.sqr(pos.x) + MHelper.sqr(pos.y))); } } diff --git a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java index 3e0e5dd5..8ddbb4cc 100644 --- a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java @@ -1,22 +1,20 @@ package ru.betterend.mixin.client; -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.CallbackInfo; - import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.layers.CapeLayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; +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.CallbackInfo; import ru.betterend.item.ArmoredElytra; @Mixin(CapeLayer.class) public class CapeLayerMixin { - + @Inject(method = "render", at = @At("HEAD"), cancellable = true) public void be_checkCustomElytra(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, AbstractClientPlayer abstractClientPlayer, float f, float g, float h, float j, float k, float l, CallbackInfo info) { ItemStack itemStack = abstractClientPlayer.getItemBySlot(EquipmentSlot.CHEST); diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java deleted file mode 100644 index 6acaf8e9..00000000 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.protocol.PacketUtils; -import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; -import net.minecraft.world.level.block.entity.BlockEntity; -import ru.bclib.blockentities.BaseSignBlockEntity; -import ru.bclib.client.gui.BlockSignEditScreen; - -@Mixin(ClientPacketListener.class) -public class ClientPlayNetworkHandlerMixin -{ - @Shadow - private Minecraft minecraft; - - @Shadow - private ClientLevel level; - - @Inject(method = "handleOpenSignEditor", at = @At(value = "HEAD"), cancellable = true) - public void be_openSignEditor(ClientboundOpenSignEditorPacket packet, CallbackInfo info) { - PacketUtils.ensureRunningOnSameThread(packet, ClientPacketListener.class.cast(this), minecraft); - BlockEntity blockEntity = level.getBlockEntity(packet.getPos()); - if (blockEntity instanceof BaseSignBlockEntity) { - BaseSignBlockEntity sign = (BaseSignBlockEntity) blockEntity; - minecraft.setScreen(new BlockSignEditScreen(sign)); - info.cancel(); - } - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java deleted file mode 100644 index 4fd3d635..00000000 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.betterend.mixin.client; - -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; - -import net.minecraft.client.ClientRecipeBook; -import net.minecraft.client.RecipeBookCategories; -import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.interfaces.BetterEndRecipe; - -@Mixin(ClientRecipeBook.class) -public abstract class ClientRecipeBookMixin { - @Inject(method = "getCategory", at = @At("HEAD"), cancellable = true) - private static void be_getGroupForRecipe(Recipe recipe, CallbackInfoReturnable info) { - if (recipe instanceof BetterEndRecipe) { - info.setReturnValue(RecipeBookCategories.UNKNOWN); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java deleted file mode 100644 index 484b3a65..00000000 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.google.gson.Gson; - -import net.minecraft.client.renderer.block.model.BlockModelDefinition; - -@Mixin(BlockModelDefinition.Context.class) -public interface ContextGsonAccessor { - @Accessor - Gson getGson(); -} diff --git a/src/main/java/ru/betterend/mixin/client/EndEffectsMixin.java b/src/main/java/ru/betterend/mixin/client/EndEffectsMixin.java new file mode 100644 index 00000000..a215b8ec --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/EndEffectsMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.client; + +import net.minecraft.client.renderer.DimensionSpecialEffects.EndEffects; +import net.minecraft.world.phys.Vec3; +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; +import ru.betterend.integration.Integrations; + +@Mixin(value = EndEffects.class, priority = 10) +public class EndEffectsMixin { + @Inject(method = "getBrightnessDependentFogColor", at = @At("HEAD"), cancellable = true) + private void be_restoreBrightness(Vec3 color, float sunHeight, CallbackInfoReturnable info) { + if (Integrations.ENDERSCAPE.modIsInstalled()) { + info.setReturnValue(color.scale(0.15000000596046448D)); + } + } + + @Inject(method = "isFoggyAt", at = @At("HEAD"), cancellable = true) + private void be_restoreFog(int camX, int camY, CallbackInfoReturnable info) { + if (Integrations.ENDERSCAPE.modIsInstalled()) { + info.setReturnValue(false); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java index cc034cd5..13232b92 100644 --- a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.world.entity.Mob; 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.CallbackInfo; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.HumanoidMobRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.world.entity.Mob; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(HumanoidMobRenderer.class) public abstract class HumanoidMobRendererMixin> extends MobRenderer { - - public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + + public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) { + super(context, entityModel, f); } - - @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + + @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java index d5f52a97..e9136846 100644 --- a/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java @@ -1,22 +1,22 @@ package ru.betterend.mixin.client; -import java.util.List; - -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; - import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +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; import ru.betterend.events.ItemTooltipCallback; +import java.util.List; + @Mixin(ItemStack.class) public class ItemStackMixin { @Inject(method = "getTooltipLines", at = @At("RETURN")) private void be_getTooltip(Player entity, TooltipFlag tooltipContext, CallbackInfoReturnable> info) { - ItemTooltipCallback.EVENT.invoker().getTooltip(entity, ItemStack.class.cast(this), tooltipContext, info.getReturnValue()); + ItemTooltipCallback.EVENT.invoker() + .getTooltip(entity, ItemStack.class.cast(this), tooltipContext, info.getReturnValue()); } } diff --git a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java index 49badc32..231ebcc1 100644 --- a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java @@ -1,15 +1,6 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.mojang.authlib.GameProfile; - import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.AbstractClientPlayer; @@ -18,26 +9,34 @@ import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.interfaces.FallFlyingItem; @Mixin(LocalPlayer.class) public abstract class LocalPlayerMixin extends AbstractClientPlayer { - + public LocalPlayerMixin(ClientLevel clientLevel, GameProfile gameProfile) { super(clientLevel, gameProfile); } - + @Final @Shadow public ClientPacketListener connection; - - @Inject(method = "aiStep", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;", - shift = Shift.AFTER)) + + @Inject(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;", shift = Shift.AFTER)) public void be_aiStep(CallbackInfo info) { ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); if (itemStack.getItem() instanceof FallFlyingItem && ElytraItem.isFlyEnabled(itemStack) && tryToStartFallFlying()) { - connection.send(new ServerboundPlayerCommandPacket(LocalPlayer.class.cast(this), ServerboundPlayerCommandPacket.Action.START_FALL_FLYING)); + connection.send(new ServerboundPlayerCommandPacket( + LocalPlayer.class.cast(this), + ServerboundPlayerCommandPacket.Action.START_FALL_FLYING + )); } } } diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 81e2e2e4..d3bef0e1 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -1,27 +1,20 @@ package ru.betterend.mixin.client; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.WinScreen; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.item.ItemColors; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.WinScreen; -import net.minecraft.client.main.GameConfig; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.Registry; -import net.minecraft.sounds.Music; -import net.minecraft.sounds.Musics; -import net.minecraft.world.level.Level; -import ru.bclib.interfaces.IColorProvider; import ru.bclib.util.MHelper; @Mixin(Minecraft.class) @@ -31,42 +24,29 @@ public class MinecraftClientMixin { @Shadow public Screen screen; - + @Final @Shadow public Gui gui; @Shadow public ClientLevel level; - - @Final - @Shadow - private BlockColors blockColors; - - @Final - @Shadow - private ItemColors itemColors; - - @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(GameConfig args, CallbackInfo info) { - Registry.BLOCK.forEach(block -> { - if (block instanceof IColorProvider) { - IColorProvider provider = (IColorProvider) block; - blockColors.register(provider.getProvider(), block); - itemColors.register(provider.getItemProvider(), block.asItem()); - } - }); - } @Inject(method = "getSituationalMusic", at = @At("HEAD"), cancellable = true) private void be_getEndMusic(CallbackInfoReturnable info) { if (!(this.screen instanceof WinScreen) && this.player != null) { if (this.player.level.dimension() == Level.END) { - if (this.gui.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr(this.player.getX(), this.player.getZ()) < 250000) { + if (this.gui.getBossOverlay().shouldPlayMusic() && MHelper.lengthSqr( + this.player.getX(), + this.player.getZ() + ) < 250000) { info.setReturnValue(Musics.END_BOSS); } else { - Music sound = (Music) this.level.getBiomeManager().getNoiseBiomeAtPosition(this.player.blockPosition()).getBackgroundMusic().orElse(Musics.END); + Music sound = this.level.getBiomeManager() + .getNoiseBiomeAtPosition(this.player.blockPosition()) + .getBackgroundMusic() + .orElse(Musics.END); info.setReturnValue(sound); } info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 4c65b28b..0c89dd50 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -1,23 +1,28 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ModelBakery.class) public abstract class ModelLoaderMixin { - @ModifyVariable(method = "loadModel", ordinal = 2, at = @At(value = "INVOKE")) public ResourceLocation be_switchModel(ResourceLocation id) { - if (GeneratorOptions.changeChorusPlant() && id.getNamespace().equals("minecraft") && - id.getPath().startsWith("blockstates/") && id.getPath().contains("chorus") && - !id.getPath().contains("custom_")) { - id = new ResourceLocation(id.getPath().replace("chorus", "custom_chorus")); + if (GeneratorOptions.changeChorusPlant() && be_changeModel(id)) { + String path = id.getPath().replace("chorus", "custom_chorus"); + id = BetterEnd.makeID(path); } return id; } + + private boolean be_changeModel(ResourceLocation id) { + return id.getNamespace().equals("minecraft") + && id.getPath().startsWith("blockstates/") + && id.getPath().contains("chorus") + && !id.getPath().contains("custom_"); + } } diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 7af64b12..b3a31546 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -1,29 +1,29 @@ package ru.betterend.mixin.client; -import java.util.Random; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractSoundInstance; import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.client.sounds.MusicManager; import net.minecraft.sounds.Music; import net.minecraft.util.Mth; -import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.client.ClientOptions; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; @Mixin(MusicManager.class) public abstract class MusicTrackerMixin { @Final @Shadow private Minecraft minecraft; - + @Final @Shadow private Random random; @@ -42,7 +42,7 @@ public abstract class MusicTrackerMixin { public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { Music musicSound = minecraft.getSituationalMusic(); - if (be_checkNullSound(musicSound) && volume > 0 && be_isInEnd() && be_shouldChangeSound(musicSound)) { + if (be_checkNullSound(musicSound) && volume > 0 && be_shouldChangeSound(musicSound) && be_isCorrectBiome()) { if (volume > 0) { if (srcVolume < 0) { srcVolume = currentMusic.getVolume(); @@ -50,7 +50,8 @@ public abstract class MusicTrackerMixin { if (currentMusic instanceof AbstractSoundInstance) { ((AbstractSoundInstanceAccessor) currentMusic).setVolume(volume); } - minecraft.getSoundManager().updateSourceVolume(currentMusic.getSource(), currentMusic.getVolume() * volume); + minecraft.getSoundManager() + .updateSourceVolume(currentMusic.getSource(), currentMusic.getVolume() * volume); long t = System.currentTimeMillis(); if (volume == 1 && time == 0) { time = t; @@ -81,12 +82,18 @@ public abstract class MusicTrackerMixin { } } - private boolean be_isInEnd() { - return minecraft.level != null && minecraft.level.dimension().equals(Level.END); + private boolean be_isCorrectBiome() { + if (minecraft.level == null) { + return false; + } + return BiomeAPI.getRenderBiome(minecraft.level.getBiome(minecraft.player.blockPosition())) instanceof EndBiome; } private boolean be_shouldChangeSound(Music musicSound) { - return currentMusic != null && !musicSound.getEvent().getLocation().equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); + return currentMusic != null && !musicSound + .getEvent() + .getLocation() + .equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); } private boolean be_checkNullSound(Music musicSound) { diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java index d435dd52..52cb8ff4 100644 --- a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; 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.CallbackInfo; - -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.player.PlayerRenderer; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(PlayerRenderer.class) public abstract class PlayerRendererMixin extends LivingEntityRenderer> { - - public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + + public PlayerRendererMixin(EntityRendererProvider.Context context, PlayerModel entityModel, float f) { + super(context, entityModel, f); } - - @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + + @Inject(method = "*", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, boolean bl, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java deleted file mode 100644 index b24d3517..00000000 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ /dev/null @@ -1,427 +0,0 @@ -package ru.betterend.mixin.client; - -import java.util.Random; - -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexBuffer; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; - -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.DimensionSpecialEffects; -import net.minecraft.client.renderer.FogRenderer; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.resources.ResourceLocation; -import ru.bclib.util.BackgroundInfo; -import ru.bclib.util.MHelper; -import ru.betterend.BetterEnd; -import ru.betterend.client.ClientOptions; - -@Mixin(LevelRenderer.class) -public class WorldRendererMixin { - private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); - private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); - private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); - private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); - private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); - - private static VertexBuffer stars1; - private static VertexBuffer stars2; - private static VertexBuffer stars3; - private static VertexBuffer stars4; - private static VertexBuffer nebulas1; - private static VertexBuffer nebulas2; - private static VertexBuffer horizon; - private static VertexBuffer fog; - private static Vector3f axis1; - private static Vector3f axis2; - private static Vector3f axis3; - private static Vector3f axis4; - private static float time; - private static float time2; - private static float time3; - private static float blind02; - private static float blind06; - private static boolean directOpenGL = false; - - @Shadow - @Final - private Minecraft minecraft; - - @Shadow - @Final - private TextureManager textureManager; - - @Shadow - private ClientLevel level; - - @Shadow - private int ticks; - - @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { - be_initStars(); - Random random = new Random(131); - axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis1.normalize(); - axis2.normalize(); - axis3.normalize(); - axis4.normalize(); - - directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); - } - - @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { - if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { - time = (ticks % 360000) * 0.000017453292F; - time2 = time * 2; - time3 = time * 3; - - FogRenderer.levelFogColor(); - RenderSystem.enableTexture(); - - if (directOpenGL) { - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glAlphaFunc(516, 0.0F); - GL11.glEnable(GL11.GL_BLEND); - RenderSystem.depthMask(false); - } - else { - RenderSystem.enableAlphaTest(); - RenderSystem.alphaFunc(516, 0.0F); - RenderSystem.enableBlend(); - } - - float blindA = 1F - BackgroundInfo.blindness; - blind02 = blindA * 0.2F; - blind06 = blindA * 0.6F; - - if (blindA > 0) { - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, time, 0, false)); - textureManager.bind(HORIZON); - be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, -time, 0, false)); - textureManager.bind(NEBULA_1); - be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, time2, 0, false)); - textureManager.bind(NEBULA_2); - be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); - matrices.popPose(); - - textureManager.bind(STARS); - - matrices.pushPose(); - matrices.mulPose(axis3.rotation(time)); - be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(axis4.rotation(time2)); - be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); - matrices.popPose(); - } - - float a = (BackgroundInfo.fogDensity - 1F); - if (a > 0) { - if (a > 1) a = 1; - textureManager.bind(FOG); - be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); - } - - RenderSystem.disableTexture(); - - if (blindA > 0) { - matrices.pushPose(); - matrices.mulPose(axis1.rotation(time3)); - be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(axis2.rotation(time2)); - be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); - matrices.popPose(); - } - - RenderSystem.enableTexture(); - RenderSystem.depthMask(true); - - info.cancel(); - } - } - - private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { - RenderSystem.color4f(r, g, b, a); - buffer.bind(); - format.setupBufferState(0L); - buffer.draw(matrices.last().pose(), 7); - VertexBuffer.unbind(); - format.clearBufferState(); - } - - private void be_initStars() { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); - stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); - stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); - stars4 = be_buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); - nebulas1 = be_buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); - nebulas2 = be_buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); - horizon = be_buildBufferHorizon(buffer, horizon); - fog = be_buildBufferFog(buffer, fog); - } - - private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - buffer = new VertexBuffer(DefaultVertexFormat.POSITION); - be_makeStars(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { - if (buffer != null) { - buffer.close(); - } - - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - be_makeCylinder(bufferBuilder, 16, 50, 100); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { - if (buffer != null) { - buffer.close(); - } - - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - be_makeCylinder(bufferBuilder, 16, 50, 70); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() * 2.0 - 1.0; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - if (length < 1.0 && length > 0.001) { - length = 1.0 / Math.sqrt(length); - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - buffer.vertex(j + af, k + ad, l + ah).endVertex(); - } - } - } - } - - private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() * 2.0 - 1.0; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - if (length < 1.0 && length > 0.001) { - length = 1.0 / Math.sqrt(length); - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - int pos = 0; - float minV = random.nextInt(4) / 4F; - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - float texU = (pos >> 1) & 1; - float texV = (((pos + 1) >> 1) & 1) / 4F + minV; - pos ++; - buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); - } - } - } - } - - private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() - 0.5; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - double distance = 2.0; - double delta = 1.0 / count; - if (length < 1.0 && length > 0.001) { - length = distance / Math.sqrt(length); - size *= distance; - distance -= delta; - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - int pos = 0; - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - float texU = (pos >> 1) & 1; - float texV = ((pos + 1) >> 1) & 1; - pos ++; - buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); - } - } - } - } - - private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); - for (int i = 0; i < segments; i ++) { - double a1 = (double) i * Math.PI * 2.0 / (double) segments; - double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; - double px1 = Math.sin(a1) * radius; - double pz1 = Math.cos(a1) * radius; - double px2 = Math.sin(a2) * radius; - double pz2 = Math.cos(a2) * radius; - - float u0 = (float) i / (float) segments; - float u1 = (float) (i + 1) / (float) segments; - - buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); - buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); - buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); - buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java deleted file mode 100644 index 41683dec..00000000 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ /dev/null @@ -1,152 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.tags.BlockTags; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AnvilMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.DataSlot; -import net.minecraft.world.inventory.ItemCombinerMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.interfaces.AnvilScreenHandlerExtended; -import ru.betterend.recipe.builders.AnvilRecipe; - -@Mixin(AnvilMenu.class) -public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { - private List be_recipes = Collections.emptyList(); - private AnvilRecipe be_currentRecipe; - private DataSlot anvilLevel; - - public AnvilMenuMixin(int syncId, Inventory playerInventory) { - super(MenuType.ANVIL, syncId, playerInventory, ContainerLevelAccess.NULL); - } - - @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("TAIL")) - public void be_initAnvilLevel(int syncId, Inventory inventory, ContainerLevelAccess context, CallbackInfo info) { - this.anvilLevel = addDataSlot(DataSlot.standalone()); - if (context != ContainerLevelAccess.NULL) { - int level = context.evaluate((world, blockPos) -> { - Block anvilBlock = world.getBlockState(blockPos).getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - return ((EndAnvilBlock) anvilBlock).getCraftingLevel(); - } - return 1; - }, 1); - anvilLevel.set(level); - } else { - anvilLevel.set(1); - } - } - - @Shadow - public abstract void createResult(); - - @Inject(method = "mayPickup", at = @At("HEAD"), cancellable = true) - protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { - if (be_currentRecipe != null) { - info.setReturnValue(be_currentRecipe.checkHammerDurability(inputSlots, player)); - } - } - - @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) - protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { - if (be_currentRecipe != null) { - inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); - stack = be_currentRecipe.craft(inputSlots, player); - slotsChanged(inputSlots); - access.execute((world, blockPos) -> { - BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextDouble() < 0.1) { - BlockState landingState = EndAnvilBlock.applyDamage(anvilState); - if (landingState == null) { - world.removeBlock(blockPos, false); - world.levelEvent(1029, blockPos, 0); - } else { - world.setBlock(blockPos, landingState, 2); - world.levelEvent(1030, blockPos, 0); - } - } else { - world.levelEvent(1030, blockPos, 0); - } - }); - info.setReturnValue(stack); - } - } - - @Inject(method = "createResult", at = @At("HEAD"), cancellable = true) - public void be_updateOutput(CallbackInfo info) { - RecipeManager recipeManager = this.player.level.getRecipeManager(); - be_recipes = recipeManager.getRecipesFor(AnvilRecipe.TYPE, inputSlots, player.level); - if (be_recipes.size() > 0) { - int anvilLevel = this.anvilLevel.get(); - be_recipes = be_recipes.stream().filter(recipe -> - anvilLevel >= recipe.getAnvilLevel()).collect(Collectors.toList()); - if (be_recipes.size() > 0) { - if (be_currentRecipe == null || !be_recipes.contains(be_currentRecipe)) { - be_currentRecipe = be_recipes.get(0); - } - be_updateResult(); - info.cancel(); - } else { - be_currentRecipe = null; - } - } - } - - @Inject(method = "setItemName", at = @At("HEAD"), cancellable = true) - public void be_setNewItemName(String string, CallbackInfo info) { - if (be_currentRecipe != null) { - info.cancel(); - } - } - - @Override - public boolean clickMenuButton(Player player, int id) { - if (id == 0) { - be_previousRecipe(); - return true; - } else if (id == 1) { - be_nextRecipe(); - return true; - } - return super.clickMenuButton(player, id); - } - - private void be_updateResult() { - if (be_currentRecipe == null) return; - resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); - broadcastChanges(); - } - - @Override - public void be_updateCurrentRecipe(AnvilRecipe recipe) { - this.be_currentRecipe = recipe; - be_updateResult(); - } - - @Override - public AnvilRecipe be_getCurrentRecipe() { - return be_currentRecipe; - } - - @Override - public List be_getRecipes() { - return be_recipes; - } -} diff --git a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java deleted file mode 100644 index eb1f962b..00000000 --- a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.world.level.biome.BiomeGenerationSettings; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; - -@Mixin(BiomeGenerationSettings.class) -public interface BiomeGenerationSettingsAccessor { - @Accessor("features") - List>>> be_getFeatures(); - - @Accessor("features") - void be_setFeatures(List>>> features); - - @Accessor("structureStarts") - List>> be_getStructures(); - - @Accessor("structureStarts") - void be_setStructures(List>> structures); -} diff --git a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java index ebc0c0bd..760d6ef1 100644 --- a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java @@ -1,14 +1,6 @@ package ru.betterend.mixin.common; -import java.util.List; - -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; - import com.google.common.collect.Lists; - import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -19,9 +11,15 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +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; import ru.bclib.util.MHelper; import ru.betterend.item.tool.EndHammerItem; +import java.util.List; + @Mixin(BlockBehaviour.class) public abstract class BlockBehaviourMixin { @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index dcd4bc58..7acd396b 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -1,22 +1,9 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -26,12 +13,20 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; -import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(value = ChorusFlowerBlock.class, priority = 100) public abstract class ChorusFlowerBlockMixin extends Block { private static final VoxelShape SHAPE_FULL = Block.box(0, 0, 0, 16, 16, 16); @@ -40,7 +35,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { public ChorusFlowerBlockMixin(Properties settings) { super(settings); } - + @Final @Shadow private ChorusPlantBlock plant; @@ -55,42 +50,24 @@ public abstract class ChorusFlowerBlockMixin extends Block { @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void be_randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { - if (world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { + if (world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { BlockPos up = pos.above(); if (world.isEmptyBlock(up) && up.getY() < 256) { int i = state.getValue(ChorusFlowerBlock.AGE); if (i < 5) { this.placeGrownFlower(world, up, i + 1); - if (GeneratorOptions.changeChorusPlant()) { - BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true).setValue(VanillaBlockProperties.ROOTS, true)); - } - else { - BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); - } + BlocksHelper.setWithoutUpdate(world, pos, plant.defaultBlockState().setValue(ChorusPlantBlock.UP, true).setValue(ChorusPlantBlock.DOWN, true)); info.cancel(); } } } } - @Inject(method = "generatePlant", at = @At("RETURN"), cancellable = true) - private static void be_generatePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { - BlockState state = world.getBlockState(pos); - if (GeneratorOptions.changeChorusPlant() && state.is(Blocks.CHORUS_PLANT)) { - BlocksHelper.setWithoutUpdate(world, pos, state.setValue(VanillaBlockProperties.ROOTS, true)); - } - } - - @Shadow - private static boolean allNeighborsEmpty(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } - @Shadow private void placeGrownFlower(Level world, BlockPos pos, int age) {} - @Shadow - private void placeDeadFlower(Level world, BlockPos pos) {} - @Override + @SuppressWarnings("deprecation") public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (GeneratorOptions.changeChorusPlant()) { return state.getValue(ChorusFlowerBlock.AGE) == 5 ? SHAPE_HALF : SHAPE_FULL; @@ -99,11 +76,11 @@ public abstract class ChorusFlowerBlockMixin extends Block { return super.getShape(state, world, pos, context); } } - + @Inject(method = "placeDeadFlower", at = @At("HEAD"), cancellable = true) private void be_placeDeadFlower(Level world, BlockPos pos, CallbackInfo info) { BlockState down = world.getBlockState(pos.below()); - if (down.is(Blocks.CHORUS_PLANT) || down.is(TagAPI.GEN_TERRAIN)) { + if (down.is(Blocks.CHORUS_PLANT) || down.is(TagAPI.BLOCK_GEN_TERRAIN)) { world.setBlock(pos, this.defaultBlockState().setValue(BlockStateProperties.AGE_5, 5), 2); world.levelEvent(1034, pos, 0); } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 43427483..74cfac6d 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -1,11 +1,5 @@ package ru.betterend.mixin.common; -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.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; @@ -16,74 +10,36 @@ import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChorusPlantBlock; -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 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; import ru.bclib.api.TagAPI; -import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; -import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = ChorusPlantBlock.class, priority = 100) public abstract class ChorusPlantBlockMixin extends Block { public ChorusPlantBlockMixin(Properties settings) { super(settings); } - - @Inject(method = "*", at = @At("TAIL")) - private void beOnInit(BlockBehaviour.Properties settings, CallbackInfo info) { - if (GeneratorOptions.changeChorusPlant()) { - this.registerDefaultState(this.defaultBlockState().setValue(VanillaBlockProperties.ROOTS, false)); - } - } - @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) - private void be_createBlockStateDefinition(StateDefinition.Builder builder, CallbackInfo info) { - GeneratorOptions.init(); - if (GeneratorOptions.changeChorusPlant()) { - builder.add(VanillaBlockProperties.ROOTS); - } - } - - @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + @Inject(method = "getStateForPlacement(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;", at = @At("RETURN"), cancellable = true) private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { BlockPos pos = ctx.getClickedPos(); Level world = ctx.getLevel(); BlockState plant = info.getReturnValue(); - if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { - if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.setValue(VanillaBlockProperties.ROOTS, true).setValue(BlockStateProperties.DOWN, true)); - } - else { - info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); - } - info.cancel(); + if (ctx.canPlace() && plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); } } - @Inject(method = "Lnet/minecraft/world/level/block/ChorusPlantBlock;getStateForPlacement" + - "(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)" + - "Lnet/minecraft/world/level/block/state/BlockState;", - at = @At("RETURN"), cancellable = true) + @Inject(method = "Lnet/minecraft/world/level/block/ChorusPlantBlock;getStateForPlacement" + "(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)" + "Lnet/minecraft/world/level/block/state/BlockState;", at = @At("RETURN"), cancellable = true) private void be_getStateForPlacement(BlockGetter blockGetter, BlockPos blockPos, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); - if (plant.is(Blocks.CHORUS_PLANT)) { - if (blockGetter.getBlockState(blockPos.below()).is(TagAPI.END_GROUND)) { - if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true).setValue(VanillaBlockProperties.ROOTS, true)); - } - else { - info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); - } - info.cancel(); - } - else { - if (GeneratorOptions.changeChorusPlant()) { - info.setReturnValue(plant.setValue(VanillaBlockProperties.ROOTS, false)); - } - info.cancel(); - } + if (plant.is(Blocks.CHORUS_PLANT) && blockGetter.getBlockState(blockPos.below()).is(TagAPI.BLOCK_END_GROUND)) { + info.setReturnValue(plant.setValue(BlockStateProperties.DOWN, true)); } } @@ -92,31 +48,15 @@ public abstract class ChorusPlantBlockMixin extends Block { BlockState down = world.getBlockState(pos.below()); if (down.is(EndBlocks.CHORUS_NYLIUM) || down.is(Blocks.END_STONE)) { info.setReturnValue(true); - info.cancel(); } } @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) private void be_updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); - if (plant.is(Blocks.CHORUS_PLANT)) { - if (world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { - if (GeneratorOptions.changeChorusPlant()) { - plant = plant.setValue(BlockStateProperties.DOWN, true).setValue(VanillaBlockProperties.ROOTS, true); - } - else { - plant = plant.setValue(BlockStateProperties.DOWN, true); - } - info.cancel(); - } - else { - if (GeneratorOptions.changeChorusPlant()) { - plant = plant.setValue(VanillaBlockProperties.ROOTS, false); - } - info.cancel(); - } + if (plant.is(Blocks.CHORUS_PLANT) && world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { + plant = plant.setValue(BlockStateProperties.DOWN, true); info.setReturnValue(plant); - info.cancel(); } } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 044538ce..568d344a 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -1,41 +1,40 @@ package ru.betterend.mixin.common; -import java.util.Random; - -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; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChorusFlowerBlock; import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +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; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; -import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; -import ru.betterend.world.generator.GeneratorOptions; + +import java.util.Random; @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featureConfig, CallbackInfoReturnable info) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel structureWorldAccess = featureConfig.level(); if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); if (bottom.is(Blocks.CHORUS_PLANT)) { - if ((GeneratorOptions.changeChorusPlant())) { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(VanillaBlockProperties.ROOTS, true).setValue(PipeBlock.DOWN, true)); - } - else { - BlocksHelper.setWithoutUpdate(structureWorldAccess, blockPos, bottom.setValue(PipeBlock.DOWN, true)); - } + BlocksHelper.setWithoutUpdate( + structureWorldAccess, + blockPos, + bottom.setValue(PipeBlock.DOWN, true) + ); } info.setReturnValue(true); } diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java deleted file mode 100644 index 4ff99959..00000000 --- a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java +++ /dev/null @@ -1,120 +0,0 @@ -package ru.betterend.mixin.common; - -import java.lang.reflect.Field; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import net.minecraft.core.BlockPos; -import net.minecraft.util.BitStorage; -import net.minecraft.util.Mth; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.chunk.ChunkBiomeContainer; -import ru.betterend.BetterEnd; -import ru.betterend.integration.Integrations; -import ru.betterend.interfaces.IBiomeArray; - -@Mixin(ChunkBiomeContainer.class) -public class ChunkBiomeContainerMixin implements IBiomeArray { - @Final - @Shadow - private Biome[] biomes; - - @Final - @Shadow - private static int WIDTH_BITS; - - @Final - @Shadow - public static int HORIZONTAL_MASK; - - @Final - @Shadow - public static int VERTICAL_MASK; - - @Override - public void be_setBiome(Biome biome, BlockPos pos) { - int biomeX = pos.getX() >> 2; - int biomeY = pos.getY() >> 2; - int biomeZ = pos.getZ() >> 2; - int index = be_getArrayIndex(biomeX, biomeY, biomeZ); - - if (Integrations.hasHydrogen()) { - try { - ChunkBiomeContainer self = (ChunkBiomeContainer) (Object) this; - BitStorage storage = be_getHydrogenStorage(self); - Biome[] palette = be_getHydrogenPalette(self); - int paletteIndex = be_getHydrogenPaletteIndex(biome, palette); - if (paletteIndex == -1) { - Biome[] newPalette = new Biome[palette.length + 1]; - System.arraycopy(palette, 0, newPalette, 0, palette.length); - paletteIndex = palette.length; - palette = newPalette; - palette[paletteIndex] = biome; - be_setHydrogenPalette(self, palette); - } - try { - storage.set(index, paletteIndex); - } - catch (Exception e) { - int size = storage.getSize(); - int bits = Mth.ceillog2(palette.length); - BitStorage newStorage = new BitStorage(bits, size); - for (int i = 0; i < size; i++) { - newStorage.set(i, storage.get(i)); - } - storage = newStorage; - storage.set(index, paletteIndex); - be_setHydrogenStorage(self, storage); - } - } - catch (Exception e) { - BetterEnd.LOGGER.warning(e.getLocalizedMessage()); - } - return; - } - - biomes[index] = biome; - } - - private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { - int i = biomeX & HORIZONTAL_MASK; - int j = Mth.clamp(biomeY, 0, VERTICAL_MASK); - int k = biomeZ & HORIZONTAL_MASK; - return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; - } - - private Field be_getField(String name) throws Exception { - Field field = ChunkBiomeContainer.class.getDeclaredField(name); - field.setAccessible(true); - return field; - } - - private BitStorage be_getHydrogenStorage(ChunkBiomeContainer container) throws Exception { - return (BitStorage) be_getField("intArray").get(container); - } - - private Biome[] be_getHydrogenPalette(ChunkBiomeContainer container) throws Exception { - return (Biome[]) be_getField("palette").get(container); - } - - private int be_getHydrogenPaletteIndex(Biome biome, Biome[] palette) { - int index = -1; - for (int i = 0; i < palette.length; i++) { - if (palette[i] == biome) { - index = i; - break; - } - } - return index; - } - - private void be_setHydrogenPalette(ChunkBiomeContainer container, Biome[] palette) throws Exception { - be_getField("palette").set(container, palette); - } - - private void be_setHydrogenStorage(ChunkBiomeContainer container, BitStorage storage) throws Exception { - be_getField("intArray").set(container, storage); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java deleted file mode 100644 index 1d754b20..00000000 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.ComposterBlock; - -@Mixin(ComposterBlock.class) -public interface ComposterBlockAccessor { - @Invoker - static void callAdd(float levelIncreaseChance, ItemLike item) { - throw new AssertionError("@Invoker dummy body called"); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java index 11c7f94e..8dfce982 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -1,5 +1,9 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.level.block.CraftingTableBlock; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,17 +11,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.CraftingMenu; -import net.minecraft.world.level.block.CraftingTableBlock; - @Mixin(CraftingMenu.class) public abstract class CraftingMenuMixin { @Final @Shadow private ContainerLevelAccess access; - + @Inject(method = "stillValid", at = @At("HEAD"), cancellable = true) private void be_stillValid(Player player, CallbackInfoReturnable info) { if (access.evaluate((world, pos) -> { diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 5e0ac980..38c6252a 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -1,27 +1,14 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.dimension.DimensionType; 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; - -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; @Mixin(value = DimensionType.class, priority = 100) public class DimensionTypeMixin { - @Inject(method = "defaultEndGenerator", at = @At("HEAD"), cancellable = true) - private static void be_replaceGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed, CallbackInfoReturnable info) { - info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, - () -> chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END))); - } - @Inject(method = "createDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java index 3848fb27..77cb6d3e 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -1,15 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.Random; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.core.Registry; import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -20,42 +10,51 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentInstance; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.api.TagAPI; +import java.util.List; +import java.util.Random; + @Mixin(EnchantmentMenu.class) public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { @Final @Shadow private Container enchantSlots; - + @Final @Shadow private ContainerLevelAccess access; - + @Final @Shadow private Random random; - + @Final @Shadow private DataSlot enchantmentSeed; - + @Shadow @Final public int[] costs; - + @Shadow @Final public int[] enchantClue; - + @Shadow @Final public int[] levelClue; - + protected EnchantmentMenuMixin(MenuType type, int syncId) { super(type, syncId); } - + @Inject(method = "slotsChanged", at = @At("HEAD"), cancellable = true) private void be_slotsChanged(Container inventory, CallbackInfo info) { if (inventory == this.enchantSlots) { @@ -63,42 +62,46 @@ public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { if (!itemStack.isEmpty() && itemStack.isEnchantable()) { this.access.execute((world, blockPos) -> { int i = 0; - + int j; for (j = -1; j <= 1; ++j) { for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && world.isEmptyBlock(blockPos.offset(k, 0, j)) && world.isEmptyBlock(blockPos.offset(k, 1, j))) { - if (world.getBlockState(blockPos.offset(k * 2, 0, j * 2)).is(TagAPI.BOOKSHELVES)) { + if ((j != 0 || k != 0) && world.isEmptyBlock(blockPos.offset( + k, + 0, + j + )) && world.isEmptyBlock(blockPos.offset(k, 1, j))) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j * 2)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } - - if (world.getBlockState(blockPos.offset(k * 2, 1, j * 2)).is(TagAPI.BOOKSHELVES)) { + + if (world.getBlockState(blockPos.offset(k * 2, 1, j * 2)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } - + if (k != 0 && j != 0) { - if (world.getBlockState(blockPos.offset(k * 2, 0, j)).is(TagAPI.BOOKSHELVES)) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } - - if (world.getBlockState(blockPos.offset(k * 2, 1, j)).is(TagAPI.BOOKSHELVES)) { + + if (world.getBlockState(blockPos.offset(k * 2, 1, j)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } - - if (world.getBlockState(blockPos.offset(k, 0, j * 2)).is(TagAPI.BOOKSHELVES)) { + + if (world.getBlockState(blockPos.offset(k, 0, j * 2)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } - - if (world.getBlockState(blockPos.offset(k, 1, j * 2)).is(TagAPI.BOOKSHELVES)) { + + if (world.getBlockState(blockPos.offset(k, 1, j * 2)).is(TagAPI.BLOCK_BOOKSHELVES)) { ++i; } } } } } - + random.setSeed(enchantmentSeed.get()); - + for (j = 0; j < 3; ++j) { costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); enchantClue[j] = -1; @@ -107,18 +110,19 @@ public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { costs[j] = 0; } } - + for (j = 0; j < 3; ++j) { if (this.costs[j] > 0) { List list = this.getEnchantmentList(itemStack, j, this.costs[j]); if (list != null && !list.isEmpty()) { - EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); + EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt( + list.size())); enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); levelClue[j] = enchantmentLevelEntry.level; } } } - + broadcastChanges(); }); } @@ -132,7 +136,7 @@ public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { info.cancel(); } } - + @Shadow private List getEnchantmentList(ItemStack stack, int slot, int level) { return null; diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index e91f8949..e7581297 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,43 +1,50 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; +import net.minecraft.world.level.levelgen.feature.EndCityFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.WorldgenRandom; -import net.minecraft.world.level.levelgen.feature.EndCityFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Optional; +import java.util.Random; + @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { - @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) - private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + @Inject(method = "pieceGeneratorSupplier", at = @At("HEAD"), cancellable = true) + private static void be_isFeatureChunk(PieceGeneratorSupplier.Context context, CallbackInfoReturnable>> info) { + final ChunkPos pos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + Random chunkRandom = new WorldgenRandom(new XoroshiroRandomSource(pos.x, pos.z)); + if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); - if (chance == 0) { - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); - info.cancel(); - } - else if (chunkRandom.nextInt(chance) == 0){ - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); - info.cancel(); + if (chance == 0 || chunkRandom.nextInt(chance) == 0) { + if (!(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60)){ + info.cancel(); + info.setReturnValue(Optional.empty()); + } } else { - info.setReturnValue(false); + info.setReturnValue(Optional.empty()); info.cancel(); } } } @Shadow - private static int getYPositionForFeature(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + private static int getYPositionForFeature(ChunkPos pos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { return 0; } } diff --git a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java index a4dc5b6a..a7ff667f 100644 --- a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java @@ -1,17 +1,6 @@ package ru.betterend.mixin.common; -import java.util.List; - -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -21,9 +10,18 @@ import net.minecraft.world.level.block.state.pattern.BlockPattern; import net.minecraft.world.level.dimension.end.DragonRespawnAnimation; import net.minecraft.world.level.dimension.end.EndDragonFight; import net.minecraft.world.phys.AABB; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.util.BlocksHelper; import ru.betterend.world.generator.GeneratorOptions; +import java.util.List; + @Mixin(EndDragonFight.class) public class EndDragonFightMixin { @Shadow @@ -38,18 +36,20 @@ public class EndDragonFightMixin { @Final @Shadow private ServerLevel level; - + @Shadow private BlockPattern.BlockPatternMatch findExitPortal() { return null; } - + @Shadow - private void spawnExitPortal(boolean bl) {} - + private void spawnExitPortal(boolean bl) { + } + @Shadow - private void respawnDragon(List list) {} - + private void respawnDragon(List list) { + } + @Inject(method = "tryRespawn", at = @At("HEAD"), cancellable = true) private void be_tryRespawnDragon(CallbackInfo info) { if (GeneratorOptions.replacePortal() && GeneratorOptions.hasDragonFights() && this.dragonKilled && this.respawnStage == null) { @@ -64,15 +64,15 @@ public class EndDragonFightMixin { else { LOGGER.debug("Found the exit portal & temporarily using it."); } - - blockPos = portalLocation; } - + List crystals = Lists.newArrayList(); - BlockPos center = GeneratorOptions.getPortalPos().above(5); for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos central = center.relative(dir, 4); - List crystalList = level.getEntitiesOfClass(EndCrystal.class, new AABB(central.below(10).south().west(), central.above(10).north().east())); + BlockPos central = BlockPos.ZERO.relative(dir, 4); + List crystalList = level.getEntitiesOfClass( + EndCrystal.class, + new AABB(central.below(255).south().west(), central.above(255).north().east()) + ); int count = crystalList.size(); for (int n = 0; n < count; n++) { @@ -88,10 +88,10 @@ public class EndDragonFightMixin { info.cancel(); return; } - + crystals.addAll(crystalList); } - + LOGGER.debug("Found all crystals, respawning dragon."); respawnDragon(crystals); info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 20c73a27..5dbf4f2b 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -1,7 +1,16 @@ package ru.betterend.mixin.common; -import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,65 +18,73 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Optional; +import java.util.Random; + @Mixin(EndPodiumFeature.class) public class EndPodiumFeatureMixin { + private static BlockPos be_portalPosition; + @Final @Shadow private boolean active; @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); } else if (GeneratorOptions.replacePortal()) { - blockPos = be_updatePos(blockPos, world); + Random random = featurePlaceContext.random(); + WorldGenLevel world = featurePlaceContext.level(); + BlockPos blockPos = be_updatePortalPos(world); StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(active ? "portal/end_portal_active" : "portal/end_portal_inactive")); - BlockPos size = structure.getSize(); - blockPos = blockPos.offset(-(size.getX() >> 1), -1, -(size.getZ() >> 1)); - structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); + Vec3i size = structure.getSize(); + blockPos = blockPos.offset(-(size.getX() >> 1), -3, -(size.getZ() >> 1)); + structure.placeInWorld(world, blockPos, blockPos, new StructurePlaceSettings(), random, 2); info.setReturnValue(true); info.cancel(); } } @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) - private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { - return be_updatePos(blockPos, world); + private FeaturePlaceContext be_setPosOnGround(FeaturePlaceContext featurePlaceContext) { + WorldGenLevel world = featurePlaceContext.level(); + BlockPos pos = be_updatePortalPos(world); + return new FeaturePlaceContext( + Optional.empty(), + world, + featurePlaceContext.chunkGenerator(), + featurePlaceContext.random(), + pos, + featurePlaceContext.config() + ); } - private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { - if (GeneratorOptions.useNewGenerator()) { - BlockPos pos = GeneratorOptions.getPortalPos(); - if (pos.equals(BlockPos.ZERO)) { - int y = world.getChunk(0, 0, ChunkStatus.FULL).getHeight(Types.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()); - if (y < 1) { - y = 65; - } - pos = new BlockPos(pos.getX(), y, pos.getZ()); - GeneratorOptions.setPortalPos(pos); - WorldDataAPI.getRootTag(BetterEnd.MOD_ID).put("portal", NbtUtils.writeBlockPos(pos)); - WorldDataAPI.saveFile(BetterEnd.MOD_ID); + private BlockPos be_updatePortalPos(WorldGenLevel world) { + CompoundTag compound = WorldDataAPI.getRootTag(BetterEnd.MOD_ID).getCompound("portal"); + be_portalPosition = NbtUtils.readBlockPos(compound); + + if (be_portalPosition.getY() == 0) { + /*if (GeneratorOptions.useNewGenerator()) { + int y = TerrainGenerator.getHeight(0, 0, world.getLevel().getChunkSource().getGenerator().getBiomeSource()); + be_portalPosition = new BlockPos(0, y, 0); } - return pos; + else { + be_portalPosition = new BlockPos(0, 65, 0); + }*/ + int y = world.getHeight(Types.WORLD_SURFACE, 0, 0); + be_portalPosition = new BlockPos(0, y, 0); + WorldDataAPI.getRootTag(BetterEnd.MOD_ID).put("portal", NbtUtils.writeBlockPos(be_portalPosition)); + WorldDataAPI.saveFile(BetterEnd.MOD_ID); } - return blockPos; + + return be_portalPosition; } } diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java index 94361158..fa21aa5e 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java @@ -1,14 +1,13 @@ package ru.betterend.mixin.common; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.levelgen.feature.SpikeFeature.EndSpike; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.levelgen.feature.SpikeFeature.EndSpike; import ru.bclib.api.WorldDataAPI; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; @@ -18,7 +17,7 @@ public class EndSpikeMixin { @Final @Shadow private int height; - + @Inject(method = "getHeight", at = @At("HEAD"), cancellable = true) private void be_getSpikeHeight(CallbackInfoReturnable info) { if (!GeneratorOptions.isDirectSpikeHeight()) { diff --git a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java index 4102fef9..0a874e4e 100644 --- a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java @@ -1,23 +1,24 @@ package ru.betterend.mixin.common; -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; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import ru.betterend.effects.EndEnchantments; +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; import ru.betterend.effects.EndStatusEffects; +import ru.betterend.registry.EndEnchantments; @Mixin(EnderMan.class) public abstract class EnderManMixin { @Inject(method = "isLookingAtMe", at = @At("HEAD"), cancellable = true) private void be_isLookingAtMe(Player player, CallbackInfoReturnable info) { - if (player.isCreative() || player.hasEffect(EndStatusEffects.END_VEIL) || - EnchantmentHelper.getItemEnchantmentLevel(EndEnchantments.END_VEIL, player.getItemBySlot(EquipmentSlot.HEAD)) > 0) { + if (player.isCreative() || player.hasEffect(EndStatusEffects.END_VEIL) || EnchantmentHelper.getItemEnchantmentLevel( + EndEnchantments.END_VEIL, + player.getItemBySlot(EquipmentSlot.HEAD) + ) > 0) { info.setReturnValue(false); } } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 4f9372b8..31b3876f 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; @@ -14,16 +7,21 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { @Shadow - public float yRot; + private float yRot; @Shadow - public float xRot; - @Shadow - public boolean removed; + private float xRot; + @Shadow public Level level; @@ -39,12 +37,18 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); - + + @Shadow + protected abstract void removeAfterChangingDimensions(); + + @Shadow + public abstract boolean isRemoved(); + private BlockPos exitPos; - + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (!removed && be_canTeleport() && level instanceof ServerLevel) { + if (!isRemoved() && be_canTeleport() && level instanceof ServerLevel) { unRide(); level.getProfiler().push("changeDimension"); level.getProfiler().push("reposition"); @@ -54,11 +58,18 @@ public abstract class EntityMixin implements TeleportingEntity { Entity entity = getType().create(destination); if (entity != null) { entity.restoreFrom(Entity.class.cast(this)); - entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); + entity.moveTo( + teleportTarget.pos.x, + teleportTarget.pos.y, + teleportTarget.pos.z, + teleportTarget.yRot, + entity.getXRot() + ); entity.setDeltaMovement(teleportTarget.speed); - destination.addFromAnotherDimension(entity); + destination.addDuringTeleport(entity); } - removed = true; + + this.removeAfterChangingDimensions(); level.getProfiler().pop(); ((ServerLevel) level).resetEmptyTime(); destination.resetEmptyTime(); @@ -72,20 +83,25 @@ public abstract class EntityMixin implements TeleportingEntity { @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); + info.setReturnValue(new PortalInfo( + new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), + getDeltaMovement(), + yRot, + xRot + )); } } - + @Override public void be_setExitPos(BlockPos pos) { this.exitPos = pos.immutable(); } - + @Override public void be_resetExitPos() { this.exitPos = null; } - + @Override public boolean be_canTeleport() { return this.exitPos != null; diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index b4e430d6..c929ef04 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -1,17 +1,7 @@ package ru.betterend.mixin.common; -import java.util.Collection; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.EntityTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffect; @@ -31,47 +21,59 @@ import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.betterend.BetterEnd; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndAttributes; -@Mixin(LivingEntity.class) -public abstract class LivingEntityMixin extends Entity { +import java.util.Collection; +@Mixin(value=LivingEntity.class, priority=200) +public abstract class LivingEntityMixin extends Entity { + public LivingEntityMixin(EntityType entityType, Level level) { super(entityType, level); } - + @Shadow protected int fallFlyTicks; - + @Shadow public abstract boolean hasEffect(MobEffect mobEffect); - + @Shadow public abstract ItemStack getItemBySlot(EquipmentSlot equipmentSlot); - + @Shadow public abstract void calculateEntityAnimation(LivingEntity livingEntity, boolean b); - + @Shadow protected abstract SoundEvent getFallDamageSound(int i); - + @Shadow public abstract boolean isFallFlying(); - + @Shadow public abstract AttributeMap getAttributes(); - + private Entity lastAttacker; - + @Inject(method = "createLivingAttributes", at = @At("RETURN"), cancellable = true) private static void be_addLivingAttributes(CallbackInfoReturnable info) { EndAttributes.addLivingEntityAttributes(info.getReturnValue()); } - + @Inject(method = "tickEffects", at = @At("HEAD")) protected void be_applyEffects(CallbackInfo info) { if (!level.isClientSide()) { @@ -86,21 +88,26 @@ public abstract class LivingEntityMixin extends Entity { }); } } - + @Inject(method = "canBeAffected", at = @At("HEAD"), cancellable = true) public void be_canBeAffected(MobEffectInstance mobEffectInstance, CallbackInfoReturnable info) { - if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { - info.setReturnValue(false); + try { + if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { + info.setReturnValue(false); + } + } + catch (Exception ex) { + BetterEnd.LOGGER.warning("Blindness resistance attribute haven't been registered."); } } - + @Inject(method = "hurt", at = @At("HEAD")) public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) - private float be_increaseKnockback(float value, double x, double z) { + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index = 0) + private double be_increaseKnockback(double value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; value += this.be_getKnockback(attacker.getMainHandItem().getItem()); @@ -108,32 +115,105 @@ public abstract class LivingEntityMixin extends Entity { return value; } + // FlyFallingLib (part of Origin) redirected the call to updateFallFlying, + // so we inject our code before the actual call and cancel the execution if the player is still + // flying. That means we have to replicate all vanilla code that happens after the call to + // updateFallFlying. We do this in vanillaAfterUpdateFallFlying + @Inject(method="aiStep", cancellable = true, at=@At(value="INVOKE", target="Lnet/minecraft/world/entity/LivingEntity;updateFallFlying()V")) + private void be_updateFallFlying_originFix(CallbackInfo info) { + //run be_updateFallFlying instead + if (!BetterEnd.RUNS_FALL_FLYING_LIB) return; + + if (be_updateFallFlyingCommon()) { + vanillaAfterUpdateFallFlying(); + info.cancel(); + } + } + @Inject(method = "updateFallFlying", at = @At("HEAD"), cancellable = true) private void be_updateFallFlying(CallbackInfo info) { + //run be_updateFallFlying_originFix instead? + if (BetterEnd.RUNS_FALL_FLYING_LIB) return; + if (be_updateFallFlyingCommon()) { + info.cancel(); + } + } + + private boolean be_updateFallFlyingCommon() { ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); if (!level.isClientSide && itemStack.getItem() instanceof FallFlyingItem) { boolean isFlying = getSharedFlag(7); if (isFlying && !onGround && !isPassenger() && !hasEffect(MobEffects.LEVITATION)) { if (ElytraItem.isFlyEnabled(itemStack)) { if ((fallFlyTicks + 1) % 20 == 0) { - itemStack.hurtAndBreak(1, LivingEntity.class.cast(this), - livingEntity -> livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST)); + itemStack.hurtAndBreak( + 1, + LivingEntity.class.cast(this), + livingEntity -> livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST) + ); } isFlying = true; - } else { + } + else { isFlying = false; } - } else { + } + else { isFlying = false; } setSharedFlag(7, isFlying); - info.cancel(); + return isFlying; + } + return false; + } + + @Shadow protected abstract void removeFrost(); + @Shadow protected abstract void tryAddFrost(); + @Shadow protected abstract void pushEntities(); + @Shadow protected abstract void checkAutoSpinAttack(AABB aABB, AABB aABB2); + @Shadow protected int autoSpinAttackTicks; + + private void vanillaAfterUpdateFallFlying(){ + LivingEntity self = (LivingEntity)(Object)this; + AABB aABB = this.getBoundingBox(); + self.travel(new Vec3(self.xxa, self.yya, self.zza)); + this.level.getProfiler().pop(); + this.level.getProfiler().push("freezing"); + boolean bl2 = this.getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES); + int o; + if (!this.level.isClientSide && !self.isDeadOrDying()) { + o = this.getTicksFrozen(); + if (this.isInPowderSnow && this.canFreeze()) { + this.setTicksFrozen(Math.min(this.getTicksRequiredToFreeze(), o + 1)); + } else { + this.setTicksFrozen(Math.max(0, o - 2)); + } + } + + this.removeFrost(); + this.tryAddFrost(); + if (!this.level.isClientSide && this.tickCount % 40 == 0 && this.isFullyFrozen() && this.canFreeze()) { + o = bl2 ? 5 : 1; + this.hurt(DamageSource.FREEZE, (float)o); + } + + this.level.getProfiler().pop(); + this.level.getProfiler().push("push"); + if (this.autoSpinAttackTicks > 0) { + --this.autoSpinAttackTicks; + this.checkAutoSpinAttack(aABB, this.getBoundingBox()); + } + + this.pushEntities(); + this.level.getProfiler().pop(); + if (!this.level.isClientSide && self.isSensitiveToWater() && this.isInWaterRainOrBubble()) { + this.hurt(DamageSource.DROWN, 1.0F); } } - @Inject(method = "travel", at = @At(value = "INVOKE", - target = "Lnet/minecraft/world/entity/LivingEntity;isFallFlying()Z", - shift = Shift.AFTER), cancellable = true) + + + @Inject(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;isFallFlying()Z", shift = Shift.AFTER), cancellable = true) public void be_travel(Vec3 vec3, CallbackInfo info) { ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); if (isFallFlying() && itemStack.getItem() instanceof FallFlyingItem) { @@ -141,12 +221,12 @@ public abstract class LivingEntityMixin extends Entity { if (moveDelta.y > -0.5D) { fallDistance = 1.0F; } - + Vec3 lookAngle = getLookAngle(); double d = 0.08D; - float rotX = xRot * 0.017453292F; + float rotX = getXRot() * 0.017453292F; double k = Math.sqrt(lookAngle.x * lookAngle.x + lookAngle.z * lookAngle.z); - double l = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double l = moveDelta.horizontalDistance(); double lookLen = lookAngle.length(); float n = Mth.cos(rotX); n = (float) (n * n * Math.min(1.0D, lookLen / 0.4D)); @@ -156,14 +236,18 @@ public abstract class LivingEntityMixin extends Entity { coef = moveDelta.y * -0.1D * (double) n; moveDelta = moveDelta.add(lookAngle.x * coef / k, coef, lookAngle.z * coef / k); } - + if (rotX < 0.0F && k > 0.0D) { coef = l * (double) (-Mth.sin(rotX)) * 0.04D; moveDelta = moveDelta.add(-lookAngle.x * coef / k, coef * 3.2D, -lookAngle.z * coef / k); } - + if (k > 0.0D) { - moveDelta = moveDelta.add((lookAngle.x / k * l - moveDelta.x) * 0.1D, 0.0D, (lookAngle.z / k * l - moveDelta.z) * 0.1D); + moveDelta = moveDelta.add( + (lookAngle.x / k * l - moveDelta.x) * 0.1D, + 0.0D, + (lookAngle.z / k * l - moveDelta.z) * 0.1D + ); } moveDelta = moveDelta.multiply(0.9900000095367432D, 0.9800000190734863D, 0.9900000095367432D); double movementFactor = ((FallFlyingItem) itemStack.getItem()).getMovementFactor(); @@ -172,7 +256,7 @@ public abstract class LivingEntityMixin extends Entity { move(MoverType.SELF, moveDelta); if (!level.isClientSide) { if (horizontalCollision) { - coef = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + coef = moveDelta.horizontalDistance(); double r = l - coef; float dmg = (float) (r * 10.0D - 3.0D); if (dmg > 0.0F) { @@ -184,15 +268,16 @@ public abstract class LivingEntityMixin extends Entity { setSharedFlag(7, false); } } - + calculateEntityAnimation(LivingEntity.class.cast(this), this instanceof FlyingAnimal); info.cancel(); } } - + private double be_getKnockback(Item tool) { if (tool == null) return 0.0D; - Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_KNOCKBACK); + Collection modifiers = tool.getDefaultAttributeModifiers(EquipmentSlot.MAINHAND) + .get(Attributes.ATTACK_KNOCKBACK); if (modifiers.size() > 0) { return modifiers.iterator().next().getAmount(); } diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java deleted file mode 100644 index 1c3d5f0a..00000000 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ /dev/null @@ -1,78 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.ServerResources; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.progress.ChunkProgressListener; -import net.minecraft.server.players.PlayerList; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.storage.ServerLevelData; -import net.minecraft.world.level.storage.WorldData; -import ru.betterend.world.generator.GeneratorOptions; - -@Mixin(MinecraftServer.class) -public class MinecraftServerMixin { - @Shadow - private ServerResources resources; - - @Final - @Shadow - private Map, ServerLevel> levels; - - @Final - @Shadow - protected WorldData worldData; - - @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) - private final void be_overworld(CallbackInfoReturnable info) { - if (GeneratorOptions.swapOverworldToEnd()) { - ServerLevel world = levels.get(Level.END); - if (world == null) { - world = levels.get(Level.OVERWORLD); - } - info.setReturnValue(world); - info.cancel(); - } - } - - @Inject(method = "createLevels", at = @At(value = "TAIL")) - private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { - if (GeneratorOptions.swapOverworldToEnd()) { - ServerLevel world = levels.get(Level.END); - if (world == null) { - world = levels.get(Level.OVERWORLD); - } - this.getPlayerList().setLevel(world); - ServerLevelData serverWorldProperties = worldData.overworldData(); - net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings(); - boolean bl = generatorOptions.isDebug(); - setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); - } - } - - @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { - if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { - info.cancel(); - } - } - - @Shadow - private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} - - @Shadow - public PlayerList getPlayerList() { - return null; - } -} diff --git a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java index b2d77c7c..403f11e0 100644 --- a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java @@ -1,13 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.Random; - -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; - import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobSpawnType; @@ -15,6 +7,13 @@ import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; +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; + +import java.util.List; +import java.util.Random; @Mixin(Monster.class) public class MonsterMixin { @@ -23,7 +22,9 @@ public class MonsterMixin { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == MobSpawnType.NATURAL && type == EntityType.ENDERMAN) { AABB box = new AABB(pos).inflate(16); - List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { return true; }); + List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { + return true; + }); info.setReturnValue(entities.size() < 6); } } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java deleted file mode 100644 index 8d59913e..00000000 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.StructureSettings; -import ru.betterend.world.generator.GeneratorOptions; -import ru.betterend.world.generator.TerrainGenerator; - -@Mixin(NoiseBasedChunkGenerator.class) -public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { - @Final - @Shadow - protected Supplier settings; - - public NoiseBasedChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { - super(populationSource, biomeSource, structuresConfig, worldSeed); - } - - @Inject(method = "(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/world/level/biome/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) - private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { - TerrainGenerator.initNoise(seed); - } - - @Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) - private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { - if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); - info.cancel(); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java new file mode 100644 index 00000000..718caa54 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NoiseChunk.class) +public interface NoiseChunkAccessor { + @Accessor("noiseSettings") + NoiseSettings bnv_getNoiseSettings(); + + @Accessor("cellCountXZ") + int bnv_getCellCountXZ(); + + @Accessor("cellCountY") + int bnv_getCellCountY(); + + @Accessor("firstCellZ") + int bnv_getFirstCellZ(); + + @Accessor("cellNoiseMinY") + int bnv_getCellNoiseMinY(); +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java new file mode 100644 index 00000000..5154eaf1 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java @@ -0,0 +1,28 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.Aquifer; +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseChunk.NoiseFiller; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.NoiseSampler; +import net.minecraft.world.level.levelgen.blending.Blender; +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.CallbackInfo; +import ru.betterend.interfaces.TargetChecker; + +@Mixin(NoiseChunk.class) +public class NoiseChunkMixin implements TargetChecker { + private boolean be_isEndGenerator; + + @Inject(method = "*", at = @At("TAIL")) + private void be_onNoiseChunkInit(int i, int j, int k, NoiseSampler noiseSampler, int l, int m, NoiseFiller noiseFiller, NoiseGeneratorSettings noiseGeneratorSettings, Aquifer.FluidPicker fluidPicker, Blender blender, CallbackInfo info) { + be_isEndGenerator = noiseGeneratorSettings.stable(NoiseGeneratorSettings.END); + } + + @Override + public boolean isTarget() { + return be_isEndGenerator; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java new file mode 100644 index 00000000..14dcdfe5 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java @@ -0,0 +1,45 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseSettings; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.betterend.interfaces.TargetChecker; +import ru.betterend.world.generator.TerrainGenerator; + +@Mixin(NoiseChunk.NoiseInterpolator.class) +public class NoiseInterpolatorMixin { + @Final + @Shadow(aliases = "this$0") + private NoiseChunk this$0; + + @Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true) + private void be_fillSlice(double[][] data, int x, CallbackInfo info) { + if (!TargetChecker.class.cast(this$0).isTarget()) { + return; + } + + info.cancel(); + + NoiseChunkAccessor accessor = NoiseChunkAccessor.class.cast(this$0); + NoiseSettings noiseSettings = accessor.bnv_getNoiseSettings(); + + final int sizeY = noiseSettings.getCellHeight(); + final int sizeXZ = noiseSettings.getCellWidth(); + //final int cellsY = accessor.bnv_getCellCountY() + 1; + final int cellsXZ = accessor.bnv_getCellCountXZ() + 1; + final int firstCellZ = accessor.bnv_getFirstCellZ(); + //final int cellNoiseMinY = accessor.bnv_getCellNoiseMinY(); + + x *= sizeXZ; + + for (int cellXZ = 0; cellXZ < cellsXZ; ++cellXZ) { + int z = (firstCellZ + cellXZ) * sizeXZ; + TerrainGenerator.fillTerrainDensity(data[cellXZ], x, z, sizeXZ, sizeY); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java index 6ddf6f04..06260c1d 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -1,15 +1,14 @@ package ru.betterend.mixin.common; +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.advancements.Advancement; -import net.minecraft.server.PlayerAdvancements; -import net.minecraft.server.level.ServerPlayer; import ru.betterend.events.PlayerAdvancementsCallback; @Mixin(PlayerAdvancements.class) @@ -17,11 +16,12 @@ public abstract class PlayerAdvancementsMixin { @Shadow private ServerPlayer player; - @Inject(method = "award", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", - shift = Shift.AFTER)) + @Inject(method = "award", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", shift = Shift.AFTER)) public void be_award(Advancement advancement, String criterionName, CallbackInfoReturnable info) { - PlayerAdvancementsCallback.PLAYER_ADVANCEMENT_COMPLETE.invoker().onAdvancementComplete(player, advancement, criterionName); + PlayerAdvancementsCallback.PLAYER_ADVANCEMENT_COMPLETE.invoker() + .onAdvancementComplete(player, + advancement, + criterionName + ); } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java deleted file mode 100644 index 408fb3fa..00000000 --- a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java +++ /dev/null @@ -1,258 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.authlib.GameProfile; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.Dynamic; - -import io.netty.buffer.Unpooled; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.network.Connection; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.ChatType; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; -import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; -import net.minecraft.network.protocol.game.ClientboundLoginPacket; -import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; -import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket; -import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; -import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; -import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; -import net.minecraft.network.protocol.game.ClientboundUpdateTagsPacket; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.ServerScoreboard; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.server.players.GameProfileCache; -import net.minecraft.server.players.PlayerList; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.GameRules; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.BiomeManager; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.storage.LevelData; -import ru.betterend.world.generator.GeneratorOptions; - -@Mixin(PlayerList.class) -public class PlayerListMixin { - @Final - @Shadow - private static Logger LOGGER; - - @Final - @Shadow - private MinecraftServer server; - - @Final - @Shadow - private RegistryAccess.RegistryHolder registryHolder; - - @Shadow - private int viewDistance; - - @Final - @Shadow - private List players; - - @Final - @Shadow - private Map playersByUUID; - - @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) - public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { - if (GeneratorOptions.swapOverworldToEnd()) { - GameProfile gameProfile = player.getGameProfile(); - GameProfileCache userCache = this.server.getProfileCache(); - GameProfile gameProfile2 = userCache.get(gameProfile.getId()); - String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); - userCache.add(gameProfile); - CompoundTag compoundTag = this.load(player); - ResourceKey var23; - if (compoundTag != null) { - DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); - Logger var10001 = LOGGER; - var10001.getClass(); - var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); - } - else { - var23 = Level.END; - } - - ResourceKey registryKey = var23; - ServerLevel serverWorld = this.server.getLevel(registryKey); - ServerLevel serverWorld3; - if (serverWorld == null) { - LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); - serverWorld3 = this.server.overworld(); - } - else { - serverWorld3 = serverWorld; - } - - player.setLevel(serverWorld3); - player.gameMode.setLevel((ServerLevel) player.level); - String string2 = "local"; - if (connection.getRemoteAddress() != null) { - string2 = connection.getRemoteAddress().toString(); - } - - LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); - LevelData worldProperties = serverWorld3.getLevelData(); - this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); - ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); - GameRules gameRules = serverWorld3.getGameRules(); - boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); - boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); - serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), - worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, - serverWorld3.isDebug(), serverWorld3.isFlat())); - serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); - serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); - serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); - serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); - serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); - this.sendPlayerPermissionLevel(player); - player.getStats().markAllDirty(); - player.getRecipeBook().sendInitialRecipeBook(player); - this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); - this.server.invalidateStatus(); - TranslatableComponent mutableText2; - if (player.getGameProfile().getName().equalsIgnoreCase(string)) { - mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); - } - else { - mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); - } - - this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); - serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); - this.players.add(player); - this.playersByUUID.put(player.getUUID(), player); - this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); - - for (int i = 0; i < this.players.size(); ++i) { - player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); - } - - serverWorld3.addNewPlayer(player); - this.server.getCustomBossEvents().onPlayerConnect(player); - this.sendLevelInfo(player, serverWorld3); - if (!this.server.getResourcePack().isEmpty()) { - player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); - } - - Iterator var24 = player.getActiveEffects().iterator(); - - while (var24.hasNext()) { - MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); - serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); - } - - if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { - CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); - Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { - return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; - }); - if (entity != null) { - UUID uUID2; - if (compoundTag2.hasUUID("Attach")) { - uUID2 = compoundTag2.getUUID("Attach"); - } - else { - uUID2 = null; - } - - Iterator var21; - Entity entity3; - if (entity.getUUID().equals(uUID2)) { - player.startRiding(entity, true); - } - else { - var21 = entity.getIndirectPassengers().iterator(); - - while (var21.hasNext()) { - entity3 = (Entity) var21.next(); - if (entity3.getUUID().equals(uUID2)) { - player.startRiding(entity3, true); - break; - } - } - } - - if (!player.isPassenger()) { - LOGGER.warn("Couldn't reattach entity to player"); - serverWorld3.despawn(entity); - var21 = entity.getIndirectPassengers().iterator(); - - while (var21.hasNext()) { - entity3 = (Entity) var21.next(); - serverWorld3.despawn(entity3); - } - } - } - } - - player.initMenu(); - info.cancel(); - } - } - - @Shadow - public CompoundTag load(ServerPlayer player) { - return null; - } - - @Shadow - private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} - - @Shadow - public void sendPlayerPermissionLevel(ServerPlayer player) {} - - @Shadow - public int getPlayerCount() { - return 0; - } - - @Shadow - public MinecraftServer getServer() { - return null; - } - - @Shadow - protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} - - @Shadow - public void broadcastMessage(Component message, ChatType type, UUID senderUuid) {} - - @Shadow - public void broadcastAll(Packet packet) {} - - @Shadow - public void sendLevelInfo(ServerPlayer player, ServerLevel world) {} -} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java index e8ee2a4c..f86d1ded 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Optional; - -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; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -20,6 +13,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +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; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.util.BlocksHelper; @@ -27,15 +24,16 @@ import ru.bclib.util.MHelper; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.registry.EndBlocks; -@Mixin(Player.class) -public abstract class PlayerMixin extends LivingEntity { +import java.util.Optional; +@Mixin(value=Player.class, priority=200) +public abstract class PlayerMixin extends LivingEntity { protected PlayerMixin(EntityType entityType, Level level) { super(entityType, level); } - + private static Direction[] horizontal; - + @Inject(method = "findRespawnPositionAndUseSpawnBlock", at = @At(value = "HEAD"), cancellable = true) private static void be_findRespawnPositionAndUseSpawnBlock(ServerLevel world, BlockPos pos, float f, boolean bl, boolean bl2, CallbackInfoReturnable> info) { BlockState blockState = world.getBlockState(pos); @@ -44,18 +42,20 @@ public abstract class PlayerMixin extends LivingEntity { info.cancel(); } } - + @Inject(method = "tryToStartFallFlying", at = @At("HEAD"), cancellable = true) public void be_tryToStartFlying(CallbackInfoReturnable info) { - if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) { + if (!onGround && !isFallFlying() && !isInWater() && !hasEffect(MobEffects.LEVITATION)) { ItemStack itemStack = getItemBySlot(EquipmentSlot.CHEST); if (itemStack.getItem() instanceof FallFlyingItem && ElytraItem.isFlyEnabled(itemStack)) { setSharedFlag(7, true); info.setReturnValue(true); + System.out.println("Started"); + info.cancel(); } } } - + private static Optional be_obeliskRespawnPosition(ServerLevel world, BlockPos pos, BlockState state) { if (state.getValue(BlockProperties.TRIPLE_SHAPE) == TripleShape.TOP) { pos = pos.below(2); @@ -67,7 +67,7 @@ public abstract class PlayerMixin extends LivingEntity { horizontal = BlocksHelper.makeHorizontal(); } MHelper.shuffle(horizontal, world.getRandom()); - for (Direction dir: horizontal) { + for (Direction dir : horizontal) { BlockPos p = pos.relative(dir); BlockState state2 = world.getBlockState(p); if (!state2.getMaterial().blocksMotion() && state2.getCollisionShape(world, pos).isEmpty()) { diff --git a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java deleted file mode 100644 index 49366687..00000000 --- a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.betterend.mixin.common; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.world.item.Item; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.alchemy.PotionBrewing; - -@Mixin(PotionBrewing.class) -public interface PotionBrewingAccessor { - @Invoker - static void callAddMix(Potion input, Item item, Potion output) { - throw new AssertionError("@Invoker dummy body called"); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index ce71752f..4cb230da 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -1,16 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.function.Supplier; - -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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -24,51 +13,83 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WritableLevelData; -import ru.bclib.api.BiomeAPI; +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.BetterEnd; -import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import ru.betterend.world.generator.TerrainGenerator; + +import java.util.List; +import java.util.concurrent.Executor; +import java.util.function.Supplier; @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { - private static String be_lastWorld = null; + //private static String be_lastWorld = null; protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey resourceKey, DimensionType dimensionType, Supplier supplier, boolean bl, boolean bl2, long l) { super(writableLevelData, resourceKey, dimensionType, supplier, bl, bl2, l); } +// @Inject(method = "*", at = @At("TAIL")) +// private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { +// if (be_lastWorld != null && be_lastWorld.equals(session.getLevelId())) { +// return; +// } +// +// be_lastWorld = session.getLevelId(); +// //ServerLevel world = ServerLevel.class.cast(this); +// //EndBiomes.onWorldLoad(world.getSeed(), world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY)); +// } + @Inject(method = "*", at = @At("TAIL")) - private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - if (be_lastWorld != null && be_lastWorld.equals(session.getLevelId())) { - return; + private void be_onServerWorldInit(MinecraftServer minecraftServer, Executor executor, LevelStorageAccess levelStorageAccess, ServerLevelData serverLevelData, ResourceKey resourceKey, DimensionType dimensionType, ChunkProgressListener chunkProgressListener, ChunkGenerator chunkGenerator, boolean bl, long seed, List list, boolean bl2, CallbackInfo ci) { + ServerLevel level = ServerLevel.class.cast(this); + if (level.dimension() == Level.END) { + TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler()); } - - be_lastWorld = session.getLevelId(); - ServerLevel world = ServerLevel.class.cast(this); - EndBiomes.onWorldLoad(world.getSeed()); } - + @Inject(method = "getSharedSpawnPos", at = @At("HEAD"), cancellable = true) private void be_getSharedSpawnPos(CallbackInfoReturnable info) { if (GeneratorOptions.changeSpawn()) { if (ServerLevel.class.cast(this).dimension() == Level.END) { - info.setReturnValue(GeneratorOptions.getSpawn()); - info.cancel(); + BlockPos pos = GeneratorOptions.getSpawn(); + info.setReturnValue(pos); } } } - @ModifyArg( - method = "tickChunk", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z" - ) - ) + @Inject(method = "makeObsidianPlatform", at = @At("HEAD"), cancellable = true) + private static void be_createObsidianPlatform(ServerLevel serverLevel, CallbackInfo info) { + if (!GeneratorOptions.generateObsidianPlatform()) { + info.cancel(); + } + else if (GeneratorOptions.changeSpawn()) { + BlockPos blockPos = GeneratorOptions.getSpawn(); + int i = blockPos.getX(); + int j = blockPos.getY() - 2; + int k = blockPos.getZ(); + BlockPos.betweenClosed(i - 2, j + 1, k - 2, i + 2, j + 3, k + 2).forEach((blockPosx) -> { + serverLevel.setBlockAndUpdate(blockPosx, Blocks.AIR.defaultBlockState()); + }); + BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((blockPosx) -> { + serverLevel.setBlockAndUpdate(blockPosx, Blocks.OBSIDIAN.defaultBlockState()); + }); + info.cancel(); + } + } + + @ModifyArg(method = "tickChunk", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z")) private BlockState be_modifyTickState(BlockPos pos, BlockState state) { if (state.is(Blocks.ICE)) { ResourceLocation biome = BiomeAPI.getBiomeID(getBiome(pos)); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index 1f85de89..962df157 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -1,15 +1,6 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import com.mojang.authlib.GameProfile; - import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; @@ -30,6 +21,13 @@ import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; @@ -51,28 +49,38 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt private int lastSentFood; @Shadow private int lastSentExp; - + private BlockPos exitPos; private int be_teleportDelay = 0; - + public ServerPlayerMixin(Level world, BlockPos pos, float yaw, GameProfile profile) { super(world, pos, yaw, profile); } - + @Inject(method = "createEndPlatform", at = @At("HEAD"), cancellable = true) private void be_createEndSpawnPlatform(ServerLevel world, BlockPos centerPos, CallbackInfo info) { if (!GeneratorOptions.generateObsidianPlatform()) { info.cancel(); } } - + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); + info.setReturnValue(new PortalInfo( + new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), + getDeltaMovement(), + getYRot(), + getXRot() + )); + } + else if (GeneratorOptions.changeSpawn() && destination.dimension() == Level.END) { + BlockPos spawn = GeneratorOptions.getSpawn(); + Vec3 pos = new Vec3(spawn.getX() + 0.5, spawn.getY(), spawn.getZ() + 0.5); + info.setReturnValue(new PortalInfo(pos, Vec3.ZERO, 90.0F, 0.0F)); } } - + @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport() && level instanceof ServerLevel) { @@ -80,33 +88,44 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt ServerLevel serverWorld = getLevel(); LevelData worldProperties = destination.getLevelData(); ServerPlayer player = ServerPlayer.class.cast(this); - connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), - gameMode.getGameModeForPlayer(),gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); - connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + connection.send(new ClientboundRespawnPacket( + destination.dimensionType(), + destination.dimension(), + BiomeManager.obfuscateSeed(destination.getSeed()), + gameMode.getGameModeForPlayer(), + gameMode.getPreviousGameModeForPlayer(), + destination.isDebug(), + destination.isFlat(), + true + )); + connection.send(new ClientboundChangeDifficultyPacket( + worldProperties.getDifficulty(), + worldProperties.isDifficultyLocked() + )); PlayerList playerManager = server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); - serverWorld.removePlayerImmediately(player); - removed = false; + serverWorld.removePlayerImmediately(player, RemovalReason.CHANGED_DIMENSION); + unsetRemoved(); PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { serverWorld.getProfiler().push("moving"); serverWorld.getProfiler().pop(); serverWorld.getProfiler().push("placing"); - setLevel(destination); + this.level = destination; destination.addDuringPortalTeleport(player); setRot(teleportTarget.yRot, teleportTarget.xRot); moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); triggerDimensionChangeTriggers(serverWorld); gameMode.setLevel(destination); - connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); + connection.send(new ClientboundPlayerAbilitiesPacket(getAbilities())); playerManager.sendLevelInfo(player, destination); playerManager.sendAllPlayerInfo(player); - + for (MobEffectInstance statusEffectInstance : getActiveEffects()) { connection.send(new ClientboundUpdateMobEffectPacket(getId(), statusEffectInstance)); } - + connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false)); lastSentExp = -1; lastSentHealth = -1.0F; @@ -117,12 +136,12 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt info.setReturnValue(player); } } - + @Inject(method = "tick", at = @At("TAIL")) public void be_decreaseCooldawn(CallbackInfo info) { if (be_teleportDelay > 0) be_teleportDelay--; } - + @Override public int getDimensionChangingDelay() { if (be_teleportDelay > 0) { @@ -130,27 +149,27 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt } return super.getDimensionChangingDelay(); } - + @Shadow - abstract ServerLevel getLevel(); - + public abstract ServerLevel getLevel(); + @Shadow abstract void triggerDimensionChangeTriggers(ServerLevel origin); - + @Shadow @Override protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); - + @Override public void be_setExitPos(BlockPos pos) { this.exitPos = pos.immutable(); } - + @Override public void be_resetExitPos() { this.exitPos = null; } - + @Override public boolean be_canTeleport() { return this.exitPos != null; diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 5d5ba94f..0787e522 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -1,18 +1,30 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; - -import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) -public class SlimeMixin implements ISlime { +public abstract class SlimeMixin extends Entity implements ISlime { + public SlimeMixin(EntityType entityType, Level level) { + super(entityType, level); + } + @Shadow - protected void setSize(int size, boolean heal) {} + protected void setSize(int size, boolean heal) { + } @Override public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } + + @Override + public void entityRemove(Entity.RemovalReason removalReason) { + super.remove(removalReason); + } } diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 58b3001e..b42926c9 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -1,45 +1,44 @@ package ru.betterend.mixin.common; -import java.util.Random; - -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.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.IronBarsBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.SpikeFeature; import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +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.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(SpikeFeature.class) public class SpikeFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } } - + @Inject(method = "placeSpike", at = @At("HEAD"), cancellable = true) private void be_placeSpike(ServerLevelAccessor world, Random random, SpikeConfiguration config, SpikeFeature.EndSpike spike, CallbackInfo info) { int x = spike.getCenterX(); @@ -69,8 +68,9 @@ public class SpikeFeatureMixin { if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { radius--; StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); - StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); - BlockPos side = base.getSize(); + StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike + .isGuarded() ? "_cage" : ""))); + Vec3i side = base.getSize(); BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); minY = pos1.getY() + side.getY(); side = top.getSize(); @@ -78,8 +78,8 @@ public class SpikeFeatureMixin { maxY = pos2.getY(); StructurePlaceSettings data = new StructurePlaceSettings(); - base.placeInWorldChunk(world, pos1, data, random); - top.placeInWorldChunk(world, pos2, data, random); + base.placeInWorld(world, pos1, pos1, data, random, 2); + top.placeInWorld(world, pos2, pos2, data, random, 2); int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); @@ -93,7 +93,8 @@ public class SpikeFeatureMixin { for (int py = minY; py < maxY; py++) { mut.setY(py); if (world.getBlockState(mut).getMaterial().isReplaceable()) { - if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) { + if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt( + 24) == 0) { BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN); } else { @@ -146,15 +147,27 @@ public class SpikeFeatureMixin { if (bl || bl2 || bl3) { boolean bl4 = px == -2 || px == 2 || bl3; boolean bl5 = pz == -2 || pz == 2 || bl3; - BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.defaultBlockState().setValue(IronBarsBlock.NORTH, bl4 && pz != -2)).setValue(IronBarsBlock.SOUTH, bl4 && pz != 2)).setValue(IronBarsBlock.WEST, bl5 && px != -2)).setValue(IronBarsBlock.EAST, bl5 && px != 2); - BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState); + BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS + .defaultBlockState() + .setValue(IronBarsBlock.NORTH, bl4 && pz != -2)).setValue( + IronBarsBlock.SOUTH, + bl4 && pz != 2 + )).setValue(IronBarsBlock.WEST, bl5 && px != -2)).setValue( + IronBarsBlock.EAST, + bl5 && px != 2 + ); + BlocksHelper.setWithoutUpdate( + world, + mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), + blockState + ); } } } } } } - + info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java b/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java new file mode 100644 index 00000000..58712fd7 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java @@ -0,0 +1,19 @@ +package ru.betterend.mixin.common; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import ru.betterend.interfaces.StructureFeaturesAccessor; + +@Mixin(StructureFeatures.class) +public class StructureFeaturesMixin implements StructureFeaturesAccessor { + @Shadow @Final private static ConfiguredStructureFeature> END_CITY; + + public ConfiguredStructureFeature> getEndCity(){ + return END_CITY; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java deleted file mode 100644 index da2c05e6..00000000 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.betterend.mixin.common; - -import java.util.List; - -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.CallbackInfo; - -import com.google.common.collect.Lists; - -import net.fabricmc.fabric.impl.biome.InternalBiomeData; -import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; -import ru.betterend.interfaces.IBiomeList; - -@Mixin(value = WeightedBiomePicker.class, remap = false) -public class WeightedBiomePickerMixin implements IBiomeList { - private final List> biomes = Lists.newArrayList(); - - @Inject(method = "addBiome", at = @At("TAIL")) - private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { - if (be_isCorrectPicker(WeightedBiomePicker.class.cast(this))) { - biomes.add(biome); - } - } - - @Override - public List> getBiomes() { - return biomes; - } - - private boolean be_isCorrectPicker(WeightedBiomePicker picker) { - return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); - } -} diff --git a/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java new file mode 100644 index 00000000..fb9c0cf3 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java @@ -0,0 +1,28 @@ +package ru.betterend.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.ChunkAccess; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(WorldGenRegion.class) +public class WorldGenRegionMixin { + @Final + @Shadow + private ChunkAccess center; + + @Inject(method = "ensureCanWrite", at = @At("HEAD"), cancellable = true) + private void be_alterBlockCheck(BlockPos blockPos, CallbackInfoReturnable info) { + ChunkPos cPos = center.getPos(); + int x = blockPos.getX() >> 4; + int z = blockPos.getZ() >> 4; + WorldGenRegion region = (WorldGenRegion) (Object) this; + info.setReturnValue(Math.abs(x - cPos.x) < 2 && Math.abs(z - cPos.z) < 2); + } +} diff --git a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java index 3389bfbc..ff24de98 100644 --- a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java +++ b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java @@ -3,7 +3,7 @@ package ru.betterend.noise; /* * OpenSimplex Noise in Java. * by Kurt Spencer - * + * * v1.1 (October 5, 2014) * - Added 2D and 4D implementations. * - Proper gradient sets for all dimensions, from a @@ -16,38 +16,38 @@ package ru.betterend.noise; * will be the same when ported to other languages. */ -public class OpenSimplexNoise { +public final class OpenSimplexNoise { private static final double STRETCH_CONSTANT_2D = -0.211324865405187; // (1/Math.sqrt(2+1)-1)/2; private static final double SQUISH_CONSTANT_2D = 0.366025403784439; // (Math.sqrt(2+1)-1)/2; private static final double STRETCH_CONSTANT_3D = -1.0 / 6; // (1/Math.sqrt(3+1)-1)/3; private static final double SQUISH_CONSTANT_3D = 1.0 / 3; // (Math.sqrt(3+1)-1)/3; private static final double STRETCH_CONSTANT_4D = -0.138196601125011; // (1/Math.sqrt(4+1)-1)/4; private static final double SQUISH_CONSTANT_4D = 0.309016994374947; // (Math.sqrt(4+1)-1)/4; - + private static final double NORM_CONSTANT_2D = 47; private static final double NORM_CONSTANT_3D = 103; private static final double NORM_CONSTANT_4D = 30; - + private static final long DEFAULT_SEED = 0; - + private short[] perm; private short[] permGradIndex3D; - + public OpenSimplexNoise() { this(DEFAULT_SEED); } - + public OpenSimplexNoise(short[] perm) { this.perm = perm; permGradIndex3D = new short[256]; - + for (int i = 0; i < 256; i++) { // Since 3D has 24 gradients, simple bitmask won't work, so // precompute modulo array. permGradIndex3D[i] = (short) ((perm[i] % (gradients3D.length / 3)) * 3); } } - + // Initializes the class using a permutation array generated from a 64-bit // seed. // Generates a proper permutation (i.e. doesn't merely perform N successive @@ -57,60 +57,60 @@ public class OpenSimplexNoise { perm = new short[256]; permGradIndex3D = new short[256]; short[] source = new short[256]; - for (short i = 0; i < 256; i++) + for (short i = 0; i < 256; i++) { source[i] = i; + } seed = seed * 6364136223846793005l + 1442695040888963407l; seed = seed * 6364136223846793005l + 1442695040888963407l; seed = seed * 6364136223846793005l + 1442695040888963407l; for (int i = 255; i >= 0; i--) { seed = seed * 6364136223846793005l + 1442695040888963407l; int r = (int) ((seed + 31) % (i + 1)); - if (r < 0) - r += (i + 1); + if (r < 0) r += (i + 1); perm[i] = source[r]; permGradIndex3D[i] = (short) ((perm[i] % (gradients3D.length / 3)) * 3); source[r] = source[i]; } } - + // 2D OpenSimplex Noise. public double eval(double x, double y) { - + // Place input coordinates onto grid. double stretchOffset = (x + y) * STRETCH_CONSTANT_2D; double xs = x + stretchOffset; double ys = y + stretchOffset; - + // Floor to get grid coordinates of rhombus (stretched square) // super-cell origin. int xsb = fastFloor(xs); int ysb = fastFloor(ys); - + // Skew out to get actual coordinates of rhombus origin. We'll need // these later. double squishOffset = (xsb + ysb) * SQUISH_CONSTANT_2D; double xb = xsb + squishOffset; double yb = ysb + squishOffset; - + // Compute grid coordinates relative to rhombus origin. double xins = xs - xsb; double yins = ys - ysb; - + // Sum those together to get a value that determines which region we're // in. double inSum = xins + yins; - + // Positions relative to origin point. double dx0 = x - xb; double dy0 = y - yb; - + // We'll be defining these inside the next block and using them // afterwards. double dx_ext, dy_ext; int xsv_ext, ysv_ext; - + double value = 0; - + // Contribution (1,0) double dx1 = dx0 - 1 - SQUISH_CONSTANT_2D; double dy1 = dy0 - 0 - SQUISH_CONSTANT_2D; @@ -119,7 +119,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, dx1, dy1); } - + // Contribution (0,1) double dx2 = dx0 - 0 - SQUISH_CONSTANT_2D; double dy2 = dy0 - 1 - SQUISH_CONSTANT_2D; @@ -128,44 +128,49 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, dx2, dy2); } - + if (inSum <= 1) { // We're inside the triangle (2-Simplex) at (0,0) double zins = 1 - inSum; if (zins > xins || zins > yins) { // (0,0) is one of the closest two - // triangular vertices + // triangular vertices if (xins > yins) { xsv_ext = xsb + 1; ysv_ext = ysb - 1; dx_ext = dx0 - 1; dy_ext = dy0 + 1; - } else { + } + else { xsv_ext = xsb - 1; ysv_ext = ysb + 1; dx_ext = dx0 + 1; dy_ext = dy0 - 1; } - } else { // (1,0) and (0,1) are the closest two vertices. + } + else { // (1,0) and (0,1) are the closest two vertices. xsv_ext = xsb + 1; ysv_ext = ysb + 1; dx_ext = dx0 - 1 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 - 1 - 2 * SQUISH_CONSTANT_2D; } - } else { // We're inside the triangle (2-Simplex) at (1,1) + } + else { // We're inside the triangle (2-Simplex) at (1,1) double zins = 2 - inSum; if (zins < xins || zins < yins) { // (0,0) is one of the closest two - // triangular vertices + // triangular vertices if (xins > yins) { xsv_ext = xsb + 2; ysv_ext = ysb + 0; dx_ext = dx0 - 2 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 + 0 - 2 * SQUISH_CONSTANT_2D; - } else { + } + else { xsv_ext = xsb + 0; ysv_ext = ysb + 2; dx_ext = dx0 + 0 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 - 2 - 2 * SQUISH_CONSTANT_2D; } - } else { // (1,0) and (0,1) are the closest two vertices. + } + else { // (1,0) and (0,1) are the closest two vertices. dx_ext = dx0; dy_ext = dy0; xsv_ext = xsb; @@ -176,71 +181,71 @@ public class OpenSimplexNoise { dx0 = dx0 - 1 - 2 * SQUISH_CONSTANT_2D; dy0 = dy0 - 1 - 2 * SQUISH_CONSTANT_2D; } - + // Contribution (0,0) or (1,1) double attn0 = 2 - dx0 * dx0 - dy0 * dy0; if (attn0 > 0) { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb, ysb, dx0, dy0); } - + // Extra Vertex double attn_ext = 2 - dx_ext * dx_ext - dy_ext * dy_ext; if (attn_ext > 0) { attn_ext *= attn_ext; value += attn_ext * attn_ext * extrapolate(xsv_ext, ysv_ext, dx_ext, dy_ext); } - + return value / NORM_CONSTANT_2D; } - + // 3D OpenSimplex Noise. public double eval(double x, double y, double z) { - + // Place input coordinates on simplectic honeycomb. double stretchOffset = (x + y + z) * STRETCH_CONSTANT_3D; double xs = x + stretchOffset; double ys = y + stretchOffset; double zs = z + stretchOffset; - + // Floor to get simplectic honeycomb coordinates of rhombohedron // (stretched cube) super-cell origin. int xsb = fastFloor(xs); int ysb = fastFloor(ys); int zsb = fastFloor(zs); - + // Skew out to get actual coordinates of rhombohedron origin. We'll need // these later. double squishOffset = (xsb + ysb + zsb) * SQUISH_CONSTANT_3D; double xb = xsb + squishOffset; double yb = ysb + squishOffset; double zb = zsb + squishOffset; - + // Compute simplectic honeycomb coordinates relative to rhombohedral // origin. double xins = xs - xsb; double yins = ys - ysb; double zins = zs - zsb; - + // Sum those together to get a value that determines which region we're // in. double inSum = xins + yins + zins; - + // Positions relative to origin point. double dx0 = x - xb; double dy0 = y - yb; double dz0 = z - zb; - + // We'll be defining these inside the next block and using them // afterwards. double dx_ext0, dy_ext0, dz_ext0; double dx_ext1, dy_ext1, dz_ext1; int xsv_ext0, ysv_ext0, zsv_ext0; int xsv_ext1, ysv_ext1, zsv_ext1; - + double value = 0; if (inSum <= 1) { // We're inside the tetrahedron (3-Simplex) at (0,0,0) - + // Determine which two of (0,0,1), (0,1,0), (1,0,0) are closest. byte aPoint = 0x01; double aScore = xins; @@ -249,106 +254,115 @@ public class OpenSimplexNoise { if (aScore >= bScore && zins > bScore) { bScore = zins; bPoint = 0x04; - } else if (aScore < bScore && zins > aScore) { + } + else if (aScore < bScore && zins > aScore) { aScore = zins; aPoint = 0x04; } - + // Now we determine the two lattice points not part of the // tetrahedron that may contribute. // This depends on the closest two tetrahedral vertices, including // (0,0,0) double wins = 1 - inSum; if (wins > aScore || wins > bScore) { // (0,0,0) is one of the - // closest two tetrahedral - // vertices. + // closest two tetrahedral + // vertices. byte c = (bScore > aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. - + // closest + // vertex is the + // closest out + // of a and b. + if ((c & 0x01) == 0) { xsv_ext0 = xsb - 1; xsv_ext1 = xsb; dx_ext0 = dx0 + 1; dx_ext1 = dx0; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1; } - + if ((c & 0x02) == 0) { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0; if ((c & 0x01) == 0) { ysv_ext1 -= 1; dy_ext1 += 1; - } else { + } + else { ysv_ext0 -= 1; dy_ext0 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1; } - + if ((c & 0x04) == 0) { zsv_ext0 = zsb; zsv_ext1 = zsb - 1; dz_ext0 = dz0; dz_ext1 = dz0 + 1; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1; } - } else { // (0,0,0) is not one of the closest two tetrahedral - // vertices. + } + else { // (0,0,0) is not one of the closest two tetrahedral + // vertices. byte c = (byte) (aPoint | bPoint); // Our two extra vertices are - // determined by the closest - // two. - + // determined by the closest + // two. + if ((c & 0x01) == 0) { xsv_ext0 = xsb; xsv_ext1 = xsb - 1; dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; } - + if ((c & 0x02) == 0) { ysv_ext0 = ysb; ysv_ext1 = ysb - 1; dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; } - + if ((c & 0x04) == 0) { zsv_ext0 = zsb; zsv_ext1 = zsb - 1; dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; } } - + // Contribution (0,0,0) double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0; if (attn0 > 0) { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 0, ysb + 0, zsb + 0, dx0, dy0, dz0); } - + // Contribution (1,0,0) double dx1 = dx0 - 1 - SQUISH_CONSTANT_3D; double dy1 = dy0 - 0 - SQUISH_CONSTANT_3D; @@ -358,7 +372,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, dx1, dy1, dz1); } - + // Contribution (0,1,0) double dx2 = dx0 - 0 - SQUISH_CONSTANT_3D; double dy2 = dy0 - 1 - SQUISH_CONSTANT_3D; @@ -368,7 +382,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, dx2, dy2, dz2); } - + // Contribution (0,0,1) double dx3 = dx2; double dy3 = dy1; @@ -378,9 +392,10 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, dx3, dy3, dz3); } - } else if (inSum >= 2) { // We're inside the tetrahedron (3-Simplex) at - // (1,1,1) - + } + else if (inSum >= 2) { // We're inside the tetrahedron (3-Simplex) at + // (1,1,1) + // Determine which two tetrahedral vertices are the closest, out of // (1,1,0), (1,0,1), (0,1,1) but not (1,1,1). byte aPoint = 0x06; @@ -390,99 +405,108 @@ public class OpenSimplexNoise { if (aScore <= bScore && zins < bScore) { bScore = zins; bPoint = 0x03; - } else if (aScore > bScore && zins < aScore) { + } + else if (aScore > bScore && zins < aScore) { aScore = zins; aPoint = 0x03; } - + // Now we determine the two lattice points not part of the // tetrahedron that may contribute. // This depends on the closest two tetrahedral vertices, including // (1,1,1) double wins = 3 - inSum; if (wins < aScore || wins < bScore) { // (1,1,1) is one of the - // closest two tetrahedral - // vertices. + // closest two tetrahedral + // vertices. byte c = (bScore < aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. - + // closest + // vertex is the + // closest out + // of a and b. + if ((c & 0x01) != 0) { xsv_ext0 = xsb + 2; xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_3D; } - + if ((c & 0x02) != 0) { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; if ((c & 0x01) != 0) { ysv_ext1 += 1; dy_ext1 -= 1; - } else { + } + else { ysv_ext0 += 1; dy_ext0 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_3D; } - + if ((c & 0x04) != 0) { zsv_ext0 = zsb + 1; zsv_ext1 = zsb + 2; dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 3 * SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_3D; } - } else { // (1,1,1) is not one of the closest two tetrahedral - // vertices. + } + else { // (1,1,1) is not one of the closest two tetrahedral + // vertices. byte c = (byte) (aPoint & bPoint); // Our two extra vertices are - // determined by the closest - // two. - + // determined by the closest + // two. + if ((c & 0x01) != 0) { xsv_ext0 = xsb + 1; xsv_ext1 = xsb + 2; dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx0 - SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; } - + if ((c & 0x02) != 0) { ysv_ext0 = ysb + 1; ysv_ext1 = ysb + 2; dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy0 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; } - + if ((c & 0x04) != 0) { zsv_ext0 = zsb + 1; zsv_ext1 = zsb + 2; dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz0 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; } } - + // Contribution (1,1,0) double dx3 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; double dy3 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; @@ -492,7 +516,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, dx3, dy3, dz3); } - + // Contribution (1,0,1) double dx2 = dx3; double dy2 = dy0 - 0 - 2 * SQUISH_CONSTANT_3D; @@ -502,7 +526,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, dx2, dy2, dz2); } - + // Contribution (0,1,1) double dx1 = dx0 - 0 - 2 * SQUISH_CONSTANT_3D; double dy1 = dy3; @@ -512,7 +536,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, dx1, dy1, dz1); } - + // Contribution (1,1,1) dx0 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; dy0 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; @@ -522,39 +546,42 @@ public class OpenSimplexNoise { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, dx0, dy0, dz0); } - } else { // We're inside the octahedron (Rectified 3-Simplex) in - // between. + } + else { // We're inside the octahedron (Rectified 3-Simplex) in + // between. double aScore; byte aPoint; boolean aIsFurtherSide; double bScore; byte bPoint; boolean bIsFurtherSide; - + // Decide between point (0,0,1) and (1,1,0) as closest double p1 = xins + yins; if (p1 > 1) { aScore = p1 - 1; aPoint = 0x03; aIsFurtherSide = true; - } else { + } + else { aScore = 1 - p1; aPoint = 0x04; aIsFurtherSide = false; } - + // Decide between point (0,1,0) and (1,0,1) as closest double p2 = xins + zins; if (p2 > 1) { bScore = p2 - 1; bPoint = 0x05; bIsFurtherSide = true; - } else { + } + else { bScore = 1 - p2; bPoint = 0x02; bIsFurtherSide = false; } - + // The closest out of the two (1,0,0) and (0,1,1) will replace the // furthest out of the two decided above, if closer. double p3 = yins + zins; @@ -564,29 +591,32 @@ public class OpenSimplexNoise { aScore = score; aPoint = 0x06; aIsFurtherSide = true; - } else if (aScore > bScore && bScore < score) { + } + else if (aScore > bScore && bScore < score) { bScore = score; bPoint = 0x06; bIsFurtherSide = true; } - } else { + } + else { double score = 1 - p3; if (aScore <= bScore && aScore < score) { aScore = score; aPoint = 0x01; aIsFurtherSide = false; - } else if (aScore > bScore && bScore < score) { + } + else if (aScore > bScore && bScore < score) { bScore = score; bPoint = 0x01; bIsFurtherSide = false; } } - + // Where each of the two closest points are determines how the extra // two vertices are calculated. if (aIsFurtherSide == bIsFurtherSide) { if (aIsFurtherSide) { // Both closest points on (1,1,1) side - + // One of the two extra points is (1,1,1) dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_3D; @@ -594,7 +624,7 @@ public class OpenSimplexNoise { xsv_ext0 = xsb + 1; ysv_ext0 = ysb + 1; zsv_ext0 = zsb + 1; - + // Other extra point is based on the shared axis. byte c = (byte) (aPoint & bPoint); if ((c & 0x01) != 0) { @@ -604,14 +634,16 @@ public class OpenSimplexNoise { xsv_ext1 = xsb + 2; ysv_ext1 = ysb; zsv_ext1 = zsb; - } else if ((c & 0x02) != 0) { + } + else if ((c & 0x02) != 0) { dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; xsv_ext1 = xsb; ysv_ext1 = ysb + 2; zsv_ext1 = zsb; - } else { + } + else { dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; @@ -619,8 +651,9 @@ public class OpenSimplexNoise { ysv_ext1 = ysb; zsv_ext1 = zsb + 2; } - } else {// Both closest points on (0,0,0) side - + } + else {// Both closest points on (0,0,0) side + // One of the two extra points is (0,0,0) dx_ext0 = dx0; dy_ext0 = dy0; @@ -628,7 +661,7 @@ public class OpenSimplexNoise { xsv_ext0 = xsb; ysv_ext0 = ysb; zsv_ext0 = zsb; - + // Other extra point is based on the omitted axis. byte c = (byte) (aPoint | bPoint); if ((c & 0x01) == 0) { @@ -638,14 +671,16 @@ public class OpenSimplexNoise { xsv_ext1 = xsb - 1; ysv_ext1 = ysb + 1; zsv_ext1 = zsb + 1; - } else if ((c & 0x02) == 0) { + } + else if ((c & 0x02) == 0) { dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; xsv_ext1 = xsb + 1; ysv_ext1 = ysb - 1; zsv_ext1 = zsb + 1; - } else { + } + else { dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; @@ -654,16 +689,18 @@ public class OpenSimplexNoise { zsv_ext1 = zsb - 1; } } - } else { // One point on (0,0,0) side, one point on (1,1,1) side + } + else { // One point on (0,0,0) side, one point on (1,1,1) side byte c1, c2; if (aIsFurtherSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } - + // One contribution is a permutation of (1,1,-1) if ((c1 & 0x01) == 0) { dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_3D; @@ -672,14 +709,16 @@ public class OpenSimplexNoise { xsv_ext0 = xsb - 1; ysv_ext0 = ysb + 1; zsv_ext0 = zsb + 1; - } else if ((c1 & 0x02) == 0) { + } + else if ((c1 & 0x02) == 0) { dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext0 = dy0 + 1 - SQUISH_CONSTANT_3D; dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; xsv_ext0 = xsb + 1; ysv_ext0 = ysb - 1; zsv_ext0 = zsb + 1; - } else { + } + else { dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; dz_ext0 = dz0 + 1 - SQUISH_CONSTANT_3D; @@ -687,7 +726,7 @@ public class OpenSimplexNoise { ysv_ext0 = ysb + 1; zsv_ext0 = zsb - 1; } - + // One contribution is a permutation of (0,0,2) dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; @@ -698,15 +737,17 @@ public class OpenSimplexNoise { if ((c2 & 0x01) != 0) { dx_ext1 -= 2; xsv_ext1 += 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { dy_ext1 -= 2; ysv_ext1 += 2; - } else { + } + else { dz_ext1 -= 2; zsv_ext1 += 2; } } - + // Contribution (1,0,0) double dx1 = dx0 - 1 - SQUISH_CONSTANT_3D; double dy1 = dy0 - 0 - SQUISH_CONSTANT_3D; @@ -716,7 +757,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, dx1, dy1, dz1); } - + // Contribution (0,1,0) double dx2 = dx0 - 0 - SQUISH_CONSTANT_3D; double dy2 = dy0 - 1 - SQUISH_CONSTANT_3D; @@ -726,7 +767,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, dx2, dy2, dz2); } - + // Contribution (0,0,1) double dx3 = dx2; double dy3 = dy1; @@ -736,7 +777,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, dx3, dy3, dz3); } - + // Contribution (1,1,0) double dx4 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; double dy4 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; @@ -746,7 +787,7 @@ public class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 0, dx4, dy4, dz4); } - + // Contribution (1,0,1) double dx5 = dx4; double dy5 = dy0 - 0 - 2 * SQUISH_CONSTANT_3D; @@ -756,7 +797,7 @@ public class OpenSimplexNoise { attn5 *= attn5; value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 0, zsb + 1, dx5, dy5, dz5); } - + // Contribution (0,1,1) double dx6 = dx0 - 0 - 2 * SQUISH_CONSTANT_3D; double dy6 = dy4; @@ -767,41 +808,41 @@ public class OpenSimplexNoise { value += attn6 * attn6 * extrapolate(xsb + 0, ysb + 1, zsb + 1, dx6, dy6, dz6); } } - + // First extra vertex double attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0; if (attn_ext0 > 0) { attn_ext0 *= attn_ext0; value += attn_ext0 * attn_ext0 * extrapolate(xsv_ext0, ysv_ext0, zsv_ext0, dx_ext0, dy_ext0, dz_ext0); } - + // Second extra vertex double attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1; if (attn_ext1 > 0) { attn_ext1 *= attn_ext1; value += attn_ext1 * attn_ext1 * extrapolate(xsv_ext1, ysv_ext1, zsv_ext1, dx_ext1, dy_ext1, dz_ext1); } - + return value / NORM_CONSTANT_3D; } - + // 4D OpenSimplex Noise. public double eval(double x, double y, double z, double w) { - + // Place input coordinates on simplectic honeycomb. double stretchOffset = (x + y + z + w) * STRETCH_CONSTANT_4D; double xs = x + stretchOffset; double ys = y + stretchOffset; double zs = z + stretchOffset; double ws = w + stretchOffset; - + // Floor to get simplectic honeycomb coordinates of rhombo-hypercube // super-cell origin. int xsb = fastFloor(xs); int ysb = fastFloor(ys); int zsb = fastFloor(zs); int wsb = fastFloor(ws); - + // Skew out to get actual coordinates of stretched rhombo-hypercube // origin. We'll need these later. double squishOffset = (xsb + ysb + zsb + wsb) * SQUISH_CONSTANT_4D; @@ -809,24 +850,24 @@ public class OpenSimplexNoise { double yb = ysb + squishOffset; double zb = zsb + squishOffset; double wb = wsb + squishOffset; - + // Compute simplectic honeycomb coordinates relative to rhombo-hypercube // origin. double xins = xs - xsb; double yins = ys - ysb; double zins = zs - zsb; double wins = ws - wsb; - + // Sum those together to get a value that determines which region we're // in. double inSum = xins + yins + zins + wins; - + // Positions relative to origin point. double dx0 = x - xb; double dy0 = y - yb; double dz0 = z - zb; double dw0 = w - wb; - + // We'll be defining these inside the next block and using them // afterwards. double dx_ext0, dy_ext0, dz_ext0, dw_ext0; @@ -835,11 +876,11 @@ public class OpenSimplexNoise { int xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0; int xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1; int xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2; - + double value = 0; if (inSum <= 1) { // We're inside the pentachoron (4-Simplex) at - // (0,0,0,0) - + // (0,0,0,0) + // Determine which two of (0,0,0,1), (0,0,1,0), (0,1,0,0), (1,0,0,0) // are closest. byte aPoint = 0x01; @@ -849,56 +890,61 @@ public class OpenSimplexNoise { if (aScore >= bScore && zins > bScore) { bScore = zins; bPoint = 0x04; - } else if (aScore < bScore && zins > aScore) { + } + else if (aScore < bScore && zins > aScore) { aScore = zins; aPoint = 0x04; } if (aScore >= bScore && wins > bScore) { bScore = wins; bPoint = 0x08; - } else if (aScore < bScore && wins > aScore) { + } + else if (aScore < bScore && wins > aScore) { aScore = wins; aPoint = 0x08; } - + // Now we determine the three lattice points not part of the // pentachoron that may contribute. // This depends on the closest two pentachoron vertices, including // (0,0,0,0) double uins = 1 - inSum; if (uins > aScore || uins > bScore) { // (0,0,0,0) is one of the - // closest two pentachoron - // vertices. + // closest two pentachoron + // vertices. byte c = (bScore > aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. + // closest + // vertex is the + // closest out + // of a and b. if ((c & 0x01) == 0) { xsv_ext0 = xsb - 1; xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx0 + 1; dx_ext1 = dx_ext2 = dx0; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 1; } - + if ((c & 0x02) == 0) { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy_ext1 = dy_ext2 = dy0; if ((c & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1; } - + if ((c & 0x04) == 0) { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz_ext1 = dz_ext2 = dz0; @@ -906,46 +952,52 @@ public class OpenSimplexNoise { if ((c & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext2 -= 1; dz_ext2 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1; } - + if ((c & 0x08) == 0) { wsv_ext0 = wsv_ext1 = wsb; wsv_ext2 = wsb - 1; dw_ext0 = dw_ext1 = dw0; dw_ext2 = dw0 + 1; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 1; } - } else { // (0,0,0,0) is not one of the closest two pentachoron - // vertices. + } + else { // (0,0,0,0) is not one of the closest two pentachoron + // vertices. byte c = (byte) (aPoint | bPoint); // Our three extra vertices - // are determined by the - // closest two. - + // are determined by the + // closest two. + if ((c & 0x01) == 0) { xsv_ext0 = xsv_ext2 = xsb; xsv_ext1 = xsb - 1; dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext2 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x02) == 0) { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D; @@ -953,16 +1005,18 @@ public class OpenSimplexNoise { if ((c & 0x01) == 0x01) { ysv_ext1 -= 1; dy_ext1 += 1; - } else { + } + else { ysv_ext2 -= 1; dy_ext2 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; dy_ext1 = dy_ext2 = dy0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x04) == 0) { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D; @@ -970,36 +1024,39 @@ public class OpenSimplexNoise { if ((c & 0x03) == 0x03) { zsv_ext1 -= 1; dz_ext1 += 1; - } else { + } + else { zsv_ext2 -= 1; dz_ext2 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; dz_ext1 = dz_ext2 = dz0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x08) == 0) { wsv_ext0 = wsv_ext1 = wsb; wsv_ext2 = wsb - 1; dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - SQUISH_CONSTANT_4D; dw_ext2 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw_ext2 = dw0 - 1 - SQUISH_CONSTANT_4D; } } - + // Contribution (0,0,0,0) double attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0; if (attn0 > 0) { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 0, dx0, dy0, dz0, dw0); } - + // Contribution (1,0,0,0) double dx1 = dx0 - 1 - SQUISH_CONSTANT_4D; double dy1 = dy0 - 0 - SQUISH_CONSTANT_4D; @@ -1010,7 +1067,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1); } - + // Contribution (0,1,0,0) double dx2 = dx0 - 0 - SQUISH_CONSTANT_4D; double dy2 = dy0 - 1 - SQUISH_CONSTANT_4D; @@ -1021,7 +1078,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2); } - + // Contribution (0,0,1,0) double dx3 = dx2; double dy3 = dy1; @@ -1032,7 +1089,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3); } - + // Contribution (0,0,0,1) double dx4 = dx2; double dy4 = dy1; @@ -1043,11 +1100,12 @@ public class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4); } - } else if (inSum >= 3) { // We're inside the pentachoron (4-Simplex) at - // (1,1,1,1) - // Determine which two of (1,1,1,0), - // (1,1,0,1), (1,0,1,1), (0,1,1,1) - // are closest. + } + else if (inSum >= 3) { // We're inside the pentachoron (4-Simplex) at + // (1,1,1,1) + // Determine which two of (1,1,1,0), + // (1,1,0,1), (1,0,1,1), (0,1,1,1) + // are closest. byte aPoint = 0x0E; double aScore = xins; byte bPoint = 0x0D; @@ -1055,57 +1113,62 @@ public class OpenSimplexNoise { if (aScore <= bScore && zins < bScore) { bScore = zins; bPoint = 0x0B; - } else if (aScore > bScore && zins < aScore) { + } + else if (aScore > bScore && zins < aScore) { aScore = zins; aPoint = 0x0B; } if (aScore <= bScore && wins < bScore) { bScore = wins; bPoint = 0x07; - } else if (aScore > bScore && wins < aScore) { + } + else if (aScore > bScore && wins < aScore) { aScore = wins; aPoint = 0x07; } - + // Now we determine the three lattice points not part of the // pentachoron that may contribute. // This depends on the closest two pentachoron vertices, including // (0,0,0,0) double uins = 4 - inSum; if (uins < aScore || uins < bScore) { // (1,1,1,1) is one of the - // closest two pentachoron - // vertices. + // closest two pentachoron + // vertices. byte c = (bScore < aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. - + // closest + // vertex is the + // closest out + // of a and b. + if ((c & 0x01) != 0) { xsv_ext0 = xsb + 2; xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx0 - 2 - 4 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 4 * SQUISH_CONSTANT_4D; } - + if ((c & 0x02) != 0) { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; if ((c & 0x01) != 0) { ysv_ext1 += 1; dy_ext1 -= 1; - } else { + } + else { ysv_ext0 += 1; dy_ext0 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 4 * SQUISH_CONSTANT_4D; } - + if ((c & 0x04) != 0) { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D; @@ -1113,46 +1176,52 @@ public class OpenSimplexNoise { if ((c & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext2 += 1; dz_ext2 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 4 * SQUISH_CONSTANT_4D; } - + if ((c & 0x08) != 0) { wsv_ext0 = wsv_ext1 = wsb + 1; wsv_ext2 = wsb + 2; dw_ext0 = dw_ext1 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; dw_ext2 = dw0 - 2 - 4 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 4 * SQUISH_CONSTANT_4D; } - } else { // (1,1,1,1) is not one of the closest two pentachoron - // vertices. + } + else { // (1,1,1,1) is not one of the closest two pentachoron + // vertices. byte c = (byte) (aPoint & bPoint); // Our three extra vertices - // are determined by the - // closest two. - + // are determined by the + // closest two. + if ((c & 0x01) != 0) { xsv_ext0 = xsv_ext2 = xsb + 1; xsv_ext1 = xsb + 2; dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext2 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x02) != 0) { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1160,16 +1229,18 @@ public class OpenSimplexNoise { if ((c & 0x01) != 0) { ysv_ext2 += 1; dy_ext2 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D; dy_ext1 = dy_ext2 = dy0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x04) != 0) { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1177,29 +1248,32 @@ public class OpenSimplexNoise { if ((c & 0x03) != 0) { zsv_ext2 += 1; dz_ext2 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D; dz_ext1 = dz_ext2 = dz0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x08) != 0) { wsv_ext0 = wsv_ext1 = wsb + 1; wsv_ext2 = wsb + 2; dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext2 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw_ext2 = dw0 - 3 * SQUISH_CONSTANT_4D; } } - + // Contribution (1,1,1,0) double dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; double dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; @@ -1210,7 +1284,7 @@ public class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4); } - + // Contribution (1,1,0,1) double dx3 = dx4; double dy3 = dy4; @@ -1221,7 +1295,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3); } - + // Contribution (1,0,1,1) double dx2 = dx4; double dy2 = dy0 - 3 * SQUISH_CONSTANT_4D; @@ -1232,7 +1306,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2); } - + // Contribution (0,1,1,1) double dx1 = dx0 - 3 * SQUISH_CONSTANT_4D; double dz1 = dz4; @@ -1243,7 +1317,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1); } - + // Contribution (1,1,1,1) dx0 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; dy0 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; @@ -1254,33 +1328,36 @@ public class OpenSimplexNoise { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 1, dx0, dy0, dz0, dw0); } - } else if (inSum <= 2) { // We're inside the first dispentachoron - // (Rectified 4-Simplex) + } + else if (inSum <= 2) { // We're inside the first dispentachoron + // (Rectified 4-Simplex) double aScore; byte aPoint; boolean aIsBiggerSide = true; double bScore; byte bPoint; boolean bIsBiggerSide = true; - + // Decide between (1,1,0,0) and (0,0,1,1) if (xins + yins > zins + wins) { aScore = xins + yins; aPoint = 0x03; - } else { + } + else { aScore = zins + wins; aPoint = 0x0C; } - + // Decide between (1,0,1,0) and (0,1,0,1) if (xins + zins > yins + wins) { bScore = xins + zins; bPoint = 0x05; - } else { + } + else { bScore = yins + wins; bPoint = 0x0A; } - + // Closer between (1,0,0,1) and (0,1,1,0) will replace the further // of a and b, if closer. if (xins + wins > yins + zins) { @@ -1288,69 +1365,76 @@ public class OpenSimplexNoise { if (aScore >= bScore && score > bScore) { bScore = score; bPoint = 0x09; - } else if (aScore < bScore && score > aScore) { + } + else if (aScore < bScore && score > aScore) { aScore = score; aPoint = 0x09; } - } else { + } + else { double score = yins + zins; if (aScore >= bScore && score > bScore) { bScore = score; bPoint = 0x06; - } else if (aScore < bScore && score > aScore) { + } + else if (aScore < bScore && score > aScore) { aScore = score; aPoint = 0x06; } } - + // Decide if (1,0,0,0) is closer. double p1 = 2 - inSum + xins; if (aScore >= bScore && p1 > bScore) { bScore = p1; bPoint = 0x01; bIsBiggerSide = false; - } else if (aScore < bScore && p1 > aScore) { + } + else if (aScore < bScore && p1 > aScore) { aScore = p1; aPoint = 0x01; aIsBiggerSide = false; } - + // Decide if (0,1,0,0) is closer. double p2 = 2 - inSum + yins; if (aScore >= bScore && p2 > bScore) { bScore = p2; bPoint = 0x02; bIsBiggerSide = false; - } else if (aScore < bScore && p2 > aScore) { + } + else if (aScore < bScore && p2 > aScore) { aScore = p2; aPoint = 0x02; aIsBiggerSide = false; } - + // Decide if (0,0,1,0) is closer. double p3 = 2 - inSum + zins; if (aScore >= bScore && p3 > bScore) { bScore = p3; bPoint = 0x04; bIsBiggerSide = false; - } else if (aScore < bScore && p3 > aScore) { + } + else if (aScore < bScore && p3 > aScore) { aScore = p3; aPoint = 0x04; aIsBiggerSide = false; } - + // Decide if (0,0,0,1) is closer. double p4 = 2 - inSum + wins; if (aScore >= bScore && p4 > bScore) { bScore = p4; bPoint = 0x08; bIsBiggerSide = false; - } else if (aScore < bScore && p4 > aScore) { + } + else if (aScore < bScore && p4 > aScore) { aScore = p4; aPoint = 0x08; aIsBiggerSide = false; } - + // Where each of the two closest points are determines how the extra // three vertices are calculated. if (aIsBiggerSide == bIsBiggerSide) { @@ -1362,45 +1446,49 @@ public class OpenSimplexNoise { xsv_ext1 = xsb - 1; dx_ext0 = dx0 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x02) == 0) { ysv_ext0 = ysb; ysv_ext1 = ysb - 1; dy_ext0 = dy0 - 3 * SQUISH_CONSTANT_4D; dy_ext1 = dy0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; dy_ext1 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x04) == 0) { zsv_ext0 = zsb; zsv_ext1 = zsb - 1; dz_ext0 = dz0 - 3 * SQUISH_CONSTANT_4D; dz_ext1 = dz0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; dz_ext1 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x08) == 0) { wsv_ext0 = wsb; wsv_ext1 = wsb - 1; dw_ext0 = dw0 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; } - + // One combination is a permutation of (0,0,0,2) based on c2 xsv_ext2 = xsb; ysv_ext2 = ysb; @@ -1413,19 +1501,23 @@ public class OpenSimplexNoise { if ((c2 & 0x01) != 0) { xsv_ext2 += 2; dx_ext2 -= 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { ysv_ext2 += 2; dy_ext2 -= 2; - } else if ((c2 & 0x04) != 0) { + } + else if ((c2 & 0x04) != 0) { zsv_ext2 += 2; dz_ext2 -= 2; - } else { + } + else { wsv_ext2 += 2; dw_ext2 -= 2; } - - } else { // Both closest points on the smaller side - // One of the two extra points is (0,0,0,0) + + } + else { // Both closest points on the smaller side + // One of the two extra points is (0,0,0,0) xsv_ext2 = xsb; ysv_ext2 = ysb; zsv_ext2 = zsb; @@ -1434,71 +1526,79 @@ public class OpenSimplexNoise { dy_ext2 = dy0; dz_ext2 = dz0; dw_ext2 = dw0; - + // Other two points are based on the omitted axes. byte c = (byte) (aPoint | bPoint); - + if ((c & 0x01) == 0) { xsv_ext0 = xsb - 1; xsv_ext1 = xsb; dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext1 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x02) == 0) { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D; if ((c & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x04) == 0) { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D; if ((c & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c & 0x08) == 0) { wsv_ext0 = wsb; wsv_ext1 = wsb - 1; dw_ext0 = dw0 - SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; } - + } - } else { // One point on each "side" + } + else { // One point on each "side" byte c1, c2; if (aIsBiggerSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } - + // Two contributions are the bigger-sided point with each 0 // replaced with -1. if ((c1 & 0x01) == 0) { @@ -1506,51 +1606,57 @@ public class OpenSimplexNoise { xsv_ext1 = xsb; dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext1 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c1 & 0x02) == 0) { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - SQUISH_CONSTANT_4D; if ((c1 & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c1 & 0x04) == 0) { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - SQUISH_CONSTANT_4D; if ((c1 & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; } - + if ((c1 & 0x08) == 0) { wsv_ext0 = wsb; wsv_ext1 = wsb - 1; dw_ext0 = dw0 - SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; } - + // One contribution is a permutation of (0,0,0,2) based on the // smaller-sided point xsv_ext2 = xsb; @@ -1564,18 +1670,21 @@ public class OpenSimplexNoise { if ((c2 & 0x01) != 0) { xsv_ext2 += 2; dx_ext2 -= 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { ysv_ext2 += 2; dy_ext2 -= 2; - } else if ((c2 & 0x04) != 0) { + } + else if ((c2 & 0x04) != 0) { zsv_ext2 += 2; dz_ext2 -= 2; - } else { + } + else { wsv_ext2 += 2; dw_ext2 -= 2; } } - + // Contribution (1,0,0,0) double dx1 = dx0 - 1 - SQUISH_CONSTANT_4D; double dy1 = dy0 - 0 - SQUISH_CONSTANT_4D; @@ -1586,7 +1695,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1); } - + // Contribution (0,1,0,0) double dx2 = dx0 - 0 - SQUISH_CONSTANT_4D; double dy2 = dy0 - 1 - SQUISH_CONSTANT_4D; @@ -1597,7 +1706,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2); } - + // Contribution (0,0,1,0) double dx3 = dx2; double dy3 = dy1; @@ -1608,7 +1717,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3); } - + // Contribution (0,0,0,1) double dx4 = dx2; double dy4 = dy1; @@ -1619,7 +1728,7 @@ public class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4); } - + // Contribution (1,1,0,0) double dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1630,7 +1739,7 @@ public class OpenSimplexNoise { attn5 *= attn5; value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5); } - + // Contribution (1,0,1,0) double dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -1641,7 +1750,7 @@ public class OpenSimplexNoise { attn6 *= attn6; value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6); } - + // Contribution (1,0,0,1) double dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -1652,7 +1761,7 @@ public class OpenSimplexNoise { attn7 *= attn7; value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7); } - + // Contribution (0,1,1,0) double dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1663,7 +1772,7 @@ public class OpenSimplexNoise { attn8 *= attn8; value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8); } - + // Contribution (0,1,0,1) double dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1674,7 +1783,7 @@ public class OpenSimplexNoise { attn9 *= attn9; value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9); } - + // Contribution (0,0,1,1) double dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -1685,32 +1794,35 @@ public class OpenSimplexNoise { attn10 *= attn10; value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10); } - } else { // We're inside the second dispentachoron (Rectified 4-Simplex) + } + else { // We're inside the second dispentachoron (Rectified 4-Simplex) double aScore; byte aPoint; boolean aIsBiggerSide = true; double bScore; byte bPoint; boolean bIsBiggerSide = true; - + // Decide between (0,0,1,1) and (1,1,0,0) if (xins + yins < zins + wins) { aScore = xins + yins; aPoint = 0x0C; - } else { + } + else { aScore = zins + wins; aPoint = 0x03; } - + // Decide between (0,1,0,1) and (1,0,1,0) if (xins + zins < yins + wins) { bScore = xins + zins; bPoint = 0x0A; - } else { + } + else { bScore = yins + wins; bPoint = 0x05; } - + // Closer between (0,1,1,0) and (1,0,0,1) will replace the further // of a and b, if closer. if (xins + wins < yins + zins) { @@ -1718,76 +1830,83 @@ public class OpenSimplexNoise { if (aScore <= bScore && score < bScore) { bScore = score; bPoint = 0x06; - } else if (aScore > bScore && score < aScore) { + } + else if (aScore > bScore && score < aScore) { aScore = score; aPoint = 0x06; } - } else { + } + else { double score = yins + zins; if (aScore <= bScore && score < bScore) { bScore = score; bPoint = 0x09; - } else if (aScore > bScore && score < aScore) { + } + else if (aScore > bScore && score < aScore) { aScore = score; aPoint = 0x09; } } - + // Decide if (0,1,1,1) is closer. double p1 = 3 - inSum + xins; if (aScore <= bScore && p1 < bScore) { bScore = p1; bPoint = 0x0E; bIsBiggerSide = false; - } else if (aScore > bScore && p1 < aScore) { + } + else if (aScore > bScore && p1 < aScore) { aScore = p1; aPoint = 0x0E; aIsBiggerSide = false; } - + // Decide if (1,0,1,1) is closer. double p2 = 3 - inSum + yins; if (aScore <= bScore && p2 < bScore) { bScore = p2; bPoint = 0x0D; bIsBiggerSide = false; - } else if (aScore > bScore && p2 < aScore) { + } + else if (aScore > bScore && p2 < aScore) { aScore = p2; aPoint = 0x0D; aIsBiggerSide = false; } - + // Decide if (1,1,0,1) is closer. double p3 = 3 - inSum + zins; if (aScore <= bScore && p3 < bScore) { bScore = p3; bPoint = 0x0B; bIsBiggerSide = false; - } else if (aScore > bScore && p3 < aScore) { + } + else if (aScore > bScore && p3 < aScore) { aScore = p3; aPoint = 0x0B; aIsBiggerSide = false; } - + // Decide if (1,1,1,0) is closer. double p4 = 3 - inSum + wins; if (aScore <= bScore && p4 < bScore) { bScore = p4; bPoint = 0x07; bIsBiggerSide = false; - } else if (aScore > bScore && p4 < aScore) { + } + else if (aScore > bScore && p4 < aScore) { aScore = p4; aPoint = 0x07; aIsBiggerSide = false; } - + // Where each of the two closest points are determines how the extra // three vertices are calculated. if (aIsBiggerSide == bIsBiggerSide) { if (aIsBiggerSide) { // Both closest points on the bigger side byte c1 = (byte) (aPoint & bPoint); byte c2 = (byte) (aPoint | bPoint); - + // Two contributions are permutations of (0,0,0,1) and // (0,0,0,2) based on c1 xsv_ext0 = xsv_ext1 = xsb; @@ -1807,23 +1926,26 @@ public class OpenSimplexNoise { dx_ext0 -= 1; xsv_ext1 += 2; dx_ext1 -= 2; - } else if ((c1 & 0x02) != 0) { + } + else if ((c1 & 0x02) != 0) { ysv_ext0 += 1; dy_ext0 -= 1; ysv_ext1 += 2; dy_ext1 -= 2; - } else if ((c1 & 0x04) != 0) { + } + else if ((c1 & 0x04) != 0) { zsv_ext0 += 1; dz_ext0 -= 1; zsv_ext1 += 2; dz_ext1 -= 2; - } else { + } + else { wsv_ext0 += 1; dw_ext0 -= 1; wsv_ext1 += 2; dw_ext1 -= 2; } - + // One contribution is a permutation of (1,1,1,-1) based on // c2 xsv_ext2 = xsb + 1; @@ -1837,18 +1959,22 @@ public class OpenSimplexNoise { if ((c2 & 0x01) == 0) { xsv_ext2 -= 2; dx_ext2 += 2; - } else if ((c2 & 0x02) == 0) { + } + else if ((c2 & 0x02) == 0) { ysv_ext2 -= 2; dy_ext2 += 2; - } else if ((c2 & 0x04) == 0) { + } + else if ((c2 & 0x04) == 0) { zsv_ext2 -= 2; dz_ext2 += 2; - } else { + } + else { wsv_ext2 -= 2; dw_ext2 += 2; } - } else { // Both closest points on the smaller side - // One of the two extra points is (1,1,1,1) + } + else { // Both closest points on the smaller side + // One of the two extra points is (1,1,1,1) xsv_ext2 = xsb + 1; ysv_ext2 = ysb + 1; zsv_ext2 = zsb + 1; @@ -1857,70 +1983,78 @@ public class OpenSimplexNoise { dy_ext2 = dy0 - 1 - 4 * SQUISH_CONSTANT_4D; dz_ext2 = dz0 - 1 - 4 * SQUISH_CONSTANT_4D; dw_ext2 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; - + // Other two points are based on the shared axes. byte c = (byte) (aPoint & bPoint); - + if ((c & 0x01) != 0) { xsv_ext0 = xsb + 2; xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x02) != 0) { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; if ((c & 0x01) == 0) { ysv_ext0 += 1; dy_ext0 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x04) != 0) { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; if ((c & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c & 0x08) != 0) { wsv_ext0 = wsb + 1; wsv_ext1 = wsb + 2; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb; dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; } } - } else { // One point on each "side" + } + else { // One point on each "side" byte c1, c2; if (aIsBiggerSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } - + // Two contributions are the bigger-sided point with each 1 // replaced with 2. if ((c1 & 0x01) != 0) { @@ -1928,51 +2062,57 @@ public class OpenSimplexNoise { xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x02) != 0) { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; if ((c1 & 0x01) == 0) { ysv_ext0 += 1; dy_ext0 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x04) != 0) { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; if ((c1 & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; } - + if ((c1 & 0x08) != 0) { wsv_ext0 = wsb + 1; wsv_ext1 = wsb + 2; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb; dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; } - + // One contribution is a permutation of (1,1,1,-1) based on the // smaller-sided point xsv_ext2 = xsb + 1; @@ -1986,18 +2126,21 @@ public class OpenSimplexNoise { if ((c2 & 0x01) == 0) { xsv_ext2 -= 2; dx_ext2 += 2; - } else if ((c2 & 0x02) == 0) { + } + else if ((c2 & 0x02) == 0) { ysv_ext2 -= 2; dy_ext2 += 2; - } else if ((c2 & 0x04) == 0) { + } + else if ((c2 & 0x04) == 0) { zsv_ext2 -= 2; dz_ext2 += 2; - } else { + } + else { wsv_ext2 -= 2; dw_ext2 += 2; } } - + // Contribution (1,1,1,0) double dx4 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; double dy4 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; @@ -2008,7 +2151,7 @@ public class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4); } - + // Contribution (1,1,0,1) double dx3 = dx4; double dy3 = dy4; @@ -2019,7 +2162,7 @@ public class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3); } - + // Contribution (1,0,1,1) double dx2 = dx4; double dy2 = dy0 - 3 * SQUISH_CONSTANT_4D; @@ -2030,7 +2173,7 @@ public class OpenSimplexNoise { attn2 *= attn2; value += attn2 * attn2 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2); } - + // Contribution (0,1,1,1) double dx1 = dx0 - 3 * SQUISH_CONSTANT_4D; double dz1 = dz4; @@ -2041,7 +2184,7 @@ public class OpenSimplexNoise { attn1 *= attn1; value += attn1 * attn1 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1); } - + // Contribution (1,1,0,0) double dx5 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy5 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -2052,7 +2195,7 @@ public class OpenSimplexNoise { attn5 *= attn5; value += attn5 * attn5 * extrapolate(xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5); } - + // Contribution (1,0,1,0) double dx6 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy6 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -2063,7 +2206,7 @@ public class OpenSimplexNoise { attn6 *= attn6; value += attn6 * attn6 * extrapolate(xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6); } - + // Contribution (1,0,0,1) double dx7 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; double dy7 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -2074,7 +2217,7 @@ public class OpenSimplexNoise { attn7 *= attn7; value += attn7 * attn7 * extrapolate(xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7); } - + // Contribution (0,1,1,0) double dx8 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy8 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -2085,7 +2228,7 @@ public class OpenSimplexNoise { attn8 *= attn8; value += attn8 * attn8 * extrapolate(xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8); } - + // Contribution (0,1,0,1) double dx9 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy9 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -2096,7 +2239,7 @@ public class OpenSimplexNoise { attn9 *= attn9; value += attn9 * attn9 * extrapolate(xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9); } - + // Contribution (0,0,1,1) double dx10 = dx0 - 0 - 2 * SQUISH_CONSTANT_4D; double dy10 = dy0 - 0 - 2 * SQUISH_CONSTANT_4D; @@ -2108,78 +2251,421 @@ public class OpenSimplexNoise { value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10); } } - + // First extra vertex double attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0 - dw_ext0 * dw_ext0; if (attn_ext0 > 0) { attn_ext0 *= attn_ext0; - value += attn_ext0 * attn_ext0 - * extrapolate(xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0, dx_ext0, dy_ext0, dz_ext0, dw_ext0); + value += attn_ext0 * attn_ext0 * extrapolate( + xsv_ext0, + ysv_ext0, + zsv_ext0, + wsv_ext0, + dx_ext0, + dy_ext0, + dz_ext0, + dw_ext0 + ); } - + // Second extra vertex double attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1 - dw_ext1 * dw_ext1; if (attn_ext1 > 0) { attn_ext1 *= attn_ext1; - value += attn_ext1 * attn_ext1 - * extrapolate(xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1, dx_ext1, dy_ext1, dz_ext1, dw_ext1); + value += attn_ext1 * attn_ext1 * extrapolate( + xsv_ext1, + ysv_ext1, + zsv_ext1, + wsv_ext1, + dx_ext1, + dy_ext1, + dz_ext1, + dw_ext1 + ); } - + // Third extra vertex double attn_ext2 = 2 - dx_ext2 * dx_ext2 - dy_ext2 * dy_ext2 - dz_ext2 * dz_ext2 - dw_ext2 * dw_ext2; if (attn_ext2 > 0) { attn_ext2 *= attn_ext2; - value += attn_ext2 * attn_ext2 - * extrapolate(xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2, dx_ext2, dy_ext2, dz_ext2, dw_ext2); + value += attn_ext2 * attn_ext2 * extrapolate( + xsv_ext2, + ysv_ext2, + zsv_ext2, + wsv_ext2, + dx_ext2, + dy_ext2, + dz_ext2, + dw_ext2 + ); } - + return value / NORM_CONSTANT_4D; } - + private double extrapolate(int xsb, int ysb, double dx, double dy) { int index = perm[(perm[xsb & 0xFF] + ysb) & 0xFF] & 0x0E; return gradients2D[index] * dx + gradients2D[index + 1] * dy; } - + private double extrapolate(int xsb, int ysb, int zsb, double dx, double dy, double dz) { int index = permGradIndex3D[(perm[(perm[xsb & 0xFF] + ysb) & 0xFF] + zsb) & 0xFF]; return gradients3D[index] * dx + gradients3D[index + 1] * dy + gradients3D[index + 2] * dz; } - + private double extrapolate(int xsb, int ysb, int zsb, int wsb, double dx, double dy, double dz, double dw) { int index = perm[(perm[(perm[(perm[xsb & 0xFF] + ysb) & 0xFF] + zsb) & 0xFF] + wsb) & 0xFF] & 0xFC; - return gradients4D[index] * dx + gradients4D[index + 1] * dy + gradients4D[index + 2] * dz - + gradients4D[index + 3] * dw; + return gradients4D[index] * dx + gradients4D[index + 1] * dy + gradients4D[index + 2] * dz + gradients4D[index + 3] * dw; } - + private static int fastFloor(double x) { int xi = (int) x; return x < xi ? xi - 1 : xi; } - + // Gradients for 2D. They approximate the directions to the // vertices of an octagon from the center. - private static byte[] gradients2D = new byte[] { 5, 2, 2, 5, -5, 2, -2, 5, 5, -2, 2, -5, -5, -2, -2, -5, }; - + private static byte[] gradients2D = new byte[] {5, 2, 2, 5, -5, 2, -2, 5, 5, -2, 2, -5, -5, -2, -2, -5,}; + // Gradients for 3D. They approximate the directions to the // vertices of a rhombicuboctahedron from the center, skewed so // that the triangular and square facets can be inscribed inside // circles of the same radius. - private static byte[] gradients3D = new byte[] { -11, 4, 4, -4, 11, 4, -4, 4, 11, 11, 4, 4, 4, 11, 4, 4, 4, 11, -11, - -4, 4, -4, -11, 4, -4, -4, 11, 11, -4, 4, 4, -11, 4, 4, -4, 11, -11, 4, -4, -4, 11, -4, -4, 4, -11, 11, 4, - -4, 4, 11, -4, 4, 4, -11, -11, -4, -4, -4, -11, -4, -4, -4, -11, 11, -4, -4, 4, -11, -4, 4, -4, -11, }; - + private static byte[] gradients3D = new byte[] { + -11, + 4, + 4, + -4, + 11, + 4, + -4, + 4, + 11, + 11, + 4, + 4, + 4, + 11, + 4, + 4, + 4, + 11, + -11, + -4, + 4, + -4, + -11, + 4, + -4, + -4, + 11, + 11, + -4, + 4, + 4, + -11, + 4, + 4, + -4, + 11, + -11, + 4, + -4, + -4, + 11, + -4, + -4, + 4, + -11, + 11, + 4, + -4, + 4, + 11, + -4, + 4, + 4, + -11, + -11, + -4, + -4, + -4, + -11, + -4, + -4, + -4, + -11, + 11, + -4, + -4, + 4, + -11, + -4, + 4, + -4, + -11, + }; + // Gradients for 4D. They approximate the directions to the // vertices of a disprismatotesseractihexadecachoron from the center, // skewed so that the tetrahedral and cubic facets can be inscribed inside // spheres of the same radius. - private static byte[] gradients4D = new byte[] { 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, -3, 1, 1, 1, -1, 3, - 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, -3, -1, 1, 1, -1, -3, 1, - 1, -1, -1, 3, 1, -1, -1, 1, 3, 3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, -3, 1, -1, 1, -1, 3, -1, - 1, -1, 1, -3, 1, -1, 1, -1, 3, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, -3, -1, -1, 1, -1, - -3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3, 3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, -3, 1, 1, -1, - -1, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, 3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, -3, -1, 1, - -1, -1, -3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, -3, - 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, -1, 1, -1, - -1, -3, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, }; + private static byte[] gradients4D = new byte[] { + 3, + 1, + 1, + 1, + 1, + 3, + 1, + 1, + 1, + 1, + 3, + 1, + 1, + 1, + 1, + 3, + -3, + 1, + 1, + 1, + -1, + 3, + 1, + 1, + -1, + 1, + 3, + 1, + -1, + 1, + 1, + 3, + 3, + -1, + 1, + 1, + 1, + -3, + 1, + 1, + 1, + -1, + 3, + 1, + 1, + -1, + 1, + 3, + -3, + -1, + 1, + 1, + -1, + -3, + 1, + 1, + -1, + -1, + 3, + 1, + -1, + -1, + 1, + 3, + 3, + 1, + -1, + 1, + 1, + 3, + -1, + 1, + 1, + 1, + -3, + 1, + 1, + 1, + -1, + 3, + -3, + 1, + -1, + 1, + -1, + 3, + -1, + 1, + -1, + 1, + -3, + 1, + -1, + 1, + -1, + 3, + 3, + -1, + -1, + 1, + 1, + -3, + -1, + 1, + 1, + -1, + -3, + 1, + 1, + -1, + -1, + 3, + -3, + -1, + -1, + 1, + -1, + -3, + -1, + 1, + -1, + -1, + -3, + 1, + -1, + -1, + -1, + 3, + 3, + 1, + 1, + -1, + 1, + 3, + 1, + -1, + 1, + 1, + 3, + -1, + 1, + 1, + 1, + -3, + -3, + 1, + 1, + -1, + -1, + 3, + 1, + -1, + -1, + 1, + 3, + -1, + -1, + 1, + 1, + -3, + 3, + -1, + 1, + -1, + 1, + -3, + 1, + -1, + 1, + -1, + 3, + -1, + 1, + -1, + 1, + -3, + -3, + -1, + 1, + -1, + -1, + -3, + 1, + -1, + -1, + -1, + 3, + -1, + -1, + -1, + 1, + -3, + 3, + 1, + -1, + -1, + 1, + 3, + -1, + -1, + 1, + 1, + -3, + -1, + 1, + 1, + -1, + -3, + -3, + 1, + -1, + -1, + -1, + 3, + -1, + -1, + -1, + 1, + -3, + -1, + -1, + 1, + -1, + -3, + 3, + -1, + -1, + -1, + 1, + -3, + -1, + -1, + 1, + -1, + -3, + -1, + 1, + -1, + -1, + -3, + -3, + -1, + -1, + -1, + -1, + -3, + -1, + -1, + -1, + -1, + -3, + -1, + -1, + -1, + -1, + -3, + }; } \ No newline at end of file diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java index 64624178..80505a3e 100644 --- a/src/main/java/ru/betterend/particle/FireflyParticle.java +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -64,15 +64,15 @@ public class FireflyParticle extends SimpleAnimatedParticle { super.tick(); } - + @Environment(EnvType.CLIENT) public static class FireflyParticleFactory implements ParticleProvider { private final SpriteSet sprites; - + public FireflyParticleFactory(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new FireflyParticle(world, x, y, z, sprites, 1, 1, 1); diff --git a/src/main/java/ru/betterend/particle/InfusionParticle.java b/src/main/java/ru/betterend/particle/InfusionParticle.java index 8bdac965..35cc2cf8 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticle.java +++ b/src/main/java/ru/betterend/particle/InfusionParticle.java @@ -12,7 +12,7 @@ import net.minecraft.client.particle.TextureSheetParticle; public class InfusionParticle extends TextureSheetParticle { private final SpriteSet spriteProvider; - + public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteSet spriteProvider) { super(clientWorld, x, y, z, 0.0, 0.0, 0.0); this.setSpriteFromAge(spriteProvider); @@ -25,7 +25,7 @@ public class InfusionParticle extends TextureSheetParticle { this.lifetime = (int) (3.0F / (this.random.nextFloat() * 0.9F + 0.1F)); this.quadSize *= 0.9F; } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; @@ -38,7 +38,8 @@ public class InfusionParticle extends TextureSheetParticle { this.zo = this.z; if (this.age++ >= this.lifetime) { this.remove(); - } else { + } + else { this.setSpriteFromAge(spriteProvider); double velocityX = 2.0D * this.xd * this.random.nextDouble(); double velocityY = 3.0D * this.yd * this.random.nextDouble(); @@ -46,15 +47,15 @@ public class InfusionParticle extends TextureSheetParticle { this.move(velocityX, velocityY, velocityZ); } } - + @Environment(EnvType.CLIENT) public static class InfusionFactory implements ParticleProvider { private final SpriteSet spriteProvider; - + public InfusionFactory(SpriteSet spriteProvider) { this.spriteProvider = spriteProvider; } - + public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { return new InfusionParticle(clientWorld, d, e, f, g, h, i, particleType.getPalette(), this.spriteProvider); } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 672f3ab9..5370d4fa 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -3,7 +3,6 @@ package ru.betterend.particle; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.commands.arguments.item.ItemInput; @@ -17,26 +16,30 @@ import ru.bclib.util.ColorUtil; import ru.betterend.registry.EndParticles; public class InfusionParticleType extends ParticleType implements ParticleOptions { - public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> { - return new InfusionParticleType(EndParticles.INFUSION, itemStack); - }, infusionParticleType -> { - return infusionParticleType.itemStack; - }); + public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> new InfusionParticleType( + EndParticles.INFUSION, + itemStack + ), infusionParticleType -> infusionParticleType.itemStack); + + @SuppressWarnings("deprecation") public static final ParticleOptions.Deserializer PARAMETERS_FACTORY = new ParticleOptions.Deserializer() { public InfusionParticleType fromCommand(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { stringReader.expect(' '); ItemParser itemStringReader = new ItemParser(stringReader, false).parse(); - ItemStack itemStack = new ItemInput(itemStringReader.getItem(), itemStringReader.getNbt()).createItemStack(1, false); + ItemStack itemStack = new ItemInput( + itemStringReader.getItem(), + itemStringReader.getNbt() + ).createItemStack(1, false); return new InfusionParticleType(particleType, itemStack); } - + public InfusionParticleType fromNetwork(ParticleType particleType, FriendlyByteBuf packetByteBuf) { return new InfusionParticleType(particleType, packetByteBuf.readItem()); } }; - private ParticleType type; - private ItemStack itemStack; + private final ParticleType type; + private final ItemStack itemStack; public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); @@ -53,22 +56,22 @@ public class InfusionParticleType extends ParticleType imp int color = ColorUtil.extractColor(itemStack.getItem()); return ColorUtil.toFloatArray(color); } - + @Override public ParticleType getType() { return this.type; } - + @Override public void writeToNetwork(FriendlyByteBuf buffer) { buffer.writeItem(itemStack); } - + @Override public String writeToString() { return Registry.PARTICLE_TYPE.getKey(this).toString(); } - + @Override public Codec codec() { return CODEC; diff --git a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java index 9278a0c7..dee3e30b 100644 --- a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java @@ -74,16 +74,16 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class FactoryBlackSpore implements ParticleProvider { - + private final SpriteSet sprites; - + public FactoryBlackSpore(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleBlackSpore(world, x, y, z, 1, 1, 1, sprites); diff --git a/src/main/java/ru/betterend/particle/ParticleGeyser.java b/src/main/java/ru/betterend/particle/ParticleGeyser.java index 4c7cb531..6da20d09 100644 --- a/src/main/java/ru/betterend/particle/ParticleGeyser.java +++ b/src/main/java/ru/betterend/particle/ParticleGeyser.java @@ -61,16 +61,16 @@ public class ParticleGeyser extends TextureSheetParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class FactoryGeyser implements ParticleProvider { - + private final SpriteSet sprites; - + public FactoryGeyser(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGeyser(world, x, y, z, 0, 0.125, 0, sprites); diff --git a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java index 8edea37a..c4f1d349 100644 --- a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java +++ b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java @@ -40,7 +40,7 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { @Override public void tick() { - ticks ++; + ticks++; if (ticks > 30) { preVX = nextVX; preVY = nextVY; @@ -58,16 +58,16 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { super.tick(); } - + @Environment(EnvType.CLIENT) public static class FactoryGlowingSphere implements ParticleProvider { - + private final SpriteSet sprites; - + public FactoryGlowingSphere(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleGlowingSphere(world, x, y, z, sprites, 1, 1, 1); diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 25e3e916..0488b778 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -53,15 +53,15 @@ public class ParticleJungleSpore extends SimpleAnimatedParticle { this.xd *= 0.99F; this.zd *= 0.99F; } - + @Environment(EnvType.CLIENT) public static class FactoryJungleSpore implements ParticleProvider { private final SpriteSet sprites; - + public FactoryJungleSpore(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleJungleSpore(world, x, y, z, sprites, 1, 1, 1); diff --git a/src/main/java/ru/betterend/particle/ParticleSnowflake.java b/src/main/java/ru/betterend/particle/ParticleSnowflake.java index e5f2d921..bcc46243 100644 --- a/src/main/java/ru/betterend/particle/ParticleSnowflake.java +++ b/src/main/java/ru/betterend/particle/ParticleSnowflake.java @@ -41,7 +41,7 @@ public class ParticleSnowflake extends TextureSheetParticle { @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -78,16 +78,16 @@ public class ParticleSnowflake extends TextureSheetParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class FactorySnowflake implements ParticleProvider { - + private final SpriteSet sprites; - + public FactorySnowflake(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSnowflake(world, x, y, z, 1, 1, 1, sprites); diff --git a/src/main/java/ru/betterend/particle/ParticleSulphur.java b/src/main/java/ru/betterend/particle/ParticleSulphur.java index 049dbe97..1cb57527 100644 --- a/src/main/java/ru/betterend/particle/ParticleSulphur.java +++ b/src/main/java/ru/betterend/particle/ParticleSulphur.java @@ -42,7 +42,7 @@ public class ParticleSulphur extends TextureSheetParticle { @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -79,16 +79,16 @@ public class ParticleSulphur extends TextureSheetParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class FactorySulphur implements ParticleProvider { - + private final SpriteSet sprites; - + public FactorySulphur(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleSulphur(world, x, y, z, 1, 1, 1, sprites); diff --git a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java index 7bcb882d..b0ca71f3 100644 --- a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java +++ b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java @@ -12,7 +12,7 @@ import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.util.Mth; -import ru.bclib.interfaces.IColorProvider; +import ru.bclib.interfaces.CustomColorProvider; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; @@ -32,7 +32,7 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { pickSprite(sprites); if (provider == null) { - IColorProvider block = (IColorProvider) EndBlocks.TENANEA_FLOWERS; + CustomColorProvider block = (CustomColorProvider) EndBlocks.TENANEA_FLOWERS; provider = block.getProvider(); } int color = provider.getColor(null, null, new BlockPos(x, y, z), 0); @@ -52,7 +52,7 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { nextVY = -random.nextDouble() * 0.02 - 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public int getLightColor(float tint) { return 15728880; @@ -93,16 +93,16 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class FactoryTenaneaPetal implements ParticleProvider { - + private final SpriteSet sprites; - + public FactoryTenaneaPetal(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new ParticleTenaneaPetal(world, x, y, z, 1, 1, 1, sprites); diff --git a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java index 1d0afdd7..76ba79f2 100644 --- a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java +++ b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java @@ -58,16 +58,16 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { super.tick(); } - + @Environment(EnvType.CLIENT) public static class FactoryPortalSphere implements ParticleProvider { - + private final SpriteSet sprites; - + public FactoryPortalSphere(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new PaticlePortalSphere(world, x, y, z, sprites); diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java index 38a3ad71..946bca07 100644 --- a/src/main/java/ru/betterend/particle/SmaragdantParticle.java +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -74,16 +74,16 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Environment(EnvType.CLIENT) public static class SmaragdantParticleFactory implements ParticleProvider { - + private final SpriteSet sprites; - + public SmaragdantParticleFactory(SpriteSet sprites) { this.sprites = sprites; } - + @Override public Particle createParticle(SimpleParticleType type, ClientLevel world, double x, double y, double z, double vX, double vY, double vZ) { return new SmaragdantParticle(world, x, y, z, 1, 1, 1, sprites); diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 9d6dfc88..ea228cf6 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -5,42 +5,48 @@ import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; public class AlloyingRecipes { public static void register() { AlloyingRecipe.Builder.create("additional_iron") - .setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) - .setOutput(Items.IRON_INGOT, 3) - .setExpiriense(2.1F) - .build(); + .setInput(EndTags.ALLOYING_IRON, EndTags.ALLOYING_IRON) + .setOutput(Items.IRON_INGOT, 3) + .setExpiriense(2.1F) + .build(); AlloyingRecipe.Builder.create("additional_gold") - .setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) - .setOutput(Items.GOLD_INGOT, 3) - .setExpiriense(3F) - .build(); + .setInput(EndTags.ALLOYING_GOLD, EndTags.ALLOYING_GOLD) + .setOutput(Items.GOLD_INGOT, 3) + .setExpiriense(3F) + .build(); + AlloyingRecipe.Builder.create("additional_copper") + .setInput(EndTags.ALLOYING_COPPER, EndTags.ALLOYING_COPPER) + .setOutput(Items.COPPER_INGOT, 3) + .setExpiriense(3F) + .build(); AlloyingRecipe.Builder.create("additional_netherite") - .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) - .setOutput(Items.NETHERITE_SCRAP, 3) - .setExpiriense(6F) - .setSmeltTime(1000) - .build(); + .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) + .setOutput(Items.NETHERITE_SCRAP, 3) + .setExpiriense(6F) + .setSmeltTime(1000) + .build(); AlloyingRecipe.Builder.create("terminite_ingot") - .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); + .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); AlloyingRecipe.Builder.create("aeternium_ingot") - .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) - .setOutput(EndItems.AETERNIUM_INGOT, 1) - .setExpiriense(4.5F) - .setSmeltTime(850) - .build(); + .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) + .setOutput(EndItems.AETERNIUM_INGOT, 1) + .setExpiriense(4.5F) + .setSmeltTime(850) + .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") - .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index c6c09ead..55bc83d4 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -1,74 +1,84 @@ package ru.betterend.recipe; import net.minecraft.world.item.Items; +import ru.bclib.recipes.AnvilRecipe; +import ru.betterend.config.Configs; import ru.betterend.item.material.EndToolMaterial; -import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.registry.EndItems; public class AnvilRecipes { public static void register() { - AnvilRecipe.Builder.create("ender_pearl_to_dust") - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(4) - .setDamage(5) - .build(); - AnvilRecipe.Builder.create("ender_shard_to_dust") - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(0) - .setDamage(3) - .build(); - + AnvilRecipe.create("ender_pearl_to_dust") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(4) + .setDamage(5) + .build(); + AnvilRecipe.create("ender_shard_to_dust") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(0) + .setDamage(3) + .build(); + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); - AnvilRecipe.Builder.create("aeternium_axe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_pickaxe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_shovel_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_hoe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_hammer_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_sword_blade") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); - AnvilRecipe.Builder.create("aeternium_forged_plate") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_FORGED_PLATE) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + AnvilRecipe.create("aeternium_axe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_pickaxe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_shovel_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_hoe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_hammer_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(EndToolMaterial.THALLASIUM.getLevel()) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_sword_blade") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_forged_plate") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_FORGED_PLATE) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 121b2aeb..559dcfc9 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -15,69 +15,132 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class CraftingRecipes { - + public static void register() { GridRecipe.make(BetterEnd.MOD_ID, "ender_perl_to_block", EndBlocks.ENDER_BLOCK) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("OO", "OO") - .addMaterial('O', Items.ENDER_PEARL) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("OO", "OO") + .addMaterial('O', Items.ENDER_PEARL) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "ender_block_to_perl", Items.ENDER_PEARL) - .checkConfig(Configs.RECIPE_CONFIG) - .addMaterial('#', EndBlocks.ENDER_BLOCK) - .setOutputCount(4) - .setList("#") - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .addMaterial('#', EndBlocks.ENDER_BLOCK) + .setOutputCount(4) + .setList("#") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "end_stone_smelter", EndBlocks.END_STONE_SMELTER) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("T#T", "V V", "T#T") - .addMaterial('#', Blocks.END_STONE_BRICKS) - .addMaterial('T', EndBlocks.THALLASIUM.ingot) - .addMaterial('V', TagAPI.FURNACES) - .build(); - - registerPedestal("andesite_pedestal", EndBlocks.ANDESITE_PEDESTAL, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE); - registerPedestal("diorite_pedestal", EndBlocks.DIORITE_PEDESTAL, Blocks.POLISHED_DIORITE_SLAB, Blocks.POLISHED_DIORITE); - registerPedestal("granite_pedestal", EndBlocks.GRANITE_PEDESTAL, Blocks.POLISHED_GRANITE_SLAB, Blocks.POLISHED_GRANITE); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("T#T", "V V", "T#T") + .addMaterial('#', Blocks.END_STONE_BRICKS) + .addMaterial('T', EndBlocks.THALLASIUM.ingot) + .addMaterial('V', TagAPI.ITEM_FURNACES) + .build(); + + registerPedestal( + "andesite_pedestal", + EndBlocks.ANDESITE_PEDESTAL, + Blocks.POLISHED_ANDESITE_SLAB, + Blocks.POLISHED_ANDESITE + ); + registerPedestal( + "diorite_pedestal", + EndBlocks.DIORITE_PEDESTAL, + Blocks.POLISHED_DIORITE_SLAB, + Blocks.POLISHED_DIORITE + ); + registerPedestal( + "granite_pedestal", + EndBlocks.GRANITE_PEDESTAL, + Blocks.POLISHED_GRANITE_SLAB, + Blocks.POLISHED_GRANITE + ); registerPedestal("quartz_pedestal", EndBlocks.QUARTZ_PEDESTAL, Blocks.QUARTZ_SLAB, Blocks.QUARTZ_PILLAR); registerPedestal("purpur_pedestal", EndBlocks.PURPUR_PEDESTAL, Blocks.PURPUR_SLAB, Blocks.PURPUR_PILLAR); - + GridRecipe.make(BetterEnd.MOD_ID, "infusion_pedestal", EndBlocks.INFUSION_PEDESTAL) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape(" Y ", "O#O", " # ") - .addMaterial('O', Items.ENDER_PEARL) - .addMaterial('Y', Items.ENDER_EYE) - .addMaterial('#', Blocks.OBSIDIAN) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setShape(" Y ", "O#O", " # ") + .addMaterial('O', Items.ENDER_PEARL) + .addMaterial('Y', Items.ENDER_EYE) + .addMaterial('#', Blocks.OBSIDIAN) + .build(); + String material = "aeternium"; GridRecipe.make(BetterEnd.MOD_ID, material + "_block", EndBlocks.AETERNIUM_BLOCK) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("III", "III", "III") - .addMaterial('I', EndItems.AETERNIUM_INGOT) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("III", "III", "III") + .addMaterial('I', EndItems.AETERNIUM_INGOT) + .build(); GridRecipe.make(BetterEnd.MOD_ID, material + "_block_to_ingot", EndItems.AETERNIUM_INGOT) - .checkConfig(Configs.RECIPE_CONFIG) - .addMaterial('#', EndBlocks.AETERNIUM_BLOCK) - .setOutputCount(9) - .setList("#") - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "blue_vine_seed_dye", Items.BLUE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.BLUE_VINE_SEED).build(); - GridRecipe.make(BetterEnd.MOD_ID, "creeping_moss_dye", Items.CYAN_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CREEPING_MOSS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "umbrella_moss_dye", Items.YELLOW_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "umbrella_moss_tall_dye", Items.YELLOW_DYE).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL).build(); - GridRecipe.make(BetterEnd.MOD_ID, "shadow_plant_dye", Items.BLACK_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.SHADOW_PLANT).build(); - - GridRecipe.make(BetterEnd.MOD_ID, "paper", Items.PAPER).checkConfig(Configs.RECIPE_CONFIG).setShape("###").addMaterial('#', EndItems.END_LILY_LEAF_DRIED).setOutputCount(3).build(); - - GridRecipe.make(BetterEnd.MOD_ID, "aurora_block", EndBlocks.AURORA_CRYSTAL).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndItems.CRYSTAL_SHARDS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "lotus_block", EndBlocks.END_LOTUS.log).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndBlocks.END_LOTUS_STEM).build(); - GridRecipe.make(BetterEnd.MOD_ID, "needlegrass_stick", Items.STICK).setList("#").checkConfig(Configs.RECIPE_CONFIG).setOutputCount(2).addMaterial('#', EndBlocks.NEEDLEGRASS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "shadow_berry_seeds", EndBlocks.SHADOW_BERRY).checkConfig(Configs.RECIPE_CONFIG).setList("#").setOutputCount(4).addMaterial('#', EndItems.SHADOW_BERRY_RAW).build(); - GridRecipe.make(BetterEnd.MOD_ID, "purple_polypore_dye", Items.PURPLE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.PURPLE_POLYPORE).build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .addMaterial('#', EndBlocks.AETERNIUM_BLOCK) + .setOutputCount(9) + .setList("#") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "blue_vine_seed_dye", Items.BLUE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.BLUE_VINE_SEED) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "creeping_moss_dye", Items.CYAN_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CREEPING_MOSS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "umbrella_moss_dye", Items.YELLOW_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.UMBRELLA_MOSS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "umbrella_moss_tall_dye", Items.YELLOW_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(2) + .setList("#") + .addMaterial('#', EndBlocks.UMBRELLA_MOSS_TALL) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "shadow_plant_dye", Items.BLACK_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.SHADOW_PLANT) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "paper", Items.PAPER) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###") + .addMaterial('#', EndItems.END_LILY_LEAF_DRIED) + .setOutputCount(3) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "aurora_block", EndBlocks.AURORA_CRYSTAL) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndItems.CRYSTAL_SHARDS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "lotus_block", EndBlocks.END_LOTUS.getLog()) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndBlocks.END_LOTUS_STEM) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "needlegrass_stick", Items.STICK) + .setList("#") + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(2) + .addMaterial('#', EndBlocks.NEEDLEGRASS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "shadow_berry_seeds", EndBlocks.SHADOW_BERRY) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .setOutputCount(4) + .addMaterial('#', EndItems.SHADOW_BERRY_RAW) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "purple_polypore_dye", Items.PURPLE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.PURPLE_POLYPORE) + .build(); + registerLantern("end_stone_lantern", EndBlocks.END_STONE_LANTERN, Blocks.END_STONE_BRICK_SLAB); registerLantern("andesite_lantern", EndBlocks.ANDESITE_LANTERN, Blocks.ANDESITE_SLAB); registerLantern("diorite_lantern", EndBlocks.DIORITE_LANTERN, Blocks.DIORITE_SLAB); @@ -85,171 +148,336 @@ public class CraftingRecipes { registerLantern("quartz_lantern", EndBlocks.QUARTZ_LANTERN, Blocks.QUARTZ_SLAB); registerLantern("purpur_lantern", EndBlocks.PURPUR_LANTERN, Blocks.PURPUR_SLAB); registerLantern("blackstone_lantern", EndBlocks.BLACKSTONE_LANTERN, Blocks.BLACKSTONE_SLAB); - - GridRecipe.make(BetterEnd.MOD_ID, "amber_gem", EndItems.AMBER_GEM).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndItems.RAW_AMBER).build(); - GridRecipe.make(BetterEnd.MOD_ID, "amber_block", EndBlocks.AMBER_BLOCK).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndItems.AMBER_GEM).build(); - GridRecipe.make(BetterEnd.MOD_ID, "amber_gem_block", EndItems.AMBER_GEM).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setList("#").addMaterial('#', EndBlocks.AMBER_BLOCK).build(); - GridRecipe.make(BetterEnd.MOD_ID, "iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN).checkConfig(Configs.RECIPE_CONFIG).setShape("C", "I", "#").addMaterial('C', Items.CHAIN).addMaterial('I', Items.IRON_INGOT) - .addMaterial('#', EndItems.GLOWING_BULB).build(); - GridRecipe.make(BetterEnd.MOD_ID, "twisted_moss_dye", Items.PINK_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.TWISTED_MOSS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "byshy_grass_dye", Items.MAGENTA_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.BUSHY_GRASS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "tail_moss_dye", Items.GRAY_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.TAIL_MOSS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); - GridRecipe.make(BetterEnd.MOD_ID, "petal_white_dye", Items.WHITE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndItems.HYDRALUX_PETAL).build(); - + + GridRecipe.make(BetterEnd.MOD_ID, "amber_gem", EndItems.AMBER_GEM) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndItems.RAW_AMBER) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "amber_block", EndBlocks.AMBER_BLOCK) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndItems.AMBER_GEM) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "amber_gem_block", EndItems.AMBER_GEM) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setList("#") + .addMaterial('#', EndBlocks.AMBER_BLOCK) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "iron_bulb_lantern", EndBlocks.IRON_BULB_LANTERN) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("C", "I", "#") + .addMaterial('C', Items.CHAIN) + .addMaterial('I', Items.IRON_INGOT) + .addMaterial('#', EndItems.GLOWING_BULB) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "twisted_moss_dye", Items.PINK_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.TWISTED_MOSS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "byshy_grass_dye", Items.MAGENTA_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.BUSHY_GRASS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "tail_moss_dye", Items.GRAY_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.TAIL_MOSS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "petal_block", EndBlocks.HYDRALUX_PETAL_BLOCK) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndItems.HYDRALUX_PETAL) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "petal_white_dye", Items.WHITE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndItems.HYDRALUX_PETAL) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "sweet_berry_jelly", EndItems.SWEET_BERRY_JELLY) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR).addMaterial('B', Items.SWEET_BERRIES) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR) + .addMaterial('B', Items.SWEET_BERRIES) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "shadow_berry_jelly", EndItems.SHADOW_BERRY_JELLY) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR) - .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR) + .addMaterial('B', EndItems.SHADOW_BERRY_COOKED) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "shadow_berry_jelly", EndItems.BLOSSOM_BERRY_JELLY) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("JWSB") - .addMaterial('J', EndItems.GELATINE) - .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) - .addMaterial('S', Items.SUGAR) - .addMaterial('B', EndItems.BLOSSOM_BERRY) - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "sulphur_gunpowder", Items.GUNPOWDER).checkConfig(Configs.RECIPE_CONFIG).setList("SCB").addMaterial('S', EndItems.CRYSTALLINE_SULPHUR).addMaterial('C', Items.COAL, Items.CHARCOAL) - .addMaterial('B', Items.BONE_MEAL).build(); - - GridRecipe.make(BetterEnd.MOD_ID, "dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndBlocks.EMERALD_ICE).build(); - GridRecipe.make(BetterEnd.MOD_ID, "ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', EndBlocks.DENSE_EMERALD_ICE).build(); - - GridRecipe.make(BetterEnd.MOD_ID, "charnia_cyan_dye", Items.CYAN_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_CYAN).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charnia_green_dye", Items.GREEN_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_GREEN).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charnia_light_blue_dye", Items.LIGHT_BLUE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charnia_orange_dye", Items.ORANGE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_ORANGE).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charnia_purple_dye", Items.PURPLE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_PURPLE).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charnia_red_dye", Items.RED_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.CHARNIA_RED).build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setList("JWSB") + .addMaterial('J', EndItems.GELATINE) + .addMaterial('W', PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER)) + .addMaterial('S', Items.SUGAR) + .addMaterial('B', EndItems.BLOSSOM_BERRY) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "sulphur_gunpowder", Items.GUNPOWDER) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("SCB") + .addMaterial('S', EndItems.CRYSTALLINE_SULPHUR) + .addMaterial('C', Items.COAL, Items.CHARCOAL) + .addMaterial('B', Items.BONE_MEAL) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "dense_emerald_ice", EndBlocks.DENSE_EMERALD_ICE) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndBlocks.EMERALD_ICE) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "ancient_emerald_ice", EndBlocks.ANCIENT_EMERALD_ICE) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', EndBlocks.DENSE_EMERALD_ICE) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "charnia_cyan_dye", Items.CYAN_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_CYAN) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charnia_green_dye", Items.GREEN_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_GREEN) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charnia_light_blue_dye", Items.LIGHT_BLUE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_LIGHT_BLUE) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charnia_orange_dye", Items.ORANGE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_ORANGE) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charnia_purple_dye", Items.PURPLE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_PURPLE) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charnia_red_dye", Items.RED_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.CHARNIA_RED) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "respawn_obelisk", EndBlocks.RESPAWN_OBELISK) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("CSC", "CSC", "AAA") - .addMaterial('C', EndBlocks.AURORA_CRYSTAL) - .addMaterial('S', EndItems.ETERNAL_CRYSTAL) - .addMaterial('A', EndBlocks.AMBER_BLOCK) - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "twisted_umbrella_moss_dye", Items.PURPLE_DYE).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(2).setList("#").addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL).build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("CSC", "CSC", "AAA") + .addMaterial('C', EndBlocks.AURORA_CRYSTAL) + .addMaterial('S', EndItems.ETERNAL_CRYSTAL) + .addMaterial('A', EndBlocks.AMBER_BLOCK) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "twisted_umbrella_moss_dye", Items.PURPLE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("#") + .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "twisted_umbrella_moss_dye_tall", Items.PURPLE_DYE) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(2) + .setList("#") + .addMaterial('#', EndBlocks.TWISTED_UMBRELLA_MOSS_TALL) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "leather_to_stripes", EndItems.LEATHER_STRIPE) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("L") - .addMaterial('L', Items.LEATHER) - .setOutputCount(3) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setList("L") + .addMaterial('L', Items.LEATHER) + .setOutputCount(3) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "stripes_to_leather", Items.LEATHER) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("SSS") - .addMaterial('S', EndItems.LEATHER_STRIPE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setList("SSS") + .addMaterial('S', EndItems.LEATHER_STRIPE) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "leather_wrapped_stick", EndItems.LEATHER_WRAPPED_STICK) - .checkConfig(Configs.RECIPE_CONFIG) - .setList("SL") - .addMaterial('S', Items.STICK) - .addMaterial('L', EndItems.LEATHER_STRIPE) - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "fiber_string", Items.STRING).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setList("SL") + .addMaterial('S', Items.STICK) + .addMaterial('L', EndItems.LEATHER_STRIPE) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "fiber_string", Items.STRING) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("#", "#", "#") + .addMaterial('#', EndItems.SILK_FIBER) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "ender_eye_amber", Items.ENDER_EYE) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("SAS", "APA", "SAS") - .addMaterial('S', EndItems.CRYSTAL_SHARDS) - .addMaterial('A', EndItems.AMBER_GEM) - .addMaterial('P', Items.ENDER_PEARL) - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "iron_chandelier", EndBlocks.IRON_CHANDELIER).checkConfig(Configs.RECIPE_CONFIG).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) - .setGroup("end_metal_chandelier").build(); - GridRecipe.make(BetterEnd.MOD_ID, "gold_chandelier", EndBlocks.GOLD_CHANDELIER).checkConfig(Configs.RECIPE_CONFIG).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD) - .setGroup("end_metal_chandelier").build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "iron_chandelier", EndBlocks.IRON_CHANDELIER) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("I#I", " # ") + .addMaterial('#', Items.IRON_INGOT) + .addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "gold_chandelier", EndBlocks.GOLD_CHANDELIER) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("I#I", " # ") + .addMaterial('#', Items.GOLD_INGOT) + .addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "missing_tile", EndBlocks.MISSING_TILE) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(4) - .setShape("#P", "P#") - .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) - .addMaterial('P', Blocks.PURPUR_BLOCK) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); + registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); - - GridRecipe.make(BetterEnd.MOD_ID, "charcoal_block", EndBlocks.CHARCOAL_BLOCK).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); - GridRecipe.make(BetterEnd.MOD_ID, "charcoal_from_block", Items.CHARCOAL).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(9).setList("#").addMaterial('#', EndBlocks.CHARCOAL_BLOCK).build(); - GridRecipe.make(BetterEnd.MOD_ID, "end_stone_furnace", EndBlocks.END_STONE_FURNACE).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); - GridRecipe.make(BetterEnd.MOD_ID, "filalux_lantern", EndBlocks.FILALUX_LANTERN).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); - + + GridRecipe.make(BetterEnd.MOD_ID, "charcoal_block", EndBlocks.CHARCOAL_BLOCK) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', Items.CHARCOAL) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "charcoal_from_block", Items.CHARCOAL) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(9) + .setList("#") + .addMaterial('#', EndBlocks.CHARCOAL_BLOCK) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "end_stone_furnace", EndBlocks.END_STONE_FURNACE) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #", "###") + .addMaterial('#', Blocks.END_STONE) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "filalux_lantern", EndBlocks.FILALUX_LANTERN) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', EndBlocks.FILALUX) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "silk_moth_hive", EndBlocks.SILK_MOTH_HIVE) - .checkConfig(Configs.RECIPE_CONFIG).setShape("#L#", "LML", "#L#") - .addMaterial('#', EndBlocks.TENANEA.planks) - .addMaterial('L', EndBlocks.TENANEA_LEAVES) - .addMaterial('M', EndItems.SILK_MOTH_MATRIX) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("#L#", "LML", "#L#") + .addMaterial('#', EndBlocks.TENANEA.getBlock("planks")) + .addMaterial('L', EndBlocks.TENANEA_LEAVES) + .addMaterial('M', EndItems.SILK_MOTH_MATRIX) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("SBS", "BPB", "SBS") - .addMaterial('P', EndBlocks.CAVE_PUMPKIN) - .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).addMaterial('S', Items.SUGAR).build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("SBS", "BPB", "SBS") + .addMaterial('P', EndBlocks.CAVE_PUMPKIN) + .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW) + .addMaterial('S', Items.SUGAR) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(4) - .setList("#") - .addMaterial('#', EndBlocks.CAVE_PUMPKIN) - .build(); - - GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndBlocks.NEON_CACTUS).build(); - GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB).checkConfig(Configs.RECIPE_CONFIG).setShape("###").setOutputCount(6).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); - GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block_stairs", EndBlocks.NEON_CACTUS_BLOCK_STAIRS).checkConfig(Configs.RECIPE_CONFIG).setShape("# ", "## ", "###").setOutputCount(4).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); - - GridRecipe.make(BetterEnd.MOD_ID, "sugar_from_root", Items.SUGAR).checkConfig(Configs.RECIPE_CONFIG).setList("###").addMaterial('#', EndItems.AMBER_ROOT_RAW).build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setList("#") + .addMaterial('#', EndBlocks.CAVE_PUMPKIN) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', EndBlocks.NEON_CACTUS) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###") + .setOutputCount(6) + .addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block_stairs", EndBlocks.NEON_CACTUS_BLOCK_STAIRS) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# ", "## ", "###") + .setOutputCount(4) + .addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK) + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "sugar_from_root", Items.SUGAR) + .checkConfig(Configs.RECIPE_CONFIG) + .setList("###") + .addMaterial('#', EndItems.AMBER_ROOT_RAW) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "endstone_flower_pot", EndBlocks.ENDSTONE_FLOWER_POT) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(3) + .setShape("# #", " # ") + .addMaterial('#', Blocks.END_STONE_BRICKS) + .setGroup("end_pots") + .build(); + + GridRecipe.make(BetterEnd.MOD_ID, "dragon_bone_block", EndBlocks.DRAGON_BONE_BLOCK) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(8) + .setShape("###", "#D#", "###") + .addMaterial('#', Blocks.BONE_BLOCK) + .addMaterial('D', Items.DRAGON_BREATH) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "dragon_bone_slab", EndBlocks.DRAGON_BONE_SLAB) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###") + .setOutputCount(6) + .addMaterial('#', EndBlocks.DRAGON_BONE_BLOCK) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "dragon_bone_stairs", EndBlocks.DRAGON_BONE_STAIRS) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# ", "## ", "###") + .setOutputCount(4) + .addMaterial('#', EndBlocks.DRAGON_BONE_BLOCK) + .build(); } - + private static void registerLantern(String name, Block lantern, Block slab) { GridRecipe.make(BetterEnd.MOD_ID, name, lantern) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("S", "#", "S") - .addMaterial('#', EndItems.CRYSTAL_SHARDS) - .addMaterial('S', slab) - .setGroup("end_stone_lanterns") - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("S", "#", "S") + .addMaterial('#', EndItems.CRYSTAL_SHARDS) + .addMaterial('S', slab) + .setGroup("end_stone_lanterns") + .build(); } - + public static void registerPedestal(String name, Block pedestal, Block slab, Block pillar) { GridRecipe.make(BetterEnd.MOD_ID, name, pedestal) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("S", "#", "S") - .addMaterial('S', slab) - .addMaterial('#', pillar) - .setOutputCount(2) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("S", "#", "S") + .addMaterial('S', slab) + .addMaterial('#', pillar) + .setOutputCount(2) + .build(); } - + private static void registerHammer(String name, Item material, Item result) { GridRecipe.make(BetterEnd.MOD_ID, name + "_hammer", result) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("I I", "I#I", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("I I", "I#I", " # ") + .addMaterial('I', material) + .addMaterial('#', Items.STICK) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java index 635826d6..0b3446bd 100644 --- a/src/main/java/ru/betterend/recipe/FurnaceRecipes.java +++ b/src/main/java/ru/betterend/recipe/FurnaceRecipes.java @@ -10,13 +10,35 @@ import ru.betterend.registry.EndItems; public class FurnaceRecipes { public static void register() { - FurnaceRecipe.make(BetterEnd.MOD_ID, "end_lily_leaf_dried", EndItems.END_LILY_LEAF, EndItems.END_LILY_LEAF_DRIED).checkConfig(Configs.RECIPE_CONFIG).build(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS).checkConfig(Configs.RECIPE_CONFIG).build(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).checkConfig(Configs.RECIPE_CONFIG).buildFoodlike(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).checkConfig(Configs.RECIPE_CONFIG).buildFoodlike(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL).checkConfig(Configs.RECIPE_CONFIG).build(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE).checkConfig(Configs.RECIPE_CONFIG).build(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "chorus_mushroom", EndItems.CHORUS_MUSHROOM_RAW, EndItems.CHORUS_MUSHROOM_COOKED).checkConfig(Configs.RECIPE_CONFIG).buildFoodlike(); - FurnaceRecipe.make(BetterEnd.MOD_ID, "bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED).checkConfig(Configs.RECIPE_CONFIG).buildFoodlike(); + FurnaceRecipe.make( + BetterEnd.MOD_ID, + "end_lily_leaf_dried", + EndItems.END_LILY_LEAF, + EndItems.END_LILY_LEAF_DRIED + ).checkConfig(Configs.RECIPE_CONFIG).build(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS) + .checkConfig(Configs.RECIPE_CONFIG) + .build(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED) + .checkConfig(Configs.RECIPE_CONFIG) + .buildFoodlike(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED) + .checkConfig(Configs.RECIPE_CONFIG) + .buildFoodlike(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "slime_ball", EndBlocks.JELLYSHROOM_CAP_PURPLE, Items.SLIME_BALL) + .checkConfig(Configs.RECIPE_CONFIG) + .build(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "menger_sponge", EndBlocks.MENGER_SPONGE_WET, EndBlocks.MENGER_SPONGE) + .checkConfig(Configs.RECIPE_CONFIG) + .build(); + FurnaceRecipe.make( + BetterEnd.MOD_ID, + "chorus_mushroom", + EndItems.CHORUS_MUSHROOM_RAW, + EndItems.CHORUS_MUSHROOM_COOKED + ).checkConfig(Configs.RECIPE_CONFIG).buildFoodlike(); + FurnaceRecipe.make(BetterEnd.MOD_ID, "bolux_mushroom", EndBlocks.BOLUX_MUSHROOM, EndItems.BOLUX_MUSHROOM_COOKED) + .checkConfig(Configs.RECIPE_CONFIG) + .buildFoodlike(); } } diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index b4de0b54..93ce4fce 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -14,596 +14,596 @@ import ru.betterend.registry.EndItems; public class InfusionRecipes { public static void register() { InfusionRecipe.Builder.create("runed_flavolite") - .setInput(EndBlocks.FLAVOLITE.polished) - .setOutput(EndBlocks.FLAVOLITE_RUNED) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(100) - .build(); + .setInput(EndBlocks.FLAVOLITE.polished) + .setOutput(EndBlocks.FLAVOLITE_RUNED) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(100) + .build(); InfusionRecipe.Builder.create("eternal_crystal") - .setInput(Items.END_CRYSTAL) - .setOutput(EndItems.ETERNAL_CRYSTAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .addCatalyst(1, EndItems.ENDER_SHARD) - .addCatalyst(3, EndItems.ENDER_SHARD) - .addCatalyst(5, EndItems.ENDER_SHARD) - .addCatalyst(7, EndItems.ENDER_SHARD) - .setTime(250) - .build(); + .setInput(Items.END_CRYSTAL) + .setOutput(EndItems.ETERNAL_CRYSTAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .addCatalyst(1, EndItems.ENDER_SHARD) + .addCatalyst(3, EndItems.ENDER_SHARD) + .addCatalyst(5, EndItems.ENDER_SHARD) + .addCatalyst(7, EndItems.ENDER_SHARD) + .setTime(250) + .build(); InfusionRecipe.Builder.create("crystalite_helmet") - .setInput(EndBlocks.TERMINITE.helmet) - .setOutput(EndItems.CRYSTALITE_HELMET) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); + .setInput(EndBlocks.TERMINITE.helmet) + .setOutput(EndItems.CRYSTALITE_HELMET) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); InfusionRecipe.Builder.create("crystalite_chestplate") - .setInput(EndBlocks.TERMINITE.chestplate) - .setOutput(EndItems.CRYSTALITE_CHESTPLATE) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS) - .addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS) - .addCatalyst(7, EndItems.CRYSTAL_SHARDS) - .setTime(300) - .build(); + .setInput(EndBlocks.TERMINITE.chestplate) + .setOutput(EndItems.CRYSTALITE_CHESTPLATE) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS) + .addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS) + .addCatalyst(7, EndItems.CRYSTAL_SHARDS) + .setTime(300) + .build(); InfusionRecipe.Builder.create("crystalite_leggings") - .setInput(EndBlocks.TERMINITE.leggings) - .setOutput(EndItems.CRYSTALITE_LEGGINGS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(225) - .build(); + .setInput(EndBlocks.TERMINITE.leggings) + .setOutput(EndItems.CRYSTALITE_LEGGINGS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(225) + .build(); InfusionRecipe.Builder.create("crystalite_boots") - .setInput(EndBlocks.TERMINITE.boots) - .setOutput(EndItems.CRYSTALITE_BOOTS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); - + .setInput(EndBlocks.TERMINITE.boots) + .setOutput(EndItems.CRYSTALITE_BOOTS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); + InfusionRecipe.Builder.create("crystalite_elytra") - .setInput(Items.ELYTRA) - .setOutput(EndItems.CRYSTALITE_ELYTRA) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(7, EndItems.CRYSTAL_SHARDS) - .setTime(500) - .build(); + .setInput(Items.ELYTRA) + .setOutput(EndItems.CRYSTALITE_ELYTRA) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(7, EndItems.CRYSTAL_SHARDS) + .setTime(500) + .build(); InfusionRecipe.Builder.create("enchanted_petal") - .setInput(EndItems.HYDRALUX_PETAL) - .setOutput(EndItems.ENCHANTED_PETAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(75) - .build(); + .setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); InfusionRecipe.Builder.create("enchanted_membrane") - .setInput(Items.PHANTOM_MEMBRANE) - .setOutput(EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(75) - .build(); - + .setInput(Items.PHANTOM_MEMBRANE) + .setOutput(EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); + InfusionRecipe.Builder.create("protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.TURTLE_HELMET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fire_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_ROD) - .addCatalyst(4, Items.BLAZE_ROD) - .addCatalyst(6, Items.BLAZE_ROD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD) + .addCatalyst(6, Items.BLAZE_ROD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("feather_falling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FEATHER) - .addCatalyst(4, Items.FEATHER) - .addCatalyst(6, Items.FEATHER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FEATHER) + .addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("blast_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.OBSIDIAN) - .addCatalyst(4, Blocks.OBSIDIAN) - .addCatalyst(6, Blocks.OBSIDIAN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN) + .addCatalyst(6, Blocks.OBSIDIAN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("projectile_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SCUTE) - .addCatalyst(4, Items.SHIELD) - .addCatalyst(6, Items.SCUTE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SCUTE) + .addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("respiration_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.NAUTILUS_SHELL) - .addCatalyst(4, Items.NAUTILUS_SHELL) - .addCatalyst(6, Items.NAUTILUS_SHELL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL) + .addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("aqua_affinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_CRYSTALS) - .addCatalyst(4, Items.PRISMARINE_CRYSTALS) - .addCatalyst(6, Items.PRISMARINE_CRYSTALS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS) + .addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("thorns_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.CACTUS) - .addCatalyst(4, Blocks.CACTUS) - .addCatalyst(6, Blocks.CACTUS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS) + .addCatalyst(4, Blocks.CACTUS) + .addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("depth_strider_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.LILY_PAD) - .addCatalyst(4, EndBlocks.END_LILY_SEED) - .addCatalyst(6, Blocks.LILY_PAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD) + .addCatalyst(4, EndBlocks.END_LILY_SEED) + .addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("frost_walker_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("soul_speed_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("sharpness_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.NETHERITE_SCRAP) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("smite_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SUNFLOWER) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Blocks.SUNFLOWER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("bane_of_arthropods_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(4, Items.IRON_INGOT) - .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT) + .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("knockback_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.REDSTONE) - .addCatalyst(4, Blocks.PISTON) - .addCatalyst(6, Items.REDSTONE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE) + .addCatalyst(4, Blocks.PISTON) + .addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fire_aspect_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.MAGMA_CREAM) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.MAGMA_CREAM) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("looting_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("sweeping_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLDEN_SWORD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.GOLDEN_SWORD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("efficiency_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, EndItems.AMBER_GEM) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("silk_touch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.COBWEB) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Blocks.COBWEB) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("unbreaking_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.DIAMOND) - .addCatalyst(4, Items.DIAMOND) - .addCatalyst(6, Items.DIAMOND) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND) + .addCatalyst(4, Items.DIAMOND) + .addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fortune_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.RABBIT_FOOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.RABBIT_FOOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("power_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, Items.DIAMOND_SWORD) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("punch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("flame_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("infinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SPECTRAL_ARROW) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Items.SPECTRAL_ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("luck_of_sea_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("lure_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLD_NUGGET) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.GOLD_NUGGET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("loyalty_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ENDER_EYE) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.ENDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("impaling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_SHARD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.PRISMARINE_SHARD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("riptide_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.LEAD) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.LEAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("channeling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.CHAIN) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.CHAIN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("multishot_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ARROW) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("quick_charge_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.QUARTZ) - .addCatalyst(4, Items.GLOWSTONE_DUST) - .addCatalyst(6, Items.QUARTZ) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ) + .addCatalyst(4, Items.GLOWSTONE_DUST) + .addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("piercing_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GLOWSTONE_DUST) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.GLOWSTONE_DUST) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("mending_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EXPERIENCE_BOTTLE) - .addCatalyst(4, Blocks.ANVIL) - .addCatalyst(6, Items.EXPERIENCE_BOTTLE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE) + .addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); } private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 5c8e82b6..7f50dba1 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -11,99 +11,99 @@ public class SmithingRecipes { public static void register() { SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_sword_handle") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SWORD_HANDLE) - .setBase(EndBlocks.TERMINITE.ingot) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndBlocks.TERMINITE.ingot) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_sword") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SWORD) - .setBase(EndItems.AETERNIUM_SWORD_BLADE) - .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE) + .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_pickaxe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_PICKAXE) - .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_axe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_AXE) - .setBase(EndItems.AETERNIUM_AXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_shovel") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SHOVEL) - .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_hoe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HOE) - .setBase(EndItems.AETERNIUM_HOE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_hammer") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HAMMER) - .setBase(EndItems.AETERNIUM_HAMMER_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "netherite_hammer") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.NETHERITE_HAMMER) - .setBase(EndItems.DIAMOND_HAMMER) - .setAddition(Items.NETHERITE_INGOT) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER) + .setAddition(Items.NETHERITE_INGOT) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_helmet") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HELMET) - .setBase(EndBlocks.TERMINITE.helmet) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndBlocks.TERMINITE.helmet) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_chestplate") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_CHESTPLATE) - .setBase(EndBlocks.TERMINITE.chestplate) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_leggings") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_LEGGINGS) - .setBase(EndBlocks.TERMINITE.leggings) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_boots") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_BOOTS) - .setBase(EndBlocks.TERMINITE.boots) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndBlocks.TERMINITE.boots) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "thallasium_anvil_updrade") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndBlocks.TERMINITE.anvilBlock) - .setBase(EndBlocks.THALLASIUM.anvilBlock) - .setAddition(EndBlocks.TERMINITE.block) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndBlocks.TERMINITE.anvilBlock.asItem()) + .setBase(EndBlocks.THALLASIUM.anvilBlock.asItem()) + .setAddition(EndBlocks.TERMINITE.block) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "terminite_anvil_updrade") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndBlocks.AETERNIUM_ANVIL) - .setBase(EndBlocks.TERMINITE.anvilBlock) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndBlocks.AETERNIUM_ANVIL.asItem()) + .setBase(EndBlocks.TERMINITE.anvilBlock.asItem()) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "armored_elytra") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.ARMORED_ELYTRA) - .setBase(Items.ELYTRA) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.ARMORED_ELYTRA) + .setBase(Items.ELYTRA) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 98e79b2c..46f0f301 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -2,7 +2,6 @@ package ru.betterend.recipe.builders; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; @@ -19,20 +18,22 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import ru.bclib.interfaces.UnknownReceipBookCategory; import ru.bclib.recipes.BCLRecipeManager; +import ru.bclib.util.ItemUtil; +import ru.bclib.util.RecipeHelper; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.registry.EndBlocks; -import ru.betterend.util.ItemUtil; -import ru.betterend.util.RecipeHelper; -public class AlloyingRecipe implements Recipe, BetterEndRecipe { - +public class AlloyingRecipe implements Recipe, UnknownReceipBookCategory { public final static String GROUP = "alloying"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); - public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer( + BetterEnd.MOD_ID, + GROUP, + new Serializer() + ); protected final RecipeType type; protected final ResourceLocation id; @@ -61,7 +62,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public int getSmeltTime() { return this.smeltTime; } - + @Override public NonNullList getIngredients() { NonNullList defaultedList = NonNullList.create(); @@ -70,38 +71,38 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return defaultedList; } - + @Override public boolean matches(Container inv, Level world) { - return this.primaryInput.test(inv.getItem(0)) && this.secondaryInput.test(inv.getItem(1)) || - this.primaryInput.test(inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); + return this.primaryInput.test(inv.getItem(0)) && this.secondaryInput.test(inv.getItem(1)) || this.primaryInput.test( + inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); } - + @Override public ItemStack assemble(Container inv) { return this.output.copy(); } - + @Override public boolean canCraftInDimensions(int width, int height) { return true; } - + @Override public ItemStack getResultItem() { return this.output; } - + @Override public ResourceLocation getId() { return this.id; } - + @Override public RecipeSerializer getSerializer() { return SERIALIZER; } - + @Override public RecipeType getType() { return this.type; @@ -148,7 +149,8 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { private int smeltTime; private boolean alright = true; - private Builder() {} + private Builder() { + } public Builder setGroup(String group) { this.group = group; @@ -212,14 +214,20 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public void build() { if (exist) { if (primaryInput == null) { - BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning( + "Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", + id + ); return; } - if(secondaryInput == null) { - BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); + if (secondaryInput == null) { + BetterEnd.LOGGER.warning( + "Secondary input for Alloying can't be 'null', recipe {} will be ignored!", + id + ); return; } - if(output == null) { + if (output == null) { BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); return; } @@ -231,7 +239,10 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { BetterEnd.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id); return; } - BCLRecipeManager.addRecipe(TYPE, new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)); + BCLRecipeManager.addRecipe( + TYPE, + new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime) + ); } } } @@ -253,7 +264,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime); } - + @Override public AlloyingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { String group = packetBuffer.readUtf(32767); @@ -265,7 +276,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { return new AlloyingRecipe(id, group, primary, secondary, output, experience, smeltTime); } - + @Override public void toNetwork(FriendlyByteBuf packetBuffer, AlloyingRecipe recipe) { packetBuffer.writeUtf(recipe.group); diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java deleted file mode 100644 index 2a9ed475..00000000 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ /dev/null @@ -1,309 +0,0 @@ -package ru.betterend.recipe.builders; - -import java.util.Objects; - -import com.google.gson.JsonObject; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.core.NonNullList; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.Tag; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.Container; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TieredItem; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.Level; -import ru.bclib.recipes.BCLRecipeManager; -import ru.betterend.BetterEnd; -import ru.betterend.config.Configs; -import ru.betterend.interfaces.BetterEndRecipe; -import ru.betterend.registry.EndTags; -import ru.betterend.util.ItemUtil; -import ru.betterend.util.RecipeHelper; - -public class AnvilRecipe implements Recipe, BetterEndRecipe { - - public final static String GROUP = "smithing"; - public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); - public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - - private final ResourceLocation id; - private final Ingredient input; - private final ItemStack output; - private final int damage; - private final int toolLevel; - private final int anvilLevel; - private final int inputCount; - - public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { - this.id = identifier; - this.input = input; - this.output = output; - this.toolLevel = toolLevel; - this.anvilLevel = anvilLevel; - this.inputCount = inputCount; - this.damage = damage; - } - - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } - - @Override - public ItemStack getResultItem() { - return this.output; - } - - @Override - public boolean matches(Container craftingInventory, Level world) { - return this.matches(craftingInventory); - } - - @Override - public ItemStack assemble(Container craftingInventory) { - return this.output.copy(); - } - - public ItemStack craft(Container craftingInventory, Player player) { - if (!player.isCreative()) { - if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; - ItemStack hammer = craftingInventory.getItem(1); - hammer.hurtAndBreak(this.damage, player, entity -> - entity.broadcastBreakEvent((InteractionHand) null)); - } - return this.assemble(craftingInventory); - } - - public boolean checkHammerDurability(Container craftingInventory, Player player) { - if (player.isCreative()) return true; - ItemStack hammer = craftingInventory.getItem(1); - int damage = hammer.getDamageValue() + this.damage; - return damage < hammer.getMaxDamage(); - } - - public boolean matches(Container craftingInventory) { - ItemStack hammer = craftingInventory.getItem(1); - if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { - return false; - } - ItemStack material = craftingInventory.getItem(0); - int materialCount = material.getCount(); - int level = ((TieredItem) hammer.getItem()).getTier().getLevel(); - return this.input.test(craftingInventory.getItem(0)) && - materialCount >= this.inputCount && - level >= this.toolLevel; - } - - public int getDamage() { - return this.damage; - } - - public int getInputCount() { - return this.inputCount; - } - - public int getAnvilLevel() { - return this.anvilLevel; - } - - @Override - public NonNullList getIngredients() { - NonNullList defaultedList = NonNullList.create(); - defaultedList.add(Ingredient.of(EndTags.HAMMERS.getValues().stream().filter(hammer -> - ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); - defaultedList.add(input); - - return defaultedList; - } - - @Override - @Environment(EnvType.CLIENT) - public boolean canCraftInDimensions(int width, int height) { - return true; - } - - @Override - public ResourceLocation getId() { - return this.id; - } - - @Override - public RecipeType getType() { - return TYPE; - } - - @Override - public boolean isSpecial() { - return true; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AnvilRecipe that = (AnvilRecipe) o; - return damage == that.damage && toolLevel == that.toolLevel && id.equals(that.id) && input.equals(that.input) && output.equals(that.output); - } - - @Override - public int hashCode() { - return Objects.hash(id, input, output, damage, toolLevel); - } - - @Override - public String toString() { - return "AnvilRecipe [" + id + "]"; - } - - public static class Builder { - private final static Builder INSTANCE = new Builder(); - - public static Builder create(String id) { - return create(BetterEnd.makeID(id)); - } - - public static Builder create(ResourceLocation id) { - INSTANCE.id = id; - INSTANCE.input = null; - INSTANCE.output = null; - INSTANCE.inputCount = 1; - INSTANCE.toolLevel = 1; - INSTANCE.anvilLevel = 1; - INSTANCE.damage = 1; - INSTANCE.alright = true; - - return INSTANCE; - } - - private ResourceLocation id; - private Ingredient input; - private ItemStack output; - private int inputCount = 1; - private int toolLevel = 1; - private int anvilLevel = 1; - private int damage = 1; - private boolean alright; - - private Builder() {} - - public Builder setInput(ItemLike... inputItems) { - this.alright &= RecipeHelper.exists(inputItems); - this.setInput(Ingredient.of(inputItems)); - return this; - } - - public Builder setInput(Tag inputTag) { - this.setInput(Ingredient.of(inputTag)); - return this; - } - - public Builder setInput(Ingredient ingredient) { - this.input = ingredient; - return this; - } - - public Builder setInputCount(int count) { - this.inputCount = count; - return this; - } - - public Builder setOutput(ItemLike output) { - return this.setOutput(output, 1); - } - - public Builder setOutput(ItemLike output, int amount) { - this.alright &= RecipeHelper.exists(output); - this.output = new ItemStack(output, amount); - return this; - } - - public Builder setToolLevel(int level) { - this.toolLevel = level; - return this; - } - - public Builder setAnvilLevel(int level) { - this.anvilLevel = level; - return this; - } - - public Builder setDamage(int damage) { - this.damage = damage; - return this; - } - - public void build() { - if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { - if (input == null) { - BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if(output == null) { - BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); - return; - } - if (BCLRecipeManager.getRecipe(TYPE, id) != null) { - BetterEnd.LOGGER.warning("Can't add Anvil recipe! Id {} already exists!", id); - return; - } - if (!alright) { - BetterEnd.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id); - return; - } - BCLRecipeManager.addRecipe(TYPE, new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)); - } - } - } - - public static class Serializer implements RecipeSerializer { - @Override - public AnvilRecipe fromJson(ResourceLocation id, JsonObject json) { - Ingredient input = Ingredient.fromJson(json.get("input")); - JsonObject result = GsonHelper.getAsJsonObject(json, "result"); - ItemStack output = ItemUtil.fromJsonRecipe(result); - if (output == null) { - throw new IllegalStateException("Output item does not exists!"); - } - int inputCount = GsonHelper.getAsInt(json, "inputCount", 1); - int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); - int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); - int damage = GsonHelper.getAsInt(json, "damage", 1); - - return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); - } - - @Override - public AnvilRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf packetBuffer) { - Ingredient input = Ingredient.fromNetwork(packetBuffer); - ItemStack output = packetBuffer.readItem(); - int inputCount = packetBuffer.readVarInt(); - int toolLevel = packetBuffer.readVarInt(); - int anvilLevel = packetBuffer.readVarInt(); - int damage = packetBuffer.readVarInt(); - - return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); - } - - @Override - public void toNetwork(FriendlyByteBuf packetBuffer, AnvilRecipe recipe) { - recipe.input.toNetwork(packetBuffer); - packetBuffer.writeItem(recipe.output); - packetBuffer.writeVarInt(recipe.inputCount); - packetBuffer.writeVarInt(recipe.toolLevel); - packetBuffer.writeVarInt(recipe.anvilLevel); - packetBuffer.writeVarInt(recipe.damage); - } - } -} diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index b05b2f37..2dfb6d34 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -1,12 +1,12 @@ package ru.betterend.recipe.builders; -import java.util.Arrays; - import com.google.gson.JsonObject; - +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; @@ -17,19 +17,23 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import ru.bclib.interfaces.UnknownReceipBookCategory; import ru.bclib.recipes.BCLRecipeManager; +import ru.bclib.util.ItemUtil; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; -import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.rituals.InfusionRitual; -import ru.betterend.util.ItemUtil; -public class InfusionRecipe implements Recipe, BetterEndRecipe { - +import java.util.Arrays; + +public class InfusionRecipe implements Recipe, UnknownReceipBookCategory { public final static String GROUP = "infusion"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); - public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer( + BetterEnd.MOD_ID, + GROUP, + new Serializer() + ); private final ResourceLocation id; private final Ingredient[] catalysts; @@ -53,7 +57,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public int getInfusionTime() { return this.time; } - + @Override public boolean matches(InfusionRitual inv, Level world) { boolean valid = this.input.test(inv.getItem(0)); @@ -63,12 +67,12 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } return valid; } - + @Override public ItemStack assemble(InfusionRitual ritual) { return output.copy(); } - + @Override public boolean canCraftInDimensions(int width, int height) { return true; @@ -81,12 +85,12 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { defaultedList.addAll(Arrays.asList(catalysts)); return defaultedList; } - + @Override public ItemStack getResultItem() { return this.output; } - + @Override public ResourceLocation getId() { return this.id; @@ -97,12 +101,12 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public String getGroup() { return this.group; } - + @Override public RecipeSerializer getSerializer() { return SERIALIZER; } - + @Override public RecipeType getType() { return TYPE; @@ -127,7 +131,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { return INSTANCE; } - + private final Ingredient[] catalysts = new Ingredient[8]; private ResourceLocation id; private Ingredient input; @@ -175,11 +179,17 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public void build() { if (exist) { if (input == null) { - BetterEnd.LOGGER.warning("Input for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning( + "Input for Infusion recipe can't be 'null', recipe {} will be ignored!", + id + ); return; } if (output == null) { - BetterEnd.LOGGER.warning("Output for Infusion recipe can't be 'null', recipe {} will be ignored!", id); + BetterEnd.LOGGER.warning( + "Output for Infusion recipe can't be 'null', recipe {} will be ignored!", + id + ); return; } InfusionRecipe recipe = new InfusionRecipe(id, input, output); @@ -209,6 +219,16 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { if (recipe.output == null) { throw new IllegalStateException("Output item does not exists!"); } + if (result.has("nbt")) { + try { + String nbtData = GsonHelper.getAsString(result, "nbt"); + CompoundTag nbt = TagParser.parseTag(nbtData); + recipe.output.setTag(nbt); + } + catch (CommandSyntaxException ex) { + BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); + } + } recipe.group = GsonHelper.getAsString(json, "group", GROUP); recipe.time = GsonHelper.getAsInt(json, "time", 1); @@ -232,7 +252,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { return recipe; } - + @Override public InfusionRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { InfusionRecipe recipe = new InfusionRecipe(id); @@ -245,7 +265,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } return recipe; } - + @Override public void toNetwork(FriendlyByteBuf buffer, InfusionRecipe recipe) { recipe.input.toNetwork(buffer); diff --git a/src/main/java/ru/betterend/registry/EndAttributes.java b/src/main/java/ru/betterend/registry/EndAttributes.java index 95d2dda4..8262d5ba 100644 --- a/src/main/java/ru/betterend/registry/EndAttributes.java +++ b/src/main/java/ru/betterend/registry/EndAttributes.java @@ -8,11 +8,15 @@ import ru.betterend.item.EndAttribute; public class EndAttributes { public final static Attribute BLINDNESS_RESISTANCE = registerAttribute("generic.blindness_resistance", 0.0, true); - + public static Attribute registerAttribute(String name, double value, boolean syncable) { - return Registry.register(Registry.ATTRIBUTE, BetterEnd.makeID(name), new EndAttribute("attribute.name." + name, value).setSyncable(syncable)); + return Registry.register( + Registry.ATTRIBUTE, + BetterEnd.makeID(name), + new EndAttribute("attribute.name." + name, value).setSyncable(syncable) + ); } - + public static AttributeSupplier.Builder addLivingEntityAttributes(AttributeSupplier.Builder builder) { return builder.add(EndAttributes.BLINDNESS_RESISTANCE); } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index b39fd679..75823c17 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -1,36 +1,15 @@ package ru.betterend.registry; -import java.io.InputStream; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -import net.fabricmc.fabric.impl.biome.InternalBiomeData; -import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.core.Registry; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.BiomeCategory; -import net.minecraft.world.level.biome.Biomes; -import ru.bclib.BCLib; -import ru.bclib.api.BiomeAPI; -import ru.bclib.api.ModIntegrationAPI; -import ru.bclib.util.JsonFactory; +import ru.bclib.api.LifeCycleAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.generator.BiomeMap; import ru.bclib.world.generator.BiomePicker; +import ru.bclib.world.generator.map.hex.HexBiomeMap; import ru.betterend.config.Configs; -import ru.betterend.integration.EndBiomeIntegration; -import ru.betterend.interfaces.IBiomeList; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.air.BiomeIceStarfield; import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; @@ -56,30 +35,15 @@ import ru.betterend.world.biome.land.NeonOasisBiome; import ru.betterend.world.biome.land.PaintedMountainsBiome; import ru.betterend.world.biome.land.ShadowForestBiome; import ru.betterend.world.biome.land.SulphurSpringsBiome; +import ru.betterend.world.biome.land.UmbraValleyBiome; import ru.betterend.world.biome.land.UmbrellaJungleBiome; import ru.betterend.world.generator.BiomeType; import ru.betterend.world.generator.GeneratorOptions; public class EndBiomes { - private static final Map ID_MAP = Maps.newHashMap(); - public static final Set FABRIC_VOID = Sets.newHashSet(); - private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); - - public static final BiomePicker LAND_BIOMES = new BiomePicker(); - public static final BiomePicker VOID_BIOMES = new BiomePicker(); public static final BiomePicker CAVE_BIOMES = new BiomePicker(); - public static final List SUBBIOMES = Lists.newArrayList(); - private static final JsonObject EMPTY_JSON = new JsonObject(); - private static BiomeMap caveBiomeMap; - - // Vanilla Land - public static final EndBiome END = registerBiome(Biomes.THE_END, BiomeType.LAND, 1F); - public static final EndBiome END_MIDLANDS = registerSubBiome(Biomes.END_MIDLANDS, END, 0.5F); - public static final EndBiome END_HIGHLANDS = registerSubBiome(Biomes.END_HIGHLANDS, END, 0.5F); - - // Vanilla Void - public static final EndBiome END_BARRENS = registerBiome(Biomes.END_BARRENS, BiomeType.VOID, 1F); - public static final EndBiome SMALL_END_ISLANDS = registerBiome(Biomes.SMALL_END_ISLANDS, BiomeType.VOID, 1); + private static HexBiomeMap caveBiomeMap; + private static long lastSeed; // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); @@ -99,6 +63,7 @@ public class EndBiomes { public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); + public static final EndBiome UMBRA_VALLEY = registerBiome(new UmbraValleyBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); @@ -112,207 +77,49 @@ public class EndBiomes { public static final EndCaveBiome JADE_CAVE = registerCaveBiome(new JadeCaveBiome()); public static void register() { + LifeCycleAPI.onLevelLoad(EndBiomes::onWorldLoad); + } + + private static void onWorldLoad(ServerLevel level, long seed, Registry registry) { + CAVE_BIOMES.getBiomes().forEach(biome -> biome.updateActualBiomes(registry)); CAVE_BIOMES.rebuild(); - } - - public static void onWorldLoad(long seed) { - if (caveBiomeMap == null || caveBiomeMap.getSeed() != seed) { - caveBiomeMap = new BiomeMap(seed, GeneratorOptions.getBiomeSizeCaves(), CAVE_BIOMES); + if (caveBiomeMap == null || lastSeed != seed) { + caveBiomeMap = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeCaves(), CAVE_BIOMES); + lastSeed = seed; } } - public static void mutateRegistry(Registry biomeRegistry) { - LAND_BIOMES.clearMutables(); - VOID_BIOMES.clearMutables(); - CAVE_BIOMES.clearMutables(); - - if (FABRIC_VOID.isEmpty()) { - loadFabricAPIBiomes(); - } - - Map configs = Maps.newHashMap(); - - biomeRegistry.forEach((biome) -> { - if (biome.getBiomeCategory() == BiomeCategory.THEEND) { - ResourceLocation id = biomeRegistry.getKey(biome); - if (!id.getNamespace().equals("ultra_amplified_dimension") && Configs.BIOME_CONFIG.getBoolean(id, "enabled", true)) { - if (!LAND_BIOMES.containsImmutable(id) && !VOID_BIOMES.containsImmutable(id) && !SUBBIOMES_UNMUTABLES.contains(id)) { - JsonObject config = configs.get(id.getNamespace()); - if (config == null) { - config = loadJsonConfig(id.getNamespace()); - configs.put(id.getNamespace(), config); - } - float fog = 1F; - float chance = 1F; - boolean isVoid = FABRIC_VOID.contains(id); - boolean hasCaves = true; - JsonElement element = config.get(id.getPath()); - if (element != null && element.isJsonObject()) { - fog = JsonFactory.getFloat(element.getAsJsonObject(), "fog_density", 1); - chance = JsonFactory.getFloat(element.getAsJsonObject(), "generation_chance", 1); - isVoid = JsonFactory.getString(element.getAsJsonObject(), "type", "land").equals("void"); - hasCaves = JsonFactory.getBoolean(element.getAsJsonObject(), "has_caves", true); - } - EndBiome endBiome = new EndBiome(id, biome, fog, chance, hasCaves); - - if (isVoid) { - VOID_BIOMES.addBiomeMutable(endBiome); - } - else { - LAND_BIOMES.addBiomeMutable(endBiome); - } - ID_MAP.put(id, endBiome); - } - } - } - }); - ModIntegrationAPI.getIntegrations().forEach(integration -> { - if (integration instanceof EndBiomeIntegration && integration.modIsInstalled()) { - ((EndBiomeIntegration) integration).addBiomes(); - } - }); - Configs.BIOME_CONFIG.saveChanges(); - - rebuildPicker(LAND_BIOMES, biomeRegistry); - rebuildPicker(VOID_BIOMES, biomeRegistry); - rebuildPicker(CAVE_BIOMES, biomeRegistry); - - SUBBIOMES.forEach((endBiome) -> { - endBiome.updateActualBiomes(biomeRegistry); - }); - } - - private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { - picker.rebuild(); - picker.getBiomes().forEach((endBiome) -> { - endBiome.updateActualBiomes(biomeRegistry); - }); - } - - private static void loadFabricAPIBiomes() { - List> biomes = Lists.newArrayList(); - biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); - biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); - biomes.forEach((key) -> FABRIC_VOID.add(key.location())); - FABRIC_VOID.removeIf(id -> id.getNamespace().equals("endplus")); - - if (BCLib.isDevEnvironment()) { - System.out.println("=================================="); - System.out.println("Added void biomes from Fabric API:"); - FABRIC_VOID.forEach((id) -> { - System.out.println(id); - }); - System.out.println("=================================="); - } - } - - private static List> getBiomes(WeightedBiomePicker picker) { - IBiomeList biomeList = (IBiomeList) (Object) picker; - return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); - } - - private static JsonObject loadJsonConfig(String namespace) { - InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); - if (inputstream != null) { - return JsonFactory.getJsonObject(inputstream); - } - else { - return EMPTY_JSON; - } - } - - /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} - * @param genChance - generation chance [0.0F - Infinity] - * @return registered {@link EndBiome} - */ - public static EndBiome registerBiome(Biome biome, BiomeType type, float genChance) { - return registerBiome(biome, type, 1, genChance); - } - - /** - * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} - * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] - * @return registered {@link EndBiome} - */ - public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, true); - if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { - addToPicker(endBiome, type); - } - return endBiome; - } - - /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with - * @param genChance - generation chance [0.0F - Infinity] - * @return registered {@link EndBiome} - */ - public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float genChance, boolean hasCaves) { - return registerSubBiome(biome, parent, 1, genChance, hasCaves); - } - - /** - * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with - * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] - * @return registered {@link EndBiome} - */ - public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { - EndBiome endBiome = new EndBiome(BuiltinRegistries.BIOME.getKey(biome), biome, fogDensity, genChance, hasCaves); - if (Configs.BIOME_CONFIG.getBoolean(endBiome.getID(), "enabled", true)) { - BiomeAPI.registerBiome(endBiome); - parent.addSubBiome(endBiome); - SUBBIOMES.add(endBiome); - SUBBIOMES_UNMUTABLES.add(endBiome.getID()); - ID_MAP.put(endBiome.getID(), endBiome); - } - return endBiome; - } - /** * Put existing {@link EndBiome} as a sub-biome into selected parent. - * @param biome - {@link EndBiome} instance + * + * @param biomeConfig - {@link EndBiome.Config} instance * @param parent - {@link EndBiome} to be linked with * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { + public static EndBiome registerSubBiome(EndBiome.Config biomeConfig, EndBiome parent) { + final EndBiome biome = EndBiome.create(biomeConfig); + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - BiomeAPI.registerBiome(biome); - parent.addSubBiome(biome); - SUBBIOMES.add(biome); - SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); - BiomeAPI.addEndLandBiomeToFabricApi(biome); + BiomeAPI.registerSubBiome(parent, biome); } return biome; } /** * Registers {@link EndBiome} and adds it into worldgen. - * @param biome - {@link EndBiome} instance - * @param type - {@link BiomeType} + * + * @param biomeConfig - {@link EndBiome.Config} instance + * @param type - {@link BiomeType} * @return registered {@link EndBiome} */ - public static EndBiome registerBiome(EndBiome biome, BiomeType type) { + public static EndBiome registerBiome(EndBiome.Config biomeConfig, BiomeType type) { + final EndBiome biome = EndBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - BiomeAPI.registerBiome(biome); - addToPicker(biome, type); - ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { - BiomeAPI.addEndLandBiomeToFabricApi(biome); + BiomeAPI.registerEndLandBiome(biome); } else { - BiomeAPI.addEndVoidBiomeToFabricApi(biome); + BiomeAPI.registerEndVoidBiome(biome); } } return biome; @@ -320,65 +127,43 @@ public class EndBiomes { /** * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. - * @param biome - {@link EndBiome} instance + * + * @param biomeConfig - {@link EndBiome.Config} instance * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiomeIntegration(EndBiome biome) { + public static EndBiome registerSubBiomeIntegration(EndBiome.Config biomeConfig) { + EndBiome biome = EndBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); - SUBBIOMES.add(biome); - SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); - BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; } /** * Link integration sub-biome with parent. - * @param biome - {@link EndBiome} instance + * + * @param biome - {@link EndBiome} instance * @param parent - {@link ResourceLocation} parent id */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - EndBiome parentBiome = ID_MAP.get(parent); + BCLBiome parentBiome = BiomeAPI.getBiome(parent); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { parentBiome.addSubBiome(biome); } } } - public static EndBiome registerBiome(ResourceKey key, BiomeType type, float genChance) { - return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); - } - - public static EndBiome registerSubBiome(ResourceKey key, EndBiome parent, float genChance) { - return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); - } - - private static void addToPicker(EndBiome biome, BiomeType type) { - if (type == BiomeType.LAND) { - LAND_BIOMES.addBiome(biome); - } - else { - VOID_BIOMES.addBiome(biome); - } - } - - public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { + public static EndCaveBiome registerCaveBiome(EndCaveBiome.Config biomeConfig) { + final EndCaveBiome biome = EndCaveBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); CAVE_BIOMES.addBiome(biome); - ID_MAP.put(biome.getID(), biome); } return biome; } public static EndCaveBiome getCaveBiome(int x, int z) { - return (EndCaveBiome) caveBiomeMap.getBiome(x, z); - } - - public static boolean hasBiome(ResourceLocation biomeID) { - return ID_MAP.containsKey(biomeID); + return (EndCaveBiome) caveBiomeMap.getBiome(x, 5, z); } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 93535912..6b90487d 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -1,5 +1,6 @@ package ru.betterend.registry; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.core.Registry; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -14,26 +15,40 @@ import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { - public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, - BlockEntityType.Builder.of(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); - public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", - BlockEntityType.Builder.of(PedestalBlockEntity::new, getPedestals())); - public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", - BlockEntityType.Builder.of(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); - public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", - BlockEntityType.Builder.of(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); - public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", - BlockEntityType.Builder.of(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); - - public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { + public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity( + EndStoneSmelter.ID, + FabricBlockEntityTypeBuilder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER) + ); + public final static BlockEntityType PEDESTAL = registerBlockEntity( + "pedestal", + FabricBlockEntityTypeBuilder.create(PedestalBlockEntity::new, getPedestals()) + ); + public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity( + "eternal_pedestal", + FabricBlockEntityTypeBuilder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL) + ); + public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity( + "infusion_pedestal", + FabricBlockEntityTypeBuilder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL) + ); + public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity( + "hydrother_malvent", + FabricBlockEntityTypeBuilder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT) + ); + + public static BlockEntityType registerBlockEntity(String id, FabricBlockEntityTypeBuilder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); + + //return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } - public static void register() {} + public static void register() { + } static Block[] getPedestals() { - return EndBlocks.getModBlocks().stream() - .filter(block -> block instanceof PedestalBlock && !((PedestalBlock) block).hasUniqueEntity()) - .toArray(Block[]::new); + return EndBlocks.getModBlocks() + .stream() + .filter(block -> block instanceof PedestalBlock && !((PedestalBlock) block).hasUniqueEntity()) + .toArray(Block[]::new); } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java b/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java index a568502a..b4a10e53 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java @@ -2,14 +2,14 @@ package ru.betterend.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; import ru.betterend.client.render.PedestalItemRenderer; @Environment(EnvType.CLIENT) public class EndBlockEntityRenders { public static void register() { - BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.PEDESTAL, PedestalItemRenderer::new); - BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.ETERNAL_PEDESTAL, PedestalItemRenderer::new); - BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.INFUSION_PEDESTAL, PedestalItemRenderer::new); + BlockEntityRendererRegistry.register(EndBlockEntities.PEDESTAL, PedestalItemRenderer::new); + BlockEntityRendererRegistry.register(EndBlockEntities.ETERNAL_PEDESTAL, PedestalItemRenderer::new); + BlockEntityRendererRegistry.register(EndBlockEntities.INFUSION_PEDESTAL, PedestalItemRenderer::new); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 246e9ba9..41f7c536 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,53 +1,151 @@ package ru.betterend.registry; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; -import ru.bclib.blocks.BaseBarrelBlock; -import ru.bclib.blocks.BaseChestBlock; -import ru.bclib.blocks.BaseCropBlock; +import org.jetbrains.annotations.NotNull; import ru.bclib.blocks.BaseFurnaceBlock; -import ru.bclib.blocks.BaseLeavesBlock; import ru.bclib.blocks.BaseOreBlock; import ru.bclib.blocks.BasePathBlock; import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.blocks.BaseSignBlock; import ru.bclib.blocks.BaseSlabBlock; import ru.bclib.blocks.BaseStairsBlock; import ru.bclib.blocks.BaseVineBlock; import ru.bclib.blocks.SimpleLeavesBlock; import ru.bclib.blocks.StalactiteBlock; -import ru.bclib.registry.BaseBlockEntities; -import ru.bclib.registry.BlocksRegistry; +import ru.bclib.registry.BlockRegistry; import ru.betterend.BetterEnd; -import ru.betterend.blocks.*; +import ru.betterend.blocks.AeterniumAnvil; +import ru.betterend.blocks.AeterniumBlock; +import ru.betterend.blocks.AmaranitaCapBlock; +import ru.betterend.blocks.AmaranitaHymenophoreBlock; +import ru.betterend.blocks.AmaranitaStemBlock; +import ru.betterend.blocks.AmberBlock; +import ru.betterend.blocks.AncientEmeraldIceBlock; +import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.blocks.BlueVineBlock; +import ru.betterend.blocks.BlueVineLanternBlock; +import ru.betterend.blocks.BlueVineSeedBlock; +import ru.betterend.blocks.BoluxMushroomBlock; +import ru.betterend.blocks.BrimstoneBlock; +import ru.betterend.blocks.BubbleCoralBlock; +import ru.betterend.blocks.BulbVineBlock; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.CavePumpkinBlock; +import ru.betterend.blocks.CavePumpkinVineBlock; +import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.CharcoalBlock; +import ru.betterend.blocks.CharniaBlock; +import ru.betterend.blocks.ChorusGrassBlock; +import ru.betterend.blocks.DenseEmeraldIceBlock; +import ru.betterend.blocks.DenseSnowBlock; +import ru.betterend.blocks.DragonTreeSaplingBlock; +import ru.betterend.blocks.EmeraldIceBlock; +import ru.betterend.blocks.EndLilyBlock; +import ru.betterend.blocks.EndLilySeedBlock; +import ru.betterend.blocks.EndLotusFlowerBlock; +import ru.betterend.blocks.EndLotusLeafBlock; +import ru.betterend.blocks.EndLotusSeedBlock; +import ru.betterend.blocks.EndLotusStemBlock; +import ru.betterend.blocks.EndPortalBlock; +import ru.betterend.blocks.EndStoneSmelter; +import ru.betterend.blocks.EnderBlock; +import ru.betterend.blocks.EndstoneDustBlock; +import ru.betterend.blocks.EternalPedestal; +import ru.betterend.blocks.FilaluxBlock; +import ru.betterend.blocks.FilaluxLanternBlock; +import ru.betterend.blocks.FilaluxWingsBlock; +import ru.betterend.blocks.FlamaeaBlock; +import ru.betterend.blocks.FlammalixBlock; +import ru.betterend.blocks.FlowerPotBlock; +import ru.betterend.blocks.GlowingHymenophoreBlock; +import ru.betterend.blocks.GlowingMossBlock; +import ru.betterend.blocks.GlowingPillarLuminophorBlock; +import ru.betterend.blocks.GlowingPillarRootsBlock; +import ru.betterend.blocks.GlowingPillarSeedBlock; +import ru.betterend.blocks.HelixTreeLeavesBlock; +import ru.betterend.blocks.HelixTreeSaplingBlock; +import ru.betterend.blocks.HydraluxBlock; +import ru.betterend.blocks.HydraluxPetalBlock; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.blocks.HydraluxSaplingBlock; +import ru.betterend.blocks.HydrothermalVentBlock; +import ru.betterend.blocks.InfusionPedestal; +import ru.betterend.blocks.JellyshroomCapBlock; +import ru.betterend.blocks.LacugroveSaplingBlock; +import ru.betterend.blocks.LanceleafBlock; +import ru.betterend.blocks.LanceleafSeedBlock; +import ru.betterend.blocks.LargeAmaranitaBlock; +import ru.betterend.blocks.LucerniaSaplingBlock; +import ru.betterend.blocks.LumecornBlock; +import ru.betterend.blocks.LumecornSeedBlock; +import ru.betterend.blocks.MengerSpongeBlock; +import ru.betterend.blocks.MengerSpongeWetBlock; +import ru.betterend.blocks.MissingTileBlock; +import ru.betterend.blocks.MossyDragonBoneBlock; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.MossyGlowshroomSaplingBlock; +import ru.betterend.blocks.MossyObsidian; +import ru.betterend.blocks.MurkweedBlock; +import ru.betterend.blocks.NeedlegrassBlock; +import ru.betterend.blocks.NeonCactusBlock; +import ru.betterend.blocks.NeonCactusPlantBlock; +import ru.betterend.blocks.PallidiumBlock; +import ru.betterend.blocks.PedestalVanilla; +import ru.betterend.blocks.PondAnemoneBlock; +import ru.betterend.blocks.PythadendronSaplingBlock; +import ru.betterend.blocks.RespawnObeliskBlock; +import ru.betterend.blocks.RunedFlavolite; +import ru.betterend.blocks.ShadowBerryBlock; +import ru.betterend.blocks.ShadowGrassBlock; +import ru.betterend.blocks.SilkMothHiveBlock; +import ru.betterend.blocks.SilkMothNestBlock; +import ru.betterend.blocks.SmallAmaranitaBlock; +import ru.betterend.blocks.SmallJellyshroomBlock; +import ru.betterend.blocks.SmaragdantCrystalBlock; +import ru.betterend.blocks.SmaragdantCrystalShardBlock; +import ru.betterend.blocks.SulphurCrystalBlock; +import ru.betterend.blocks.TenaneaFlowersBlock; +import ru.betterend.blocks.TenaneaSaplingBlock; +import ru.betterend.blocks.TerrainPlantBlock; +import ru.betterend.blocks.TwistedUmbrellaMossBlock; +import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaMossBlock; +import ru.betterend.blocks.UmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaTreeClusterBlock; +import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; +import ru.betterend.blocks.UmbrellaTreeMembraneBlock; +import ru.betterend.blocks.UmbrellaTreeSaplingBlock; +import ru.betterend.blocks.VentBubbleColumnBlock; import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.blocks.basis.EndTripleTerrain; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; import ru.betterend.blocks.basis.EndWallMushroom; import ru.betterend.blocks.basis.EndWallPlantBlock; import ru.betterend.blocks.basis.FurBlock; +import ru.betterend.blocks.basis.PottableCropBlock; +import ru.betterend.blocks.basis.PottableLeavesBlock; import ru.betterend.blocks.basis.StoneLanternBlock; -import ru.betterend.blocks.complex.ColoredMaterial; -import ru.betterend.blocks.complex.CrystalSubblocksMaterial; -import ru.betterend.blocks.complex.MetalMaterial; -import ru.betterend.blocks.complex.StoneMaterial; -import ru.betterend.blocks.complex.WoodenMaterial; +import ru.betterend.complexmaterials.ColoredMaterial; +import ru.betterend.complexmaterials.CrystalSubblocksMaterial; +import ru.betterend.complexmaterials.EndWoodenComplexMaterial; +import ru.betterend.complexmaterials.MetalMaterial; +import ru.betterend.complexmaterials.StoneMaterial; import ru.betterend.config.Configs; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.tab.CreativeTabs; -public class EndBlocks extends BlocksRegistry { +import java.util.List; + +public class EndBlocks { + private static final BlockRegistry REGISTRY = new BlockRegistry(CreativeTabs.TAB_BLOCKS, Configs.BLOCK_CONFIG); + // Terrain // public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); public static final Block END_MYCELIUM = registerBlock("end_mycelium", new EndTerrainBlock(MaterialColor.COLOR_LIGHT_BLUE)); @@ -61,7 +159,11 @@ public class EndBlocks extends BlocksRegistry { public static final Block JUNGLE_MOSS = registerBlock("jungle_moss", new EndTerrainBlock(MaterialColor.COLOR_GREEN)); public static final Block SANGNUM = registerBlock("sangnum", new EndTerrainBlock(MaterialColor.COLOR_RED)); public static final Block RUTISCUS = registerBlock("rutiscus", new EndTerrainBlock(MaterialColor.COLOR_ORANGE)); - + public static final Block PALLIDIUM_FULL = registerBlock("pallidium_full", new PallidiumBlock("full", null)); + public static final Block PALLIDIUM_HEAVY = registerBlock("pallidium_heavy", new PallidiumBlock("heavy", PALLIDIUM_FULL)); + public static final Block PALLIDIUM_THIN = registerBlock("pallidium_thin", new PallidiumBlock("thin", PALLIDIUM_HEAVY)); + public static final Block PALLIDIUM_TINY = registerBlock("pallidium_tiny", new PallidiumBlock("tiny", PALLIDIUM_THIN)); + // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BasePathBlock(END_MYCELIUM)); public static final Block END_MOSS_PATH = registerBlock("end_moss_path", new BasePathBlock(END_MOSS)); @@ -88,9 +190,11 @@ public class EndBlocks extends BlocksRegistry { public static final StoneMaterial VIRID_JADESTONE = new StoneMaterial("virid_jadestone", MaterialColor.COLOR_GREEN); public static final StoneMaterial AZURE_JADESTONE = new StoneMaterial("azure_jadestone", MaterialColor.COLOR_LIGHT_BLUE); public static final StoneMaterial SANDY_JADESTONE = new StoneMaterial("sandy_jadestone", MaterialColor.COLOR_YELLOW); + public static final StoneMaterial UMBRALITH = new StoneMaterial("umbralith", MaterialColor.DEEPSLATE); public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); + public static final Block ENDSTONE_FLOWER_POT = registerBlock("endstone_flower_pot", new FlowerPotBlock(Blocks.END_STONE)); public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite(false)); public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new RunedFlavolite(true)); @@ -117,49 +221,89 @@ public class EndBlocks extends BlocksRegistry { public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); - public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.COLOR_GRAY, MaterialColor.WOOD); + public static final EndWoodenComplexMaterial MOSSY_GLOWSHROOM = new EndWoodenComplexMaterial( + "mossy_glowshroom", + MaterialColor.COLOR_GRAY, + MaterialColor.WOOD + ).init(); public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); - public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new BaseLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); - public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, MaterialColor.COLOR_PURPLE); + public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new PottableLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final EndWoodenComplexMaterial PYTHADENDRON = new EndWoodenComplexMaterial( + "pythadendron", + MaterialColor.COLOR_MAGENTA, + MaterialColor.COLOR_PURPLE + ).init(); public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); public static final Block END_LOTUS_LEAF = registerEndBlockOnly("end_lotus_leaf", new EndLotusLeafBlock()); public static final Block END_LOTUS_FLOWER = registerEndBlockOnly("end_lotus_flower", new EndLotusFlowerBlock()); - public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, MaterialColor.COLOR_CYAN); + public static final EndWoodenComplexMaterial END_LOTUS = new EndWoodenComplexMaterial( + "end_lotus", + MaterialColor.COLOR_LIGHT_BLUE, + MaterialColor.COLOR_CYAN + ).init(); public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); - public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new BaseLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); - public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_YELLOW); + public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new PottableLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); + public static final EndWoodenComplexMaterial LACUGROVE = new EndWoodenComplexMaterial( + "lacugrove", + MaterialColor.COLOR_BROWN, + MaterialColor.COLOR_YELLOW + ).init(); public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); - public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new BaseLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); - public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, MaterialColor.COLOR_MAGENTA); + public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new PottableLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); + public static final EndWoodenComplexMaterial DRAGON_TREE = new EndWoodenComplexMaterial( + "dragon_tree", + MaterialColor.COLOR_BLACK, + MaterialColor.COLOR_MAGENTA + ).init(); public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); - public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new BaseLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); + public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new PottableLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); - public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_PINK); + public static final EndWoodenComplexMaterial TENANEA = new EndWoodenComplexMaterial( + "tenanea", + MaterialColor.COLOR_BROWN, + MaterialColor.COLOR_PINK + ).init(); public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); - public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, MaterialColor.COLOR_ORANGE); + public static final EndWoodenComplexMaterial HELIX_TREE = new EndWoodenComplexMaterial( + "helix_tree", + MaterialColor.COLOR_GRAY, + MaterialColor.COLOR_ORANGE + ).init(); public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); - public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, MaterialColor.COLOR_GREEN); + public static final EndWoodenComplexMaterial UMBRELLA_TREE = new EndWoodenComplexMaterial( + "umbrella_tree", + MaterialColor.COLOR_BLUE, + MaterialColor.COLOR_GREEN + ).init(); public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); - public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, MaterialColor.COLOR_LIGHT_BLUE); + public static final EndWoodenComplexMaterial JELLYSHROOM = new EndWoodenComplexMaterial( + "jellyshroom", + MaterialColor.COLOR_PURPLE, + MaterialColor.COLOR_LIGHT_BLUE + ).init(); public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new LucerniaSaplingBlock()); - public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new BaseLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); + public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new PottableLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); - public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, MaterialColor.COLOR_ORANGE); + public static final EndWoodenComplexMaterial LUCERNIA = new EndWoodenComplexMaterial( + "lucernia", + MaterialColor.COLOR_ORANGE, + MaterialColor.COLOR_ORANGE + ).init(); // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); @@ -184,6 +328,8 @@ public class EndBlocks extends BlocksRegistry { public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); + public static final Block INFLEXIA = registerBlock("inflexia", new TerrainPlantBlock(PALLIDIUM_FULL, PALLIDIUM_HEAVY, PALLIDIUM_THIN, PALLIDIUM_TINY)); + public static final Block FLAMMALIX = registerBlock("flammalix", new FlammalixBlock()); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerEndBlockOnly("blue_vine", new BlueVineBlock()); @@ -220,10 +366,10 @@ public class EndBlocks extends BlocksRegistry { // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); - public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new BaseCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); - public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new BaseCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); - public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new BaseCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); - //public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); + public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new PottableCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); + public static final Block AMBER_ROOT = registerBlock("amber_root_seed", new PottableCropBlock(EndItems.AMBER_ROOT_RAW, AMBER_MOSS)); + public static final Block CHORUS_MUSHROOM = registerBlock("chorus_mushroom_seed", new PottableCropBlock(EndItems.CHORUS_MUSHROOM_RAW, CHORUS_NYLIUM)); + //public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new PottableCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); @@ -241,7 +387,7 @@ public class EndBlocks extends BlocksRegistry { public static final Block END_LILY = registerEndBlockOnly("end_lily", new EndLilyBlock()); public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); public static final Block HYDRALUX = registerEndBlockOnly("hydralux", new HydraluxBlock()); public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); @@ -283,41 +429,87 @@ public class EndBlocks extends BlocksRegistry { public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); // Ores // - public static final Block ENDER_ORE = registerBlock("ender_ore", new BaseOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); - public static final Block AMBER_ORE = registerBlock("amber_ore", new BaseOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); + public static final Block ENDER_ORE = registerBlock("ender_ore", new BaseOreBlock(()->EndItems.ENDER_SHARD, 1, 3, 5)); + public static final Block AMBER_ORE = registerBlock("amber_ore", new BaseOreBlock(()->EndItems.RAW_AMBER, 1, 2, 4)); // Materials // - public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); - public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.WARPED_WART_BLOCK, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); + public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal( + "thallasium", + MaterialColor.COLOR_BLUE, + EndToolMaterial.THALLASIUM, + EndArmorMaterial.THALLASIUM + ); + public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless( + "terminite", + MaterialColor.WARPED_WART_BLOCK, + 7F, + 9F, + EndToolMaterial.TERMINITE, + EndArmorMaterial.TERMINITE + ); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock( + "smaragdant_crystal_shard", + new SmaragdantCrystalShardBlock() + ); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); - public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); - public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); + public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial( + "smaragdant_crystal", + SMARAGDANT_CRYSTAL + ); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); // Lanterns - public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); + public static final Block ANDESITE_LANTERN = registerBlock( + "andesite_lantern", + new StoneLanternBlock(Blocks.ANDESITE) + ); public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); public static final Block GRANITE_LANTERN = registerBlock("granite_lantern", new StoneLanternBlock(Blocks.GRANITE)); - public static final Block QUARTZ_LANTERN = registerBlock("quartz_lantern", new StoneLanternBlock(Blocks.QUARTZ_BLOCK)); - public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); - public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); - public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); + public static final Block QUARTZ_LANTERN = registerBlock( + "quartz_lantern", + new StoneLanternBlock(Blocks.QUARTZ_BLOCK) + ); + public static final Block PURPUR_LANTERN = registerBlock( + "purpur_lantern", + new StoneLanternBlock(Blocks.PURPUR_BLOCK) + ); + public static final Block END_STONE_LANTERN = registerBlock( + "end_stone_lantern", + new StoneLanternBlock(Blocks.END_STONE) + ); + public static final Block BLACKSTONE_LANTERN = registerBlock( + "blackstone_lantern", + new StoneLanternBlock(Blocks.BLACKSTONE) + ); public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); - public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); + public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial( + BulbVineLanternColoredBlock::new, + IRON_BULB_LANTERN, + false + ); - public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); - public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock( + "iron_chandelier", + new ChandelierBlock(Blocks.GOLD_BLOCK) + ); + public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock( + "gold_chandelier", + new ChandelierBlock(Blocks.GOLD_BLOCK) + ); // Blocks With Entity // - public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new BaseFurnaceBlock(Blocks.END_STONE)); + public static final Block END_STONE_FURNACE = registerBlock( + "end_stone_furnace", + new BaseFurnaceBlock(Blocks.END_STONE) + ); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); @@ -325,34 +517,19 @@ public class EndBlocks extends BlocksRegistry { // Technical public static final Block END_PORTAL_BLOCK = registerEndBlockOnly("end_portal_block", new EndPortalBlock()); - - private static BlocksRegistry BLOCKS_REGISTRY; - - private EndBlocks(CreativeModeTab creativeTab) { - super(creativeTab); - } - + public static List getModBlocks() { - return getModBlocks(BetterEnd.MOD_ID).stream().filter(BlockItem.class::isInstance) - .map(item -> ((BlockItem) item).getBlock()).collect(Collectors.toList()); + return BlockRegistry.getModBlocks(BetterEnd.MOD_ID); } - + + public static List getModBlockItems() { + return BlockRegistry.getModBlockItems(BetterEnd.MOD_ID); + } + public static Block registerBlock(ResourceLocation id, Block block) { if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { return block; } - if (block instanceof BaseChestBlock) { - BaseBlockEntities.CHEST.registerBlock(block); - } - if (block instanceof BaseSignBlock) { - BaseBlockEntities.SIGN.registerBlock(block); - } - if (block instanceof BaseBarrelBlock) { - BaseBlockEntities.BARREL.registerBlock(block); - } - if (block instanceof BaseFurnaceBlock) { - BaseBlockEntities.FURNACE.registerBlock(block); - } getBlockRegistry().register(id, block); return block; } @@ -362,23 +539,15 @@ public class EndBlocks extends BlocksRegistry { } public static Block registerEndBlockOnly(String name, Block block) { - return getBlockRegistry().registerBlockOnly(name, block); + return getBlockRegistry().registerBlockOnly(BetterEnd.makeID(name), block); } - + public static FabricItemSettings makeBlockItemSettings() { return getBlockRegistry().makeItemSettings(); } - - @Override - public ResourceLocation createModId(String name) { - return BetterEnd.makeID(name); - } - + @NotNull - private static BlocksRegistry getBlockRegistry() { - if (BLOCKS_REGISTRY == null) { - BLOCKS_REGISTRY = new EndBlocks(CreativeTabs.TAB_BLOCKS); - } - return BLOCKS_REGISTRY; + public static BlockRegistry getBlockRegistry() { + return REGISTRY; } } diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/registry/EndEnchantments.java similarity index 77% rename from src/main/java/ru/betterend/effects/EndEnchantments.java rename to src/main/java/ru/betterend/registry/EndEnchantments.java index 6755a3de..6d7c5a38 100644 --- a/src/main/java/ru/betterend/effects/EndEnchantments.java +++ b/src/main/java/ru/betterend/registry/EndEnchantments.java @@ -1,16 +1,20 @@ -package ru.betterend.effects; - -import net.minecraft.core.Registry; -import net.minecraft.world.item.enchantment.Enchantment; -import ru.betterend.BetterEnd; -import ru.betterend.effects.enchantment.EndVeilEnchantment; - -public class EndEnchantments { - public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); - - public static Enchantment registerEnchantment(String name, Enchantment enchantment) { - return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); - } - - public static void register() {} -} +package ru.betterend.registry; + +import net.minecraft.core.Registry; +import net.minecraft.world.item.enchantment.Enchantment; +import ru.betterend.BetterEnd; +import ru.betterend.config.Configs; +import ru.betterend.effects.enchantment.EndVeilEnchantment; + +public class EndEnchantments { + public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); + + public static Enchantment registerEnchantment(String name, Enchantment enchantment) { + if (!Configs.ENCHANTMENT_CONFIG.getBooleanRoot(name, true)) { + return enchantment; + } + return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); + } + + public static void register() {} +} diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 0dedbfac..8a0bb785 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -8,9 +8,11 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import ru.bclib.api.spawning.SpawnRuleBuilder; import ru.bclib.util.ColorUtil; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -20,37 +22,114 @@ import ru.betterend.entity.EndFishEntity; import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.ShadowWalkerEntity; import ru.betterend.entity.SilkMothEntity; -import ru.betterend.util.SpawnHelper; public class EndEntities { - public static final EntityType DRAGONFLY = register("dragonfly", MobCategory.AMBIENT, 0.6F, 0.5F, DragonflyEntity::new, DragonflyEntity.createMobAttributes(), true, ColorUtil.color(32, 42, 176), ColorUtil.color(115, 225, 249)); - public static final EntityType END_SLIME = register("end_slime", MobCategory.MONSTER, 2F, 2F, EndSlimeEntity::new, EndSlimeEntity.createMobAttributes(), false, ColorUtil.color(28, 28, 28), ColorUtil.color(99, 11, 99)); - public static final EntityType END_FISH = register("end_fish", MobCategory.WATER_AMBIENT, 0.5F, 0.5F, EndFishEntity::new, EndFishEntity.createMobAttributes(), true, ColorUtil.color(3, 50, 76), ColorUtil.color(120, 206, 255)); - public static final EntityType SHADOW_WALKER = register("shadow_walker", MobCategory.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, ColorUtil.color(30, 30, 30), ColorUtil.color(5, 5, 5)); - public static final EntityType CUBOZOA = register("cubozoa", MobCategory.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, ColorUtil.color(151, 77, 181), ColorUtil.color(93, 176, 238)); - public static final EntityType SILK_MOTH = register("silk_moth", MobCategory.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, ColorUtil.color(198, 138, 204), ColorUtil.color(242, 220, 236)); + public static final EntityType DRAGONFLY = register( + "dragonfly", + MobCategory.AMBIENT, + 0.6F, + 0.5F, + DragonflyEntity::new, + DragonflyEntity.createMobAttributes(), + true, + ColorUtil.color(32, 42, 176), + ColorUtil.color(115, 225, 249) + ); + public static final EntityType END_SLIME = register( + "end_slime", + MobCategory.MONSTER, + 2F, + 2F, + EndSlimeEntity::new, + EndSlimeEntity.createMobAttributes(), + false, + ColorUtil.color(28, 28, 28), + ColorUtil.color(99, 11, 99) + ); + public static final EntityType END_FISH = register( + "end_fish", + MobCategory.WATER_AMBIENT, + 0.5F, + 0.5F, + EndFishEntity::new, + EndFishEntity.createMobAttributes(), + true, + ColorUtil.color(3, 50, 76), + ColorUtil.color(120, 206, 255) + ); + public static final EntityType SHADOW_WALKER = register( + "shadow_walker", + MobCategory.MONSTER, + 0.6F, + 1.95F, + ShadowWalkerEntity::new, + ShadowWalkerEntity.createMobAttributes(), + true, + ColorUtil.color(30, 30, 30), + ColorUtil.color(5, 5, 5) + ); + public static final EntityType CUBOZOA = register( + "cubozoa", + MobCategory.WATER_AMBIENT, + 0.6F, + 1F, + CubozoaEntity::new, + CubozoaEntity.createMobAttributes(), + true, + ColorUtil.color(151, 77, 181), + ColorUtil.color(93, 176, 238) + ); + public static final EntityType SILK_MOTH = register( + "silk_moth", + MobCategory.AMBIENT, + 0.6F, + 0.6F, + SilkMothEntity::new, + SilkMothEntity.createMobAttributes(), + true, + ColorUtil.color(198, 138, 204), + ColorUtil.color(242, 220, 236) + ); public static void register() { - SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); - SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); - SpawnHelper.restrictionWater(END_FISH, EndFishEntity::canSpawn); - SpawnHelper.restrictionLand(SHADOW_WALKER, ShadowWalkerEntity::canSpawn); - SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); - SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); + // Air // + SpawnRuleBuilder.start(DRAGONFLY).aboveGround(2).maxNearby(8).buildNoRestrictions(Types.MOTION_BLOCKING); + SpawnRuleBuilder.start(SILK_MOTH).aboveGround(2).maxNearby(4).buildNoRestrictions(Types.MOTION_BLOCKING); + + // Land // + SpawnRuleBuilder + .start(END_SLIME) + .notPeaceful() + .maxNearby(4, 64) + .onlyOnValidBlocks() + .customRule(EndSlimeEntity::canSpawn) + .buildNoRestrictions(Types.MOTION_BLOCKING); + + SpawnRuleBuilder.start(SHADOW_WALKER).vanillaHostile().onlyOnValidBlocks().maxNearby(8, 64).buildNoRestrictions(Types.MOTION_BLOCKING); + + // Water // + SpawnRuleBuilder.start(END_FISH).maxNearby(8, 64).buildInWater(Types.MOTION_BLOCKING); + SpawnRuleBuilder.start(CUBOZOA).maxNearby(8, 64).buildInWater(Types.MOTION_BLOCKING); } protected static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity) { ResourceLocation id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); + EntityType type = FabricEntityTypeBuilder + .create(group, entity) + .dimensions(EntityDimensions.fixed(width, height)) + .build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { return Registry.register(Registry.ENTITY_TYPE, id, type); } return type; } - private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { ResourceLocation id = BetterEnd.makeID(name); - EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)).build(); + EntityType type = FabricEntityTypeBuilder + .create(group, entity) + .dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)) + .build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { FabricDefaultAttributeRegistry.register(type, attributes); EndItems.registerEndEgg("spawn_egg_" + name, type, eggColor, dotsColor); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 30384554..ce16a082 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -1,19 +1,46 @@ package ru.betterend.registry; -import java.util.function.Function; - -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.world.entity.EntityType; +import ru.betterend.BetterEnd; +import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.entity.model.EndFishEntityModel; +import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.entity.model.SilkMothEntityModel; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; +import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.item.model.CrystaliteBootsModel; +import ru.betterend.item.model.CrystaliteChestplateModel; +import ru.betterend.item.model.CrystaliteHelmetModel; +import ru.betterend.item.model.CrystaliteLeggingsModel; + +import java.util.function.Function; public class EndEntitiesRenders { + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); + public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); + public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); + public static final ModelLayerLocation END_FISH_MODEL = registerMain("endfish"); + public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation SILK_MOTH_MODEL = registerMain("silkmoth"); + public static final ModelLayerLocation TEST_MODEL = registerMain("test"); + + public static final ModelLayerLocation ARMORED_ELYTRA = registerMain("armored_elytra"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE = registerMain("crystalite_chestplate"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE_THIN = registerMain("crystalite_chestplate_thin"); + public static final ModelLayerLocation CRYSTALITE_HELMET = registerMain("crystalite_helmet"); + public static final ModelLayerLocation CRYSTALITE_LEGGINGS = registerMain("crystalite_leggings"); + public static final ModelLayerLocation CRYSTALITE_BOOTS = registerMain("crystalite_boots"); public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); @@ -22,11 +49,27 @@ public class EndEntitiesRenders { register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); + + EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, DragonflyEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_FISH_MODEL, EndFishEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(SILK_MOTH_MODEL, SilkMothEntityModel::getTexturedModelData); + + EntityModelLayerRegistry.registerModelLayer(ARMORED_ELYTRA, ArmoredElytraModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE, CrystaliteChestplateModel::getRegularTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE_THIN, CrystaliteChestplateModel::getThinTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_HELMET, CrystaliteHelmetModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_LEGGINGS, CrystaliteLeggingsModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_BOOTS, CrystaliteBootsModel::getTexturedModelData); } - private static void register(EntityType type, Function> render) { - EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { - return render.apply(entityRenderDispatcher); - }); + private static void register(EntityType type, Function renderer) { + EntityRendererRegistry.register(type, (context) -> renderer.apply(context)); + } + + private static ModelLayerLocation registerMain(String id) { + return new ModelLayerLocation(BetterEnd.makeID(id), "main"); } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 0983d21f..dac39292 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -1,30 +1,42 @@ package ru.betterend.registry; -import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; - +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.CountConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.placement.FeatureDecorator; -import ru.bclib.api.BiomeAPI; +import net.minecraft.world.level.levelgen.placement.CountPlacement; +import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.api.features.BCLCommonFeatures; +import ru.bclib.api.features.BCLFeatureBuilder; +import ru.bclib.util.JsonFactory; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.features.DefaultFeature; +import ru.bclib.world.features.ListFeature.StructureInfo; +import ru.bclib.world.features.NBTStructureFeature.TerrainMerge; import ru.betterend.BetterEnd; -import ru.betterend.blocks.complex.StoneMaterial; +import ru.betterend.complexmaterials.StoneMaterial; +import ru.betterend.config.Configs; +import ru.betterend.world.biome.cave.EndCaveBiome; +import ru.betterend.world.biome.land.UmbraValleyBiome; import ru.betterend.world.features.BiomeIslandFeature; import ru.betterend.world.features.BlueVineFeature; +import ru.betterend.world.features.BuildingListFeature; import ru.betterend.world.features.CavePumpkinFeature; import ru.betterend.world.features.CharniaFeature; import ru.betterend.world.features.CrashedShipFeature; @@ -50,6 +62,7 @@ import ru.betterend.world.features.bushes.BushWithOuterFeature; import ru.betterend.world.features.bushes.LargeAmaranitaFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; +import ru.betterend.world.features.terrain.ArchFeature; import ru.betterend.world.features.terrain.BigAuroraCrystalFeature; import ru.betterend.world.features.terrain.DesertLakeFeature; import ru.betterend.world.features.terrain.EndLakeFeature; @@ -68,6 +81,7 @@ import ru.betterend.world.features.terrain.SulphurHillFeature; import ru.betterend.world.features.terrain.SulphuricCaveFeature; import ru.betterend.world.features.terrain.SulphuricLakeFeature; import ru.betterend.world.features.terrain.SurfaceVentFeature; +import ru.betterend.world.features.terrain.ThinArchFeature; import ru.betterend.world.features.terrain.caves.RoundCaveFeature; import ru.betterend.world.features.terrain.caves.TunelCaveFeature; import ru.betterend.world.features.trees.DragonTreeFeature; @@ -80,49 +94,51 @@ import ru.betterend.world.features.trees.MossyGlowshroomFeature; import ru.betterend.world.features.trees.PythadendronTreeFeature; import ru.betterend.world.features.trees.TenaneaFeature; import ru.betterend.world.features.trees.UmbrellaTreeFeature; -import ru.betterend.world.generator.GeneratorOptions; + +import java.io.InputStream; +import java.util.List; public class EndFeatures { // Trees // - public static final BCLFeature MOSSY_GLOWSHROOM = redisterVegetation("mossy_glowshroom", new MossyGlowshroomFeature(), 3); - public static final BCLFeature PYTHADENDRON_TREE = redisterVegetation("pythadendron_tree", new PythadendronTreeFeature(), 2); + public static final BCLFeature MOSSY_GLOWSHROOM = redisterVegetation("mossy_glowshroom", new MossyGlowshroomFeature(), 2); + public static final BCLFeature PYTHADENDRON_TREE = redisterVegetation("pythadendron_tree", new PythadendronTreeFeature(), 1); public static final BCLFeature LACUGROVE = redisterVegetation("lacugrove", new LacugroveFeature(), 4); - public static final BCLFeature DRAGON_TREE = redisterVegetation("dragon_tree", new DragonTreeFeature(), 3); - public static final BCLFeature TENANEA = redisterVegetation("tenanea", new TenaneaFeature(), 3); - public static final BCLFeature HELIX_TREE = redisterVegetation("helix_tree", new HelixTreeFeature(), 2); - public static final BCLFeature UMBRELLA_TREE = redisterVegetation("umbrella_tree", new UmbrellaTreeFeature(), 4); - public static final BCLFeature JELLYSHROOM = redisterVegetation("jellyshroom", new JellyshroomFeature(), 3); + public static final BCLFeature DRAGON_TREE = redisterVegetation("dragon_tree", new DragonTreeFeature(), 2); + public static final BCLFeature TENANEA = redisterVegetation("tenanea", new TenaneaFeature(), 2); + public static final BCLFeature HELIX_TREE = redisterVegetation("helix_tree", new HelixTreeFeature(), 1); + public static final BCLFeature UMBRELLA_TREE = redisterVegetation("umbrella_tree", new UmbrellaTreeFeature(), 2); + public static final BCLFeature JELLYSHROOM = redisterVegetation("jellyshroom", new JellyshroomFeature(), 2); public static final BCLFeature GIGANTIC_AMARANITA = redisterVegetation("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); public static final BCLFeature LUCERNIA = redisterVegetation("lucernia", new LucerniaFeature(), 3); // Bushes // - public static final BCLFeature PYTHADENDRON_BUSH = redisterVegetation("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); - public static final BCLFeature DRAGON_TREE_BUSH = redisterVegetation("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); - public static final BCLFeature TENANEA_BUSH = redisterVegetation("tenanea_bush", new TenaneaBushFeature(), 10); + public static final BCLFeature PYTHADENDRON_BUSH = redisterVegetation("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.getBark()), 3); + public static final BCLFeature DRAGON_TREE_BUSH = redisterVegetation("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.getBark()), 5); + public static final BCLFeature TENANEA_BUSH = redisterVegetation("tenanea_bush", new TenaneaBushFeature(), 6); public static final BCLFeature LUMECORN = redisterVegetation("lumecorn", new Lumecorn(), 5); public static final BCLFeature LARGE_AMARANITA = redisterVegetation("large_amaranita", new LargeAmaranitaFeature(), 5); - public static final BCLFeature LUCERNIA_BUSH = redisterVegetation("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); - public static final BCLFeature LUCERNIA_BUSH_RARE = redisterVegetation("lucernia_bush_rare", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 1); + public static final BCLFeature LUCERNIA_BUSH = redisterVegetation("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.getBark()), 10); + public static final BCLFeature LUCERNIA_BUSH_RARE = redisterVegetation("lucernia_bush_rare", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.getBark()), 1); public static final BCLFeature NEON_CACTUS = redisterVegetation("neon_cactus", new NeonCactusFeature(), 2); // Plants // - public static final BCLFeature UMBRELLA_MOSS = redisterVegetation("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); - public static final BCLFeature CREEPING_MOSS = redisterVegetation("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); + public static final BCLFeature UMBRELLA_MOSS = redisterVegetation("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 3); + public static final BCLFeature CREEPING_MOSS = redisterVegetation("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 3); public static final BCLFeature BLUE_VINE = redisterVegetation("blue_vine", new BlueVineFeature(), 1); - public static final BCLFeature CHORUS_GRASS = redisterVegetation("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 5); + public static final BCLFeature CHORUS_GRASS = redisterVegetation("chorus_grass", new SinglePlantFeature(EndBlocks.CHORUS_GRASS, 4), 3); public static final BCLFeature CRYSTAL_GRASS = redisterVegetation("crystal_grass", new SinglePlantFeature(EndBlocks.CRYSTAL_GRASS, 8, false), 5); - public static final BCLFeature SHADOW_PLANT = redisterVegetation("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 9); + public static final BCLFeature SHADOW_PLANT = redisterVegetation("shadow_plant", new SinglePlantFeature(EndBlocks.SHADOW_PLANT, 6), 5); public static final BCLFeature MURKWEED = redisterVegetation("murkweed", new SinglePlantFeature(EndBlocks.MURKWEED, 3), 2); - public static final BCLFeature NEEDLEGRASS = redisterVegetation("needlegrass", new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 2); + public static final BCLFeature NEEDLEGRASS = redisterVegetation("needlegrass", new SinglePlantFeature(EndBlocks.NEEDLEGRASS, 3), 1); public static final BCLFeature SHADOW_BERRY = redisterVegetation("shadow_berry", new SinglePlantFeature(EndBlocks.SHADOW_BERRY, 2), 1); - public static final BCLFeature BUSHY_GRASS = redisterVegetation("bushy_grass", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 20); - public static final BCLFeature BUSHY_GRASS_WG = redisterVegetation("bushy_grass_wg", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 10); - public static final BCLFeature AMBER_GRASS = redisterVegetation("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 9); - public static final BCLFeature LANCELEAF = redisterVegetation("lanceleaf", new LanceleafFeature(), 3); + public static final BCLFeature BUSHY_GRASS = redisterVegetation("bushy_grass", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 8, false), 10); + public static final BCLFeature BUSHY_GRASS_WG = redisterVegetation("bushy_grass_wg", new SinglePlantFeature(EndBlocks.BUSHY_GRASS, 5), 8); + public static final BCLFeature AMBER_GRASS = redisterVegetation("amber_grass", new SinglePlantFeature(EndBlocks.AMBER_GRASS, 6), 7); + public static final BCLFeature LANCELEAF = redisterVegetation("lanceleaf", new LanceleafFeature(), 2); public static final BCLFeature GLOW_PILLAR = redisterVegetation("glow_pillar", new GlowPillarFeature(), 1); - public static final BCLFeature TWISTED_UMBRELLA_MOSS = redisterVegetation("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 5); - public static final BCLFeature JUNGLE_GRASS = redisterVegetation("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 8); - public static final BCLFeature SMALL_JELLYSHROOM_FLOOR = redisterVegetation("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 4); + public static final BCLFeature TWISTED_UMBRELLA_MOSS = redisterVegetation("twisted_umbrella_moss", new DoublePlantFeature(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS_TALL, 6), 3); + public static final BCLFeature JUNGLE_GRASS = redisterVegetation("jungle_grass", new SinglePlantFeature(EndBlocks.JUNGLE_GRASS, 7, 3), 6); + public static final BCLFeature SMALL_JELLYSHROOM_FLOOR = redisterVegetation("small_jellyshroom_floor", new SinglePlantFeature(EndBlocks.SMALL_JELLYSHROOM, 5, 5), 2); public static final BCLFeature BLOSSOM_BERRY = redisterVegetation("blossom_berry", new SinglePlantFeature(EndBlocks.BLOSSOM_BERRY, 3, 3), 2); public static final BCLFeature BLOOMING_COOKSONIA = redisterVegetation("blooming_cooksonia", new SinglePlantFeature(EndBlocks.BLOOMING_COOKSONIA, 5), 5); public static final BCLFeature SALTEAGO = redisterVegetation("salteago", new SinglePlantFeature(EndBlocks.SALTEAGO, 5), 5); @@ -139,14 +155,16 @@ public class EndFeatures { public static final BCLFeature GLOBULAGUS = redisterVegetation("globulagus", new SinglePlantFeature(EndBlocks.GLOBULAGUS, 5, 3), 6); public static final BCLFeature CLAWFERN = redisterVegetation("clawfern", new SinglePlantFeature(EndBlocks.CLAWFERN, 5, 4), 5); public static final BCLFeature BOLUX_MUSHROOM = redisterVegetation("bolux_mushroom", new SinglePlantFeature(EndBlocks.BOLUX_MUSHROOM, 5, 5), 2); - public static final BCLFeature CHORUS_MUSHROOM = redisterVegetation("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); + public static final BCLFeature CHORUS_MUSHROOM = redisterVegetation("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 3, 5), 1); public static final BCLFeature AMBER_ROOT = redisterVegetation("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); //public static final BCLFeature PEARLBERRY = redisterVegetation("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); + public static final BCLFeature INFLEXIA = redisterVegetation("inflexia", new SinglePlantFeature(EndBlocks.INFLEXIA, 7, false, 3), 16); + public static final BCLFeature FLAMMALIX = redisterVegetation("flammalix", new SinglePlantFeature(EndBlocks.FLAMMALIX, 3, false, 7), 5); // Vines // public static final BCLFeature DENSE_VINE = redisterVegetation("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); - public static final BCLFeature TWISTED_VINE = redisterVegetation("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); - public static final BCLFeature BULB_VINE = redisterVegetation("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); + public static final BCLFeature TWISTED_VINE = redisterVegetation("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 1); + public static final BCLFeature BULB_VINE = redisterVegetation("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 3); public static final BCLFeature JUNGLE_VINE = redisterVegetation("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); // Ceil plants @@ -189,21 +207,21 @@ public class EndFeatures { public static final BCLFeature CHARNIA_ORANGE = redisterVegetation("charnia_orange", new CharniaFeature(EndBlocks.CHARNIA_ORANGE), 10); public static final BCLFeature CHARNIA_GREEN = redisterVegetation("charnia_green", new CharniaFeature(EndBlocks.CHARNIA_GREEN), 10); public static final BCLFeature MENGER_SPONGE = redisterVegetation("menger_sponge", new MengerSpongeFeature(5), 1); - public static final BCLFeature CHARNIA_RED_RARE = redisterVegetation("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); - public static final BCLFeature BIOME_ISLAND = BCLFeature.makeFeatureConfigured(BetterEnd.makeID("overworld_island"), new BiomeIslandFeature()); + public static final BCLFeature CHARNIA_RED_RARE = redisterVegetation("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED),2); + public static final BCLFeature BIOME_ISLAND = BCLFeatureBuilder.start(BetterEnd.makeID("overworld_island"), new BiomeIslandFeature()).decoration(Decoration.RAW_GENERATION).build(); public static final BCLFeature FLAMAEA = redisterVegetation("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); // Terrain // - public static final BCLFeature END_LAKE= registerLake("end_lake", new EndLakeFeature(), 4); - public static final BCLFeature END_LAKE_NORMAL= registerLake("end_lake_normal", new EndLakeFeature(), 20); - public static final BCLFeature END_LAKE_RARE= registerLake("end_lake_rare", new EndLakeFeature(), 40); - public static final BCLFeature DESERT_LAKE= registerLake("desert_lake", new DesertLakeFeature(), 8); + public static final BCLFeature END_LAKE = registerLake("end_lake", new EndLakeFeature(), 4); + public static final BCLFeature END_LAKE_NORMAL = registerLake("end_lake_normal", new EndLakeFeature(), 20); + public static final BCLFeature END_LAKE_RARE = registerLake("end_lake_rare", new EndLakeFeature(), 40); + public static final BCLFeature DESERT_LAKE = registerLake("desert_lake", new DesertLakeFeature(), 8); public static final BCLFeature ROUND_CAVE = registerRawGen("round_cave", new RoundCaveFeature(), 2); - public static final BCLFeature SPIRE = registerRawGen("spire", new SpireFeature(), 2); + public static final BCLFeature SPIRE = registerRawGen("spire", new SpireFeature(), 4); public static final BCLFeature FLOATING_SPIRE = registerRawGen("floating_spire", new FloatingSpireFeature(), 8); public static final BCLFeature GEYSER = registerRawGen("geyser", new GeyserFeature(), 8); - public static final BCLFeature SULPHURIC_LAKE= registerLake("sulphuric_lake", new SulphuricLakeFeature(), 8); - public static final BCLFeature SULPHURIC_CAVE = BCLFeature.makeCountRawFeature(BetterEnd.makeID("sulphuric_cave"), new SulphuricCaveFeature(), 2); + public static final BCLFeature SULPHURIC_LAKE = registerLake("sulphuric_lake", new SulphuricLakeFeature(), 8); + public static final BCLFeature SULPHURIC_CAVE = BCLCommonFeatures.makeCountFeature(BetterEnd.makeID("sulphuric_cave"), Decoration.RAW_GENERATION, new SulphuricCaveFeature(), 2); public static final BCLFeature ICE_STAR = registerRawGen("ice_star", new IceStarFeature(5, 15, 10, 25), 15); public static final BCLFeature ICE_STAR_SMALL = registerRawGen("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); public static final BCLFeature SURFACE_VENT = registerChanced("surface_vent", new SurfaceVentFeature(), 4); @@ -211,12 +229,18 @@ public class EndFeatures { public static final BCLFeature OBSIDIAN_PILLAR_BASEMENT = registerChanced("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); public static final BCLFeature OBSIDIAN_BOULDER = registerChanced("obsidian_boulder", new ObsidianBoulderFeature(), 10); public static final BCLFeature FALLEN_PILLAR = registerChanced("fallen_pillar", new FallenPillarFeature(), 20); - public static final BCLFeature TUNEL_CAVE = BCLFeature.makeChunkFeature(BetterEnd.makeID("tunel_cave"), new TunelCaveFeature()); + public static final BCLFeature TUNEL_CAVE = BCLCommonFeatures.makeChunkFeature(BetterEnd.makeID("tunel_cave"), Decoration.RAW_GENERATION, new TunelCaveFeature()); + public static final BCLFeature UMBRALITH_ARCH = registerChanced("umbralith_arch", new ArchFeature( + EndBlocks.UMBRALITH.stone, + pos -> UmbraValleyBiome.getSurface(pos.getX(), pos.getZ()).defaultBlockState() + ), 10); + public static final BCLFeature THIN_UMBRALITH_ARCH = registerChanced("thin_umbralith_arch", new ThinArchFeature(EndBlocks.UMBRALITH.stone), 15); // Ores // - public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); - public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); - public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); + public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 24, 8); + public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 12, 4); + public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 60, 6); + public static final BCLFeature DRAGON_BONE_BLOCK_ORE = registerOre("dragon_bone_ore", EndBlocks.DRAGON_BONE_BLOCK, 24, 8); public static final BCLFeature VIOLECITE_LAYER = registerLayer("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); public static final BCLFeature FLAVOLITE_LAYER = registerLayer("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); @@ -234,35 +258,53 @@ public class EndFeatures { public static final DefaultFeature CAVE_GRASS = new SingleBlockFeature(EndBlocks.CAVE_GRASS); public static final DefaultFeature RUBINEA = new VineFeature(EndBlocks.RUBINEA, 8); public static final DefaultFeature MAGNULA = new VineFeature(EndBlocks.MAGNULA, 8); - public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE, Blocks.END_STONE); - public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); - public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); + public static final DefaultFeature END_STONE_STALACTITE = new StalactiteFeature( + true, + EndBlocks.END_STONE_STALACTITE, + Blocks.END_STONE + ); + public static final DefaultFeature END_STONE_STALAGMITE = new StalactiteFeature( + false, + EndBlocks.END_STONE_STALACTITE, + Blocks.END_STONE + ); + public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature( + true, + EndBlocks.END_STONE_STALACTITE_CAVEMOSS, + Blocks.END_STONE, + EndBlocks.CAVE_MOSS + ); + public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature( + false, + EndBlocks.END_STONE_STALACTITE_CAVEMOSS, + EndBlocks.CAVE_MOSS + ); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); private static BCLFeature redisterVegetation(String name, Feature feature, int density) { - return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); + ResourceLocation id = BetterEnd.makeID(name); + return BCLFeatureBuilder.start(id, feature).countLayersMax(density).onlyInBiome().build(); } private static BCLFeature registerRawGen(String name, Feature feature, int chance) { - return BCLFeature.makeRawGenFeature(BetterEnd.makeID(name), feature, chance); + return BCLCommonFeatures.makeChancedFeature(BetterEnd.makeID(name), Decoration.RAW_GENERATION, feature, chance); } private static BCLFeature registerLake(String name, Feature feature, int chance) { - return BCLFeature.makeLakeFeature(BetterEnd.makeID(name), feature, chance); + return BCLCommonFeatures.makeChancedFeature(BetterEnd.makeID(name), Decoration.LAKES, feature, chance); } private static BCLFeature registerChanced(String name, Feature feature, int chance) { - return BCLFeature.makeChansedFeature(BetterEnd.makeID(name), feature, chance); + return BCLCommonFeatures.makeChancedFeature(BetterEnd.makeID(name), Decoration.SURFACE_STRUCTURES, feature, chance); } - private static BCLFeature registerOre(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) { - return BCLFeature.makeOreFeature(BetterEnd.makeID(name), blockOre, veins, veinSize, offset, minY, maxY); + private static BCLFeature registerOre(String name, Block blockOre, int veins, int veinSize) { + return BCLCommonFeatures.makeOreFeature(BetterEnd.makeID(name), blockOre, Blocks.END_STONE, veins, veinSize, 0, HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(128)), false); } private static BCLFeature registerLayer(String name, Block block, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); - ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + PlacedFeature configured = layer.configured(FeatureConfiguration.NONE).placed(new PlacementModifier[]{CountPlacement.of(count)}); return new BCLFeature(BetterEnd.makeID(name), layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } @@ -270,72 +312,81 @@ public class EndFeatures { return registerLayer(name, material.stone, radius, minY, maxY, count); } - public static void registerBiomeFeatures(ResourceLocation id, Biome biome, List>>> features) { + public static void addBiomeFeatures(ResourceLocation id, Biome biome) { + BiomeAPI.addBiomeFeature(biome, FLAVOLITE_LAYER); + BiomeAPI.addBiomeFeature(biome, THALLASIUM_ORE); + BiomeAPI.addBiomeFeature(biome, ENDER_ORE); + BiomeAPI.addBiomeFeature(biome, CRASHED_SHIP); + + BCLBiome bclbiome = BiomeAPI.getBiome(id); + BCLFeature feature = getBiomeStructures(bclbiome); + if (feature != null) { + BiomeAPI.addBiomeFeature(biome, feature); + } + if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; } - if (GeneratorOptions.removeChorusFromVanillaBiomes()) { - if (id.getNamespace().equals("minecraft")) { - String path = id.getPath(); - if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { - int pos = GenerationStep.Decoration.VEGETAL_DECORATION.ordinal(); - if (pos < features.size()) { - List>> list = features.get(pos); - // If only chorus plants are enabled - if (list.size() == 1) { - features.get(pos).clear(); - } - } + boolean hasCaves = bclbiome.getCustomData("has_caves", true) && !(bclbiome instanceof EndCaveBiome); + if (hasCaves && !BiomeAPI.END_VOID_BIOME_PICKER.containsImmutable(id)) { + if (Configs.BIOME_CONFIG.getBoolean(id, "hasCaves", true)) { + BiomeAPI.addBiomeFeature(biome, ROUND_CAVE); + BiomeAPI.addBiomeFeature(biome, TUNEL_CAVE); + } + } + } + + private static BCLFeature getBiomeStructures(BCLBiome biome) { + String ns = biome.getID().getNamespace(); + String nm = biome.getID().getPath(); + ResourceLocation id = new ResourceLocation(ns, nm + "_structures"); + + if (BuiltinRegistries.PLACED_FEATURE.containsKey(id)) { + PlacedFeature placed = BuiltinRegistries.PLACED_FEATURE.get(id); + Feature feature = Registry.FEATURE.get(id); + return new BCLFeature(id, feature, Decoration.SURFACE_STRUCTURES, placed); + } + + String path = "/data/" + ns + "/structures/biome/" + nm + "/"; + InputStream inputstream = EndFeatures.class.getResourceAsStream(path + "structures.json"); + if (inputstream != null) { + JsonObject obj = JsonFactory.getJsonObject(inputstream); + JsonArray structures = obj.getAsJsonArray("structures"); + if (structures != null) { + List list = Lists.newArrayList(); + structures.forEach((entry) -> { + JsonObject e = entry.getAsJsonObject(); + String structure = path + e.get("nbt").getAsString() + ".nbt"; + TerrainMerge terrainMerge = TerrainMerge.getFromString(e.get("terrainMerge").getAsString()); + int offsetY = e.get("offsetY").getAsInt(); + list.add(new StructureInfo(structure, offsetY, terrainMerge)); + }); + if (!list.isEmpty()) { + return BCLCommonFeatures.makeChancedFeature( + new ResourceLocation(ns, nm + "_structures"), + Decoration.SURFACE_STRUCTURES, + new BuildingListFeature(list, Blocks.END_STONE.defaultBlockState()), + 10 + ); } } } - - addFeature(FLAVOLITE_LAYER, features); - addFeature(THALLASIUM_ORE, features); - addFeature(ENDER_ORE, features); - addFeature(CRASHED_SHIP, features); - - BCLBiome bclbiome = BiomeAPI.getBiome(id); - boolean hasCaves = bclbiome.getCustomData("has_caves", true); - if (hasCaves && !EndBiomes.VOID_BIOMES.containsImmutable(id)) { - addFeature(ROUND_CAVE, features); - addFeature(TUNEL_CAVE, features); - } - - BCLFeature feature = BiomeAPI.getBiome(id).getStructuresFeature(); - if (feature != null) { - addFeature(feature, features); - } + return null; } - public static void addDefaultFeatures(BCLBiomeDef def) { - def.addFeature(FLAVOLITE_LAYER); - def.addFeature(THALLASIUM_ORE); - def.addFeature(ENDER_ORE); - def.addFeature(CRASHED_SHIP); + public static BCLBiomeBuilder addDefaultFeatures(BCLBiomeBuilder builder, boolean hasCaves) { + builder.feature(FLAVOLITE_LAYER); + builder.feature(THALLASIUM_ORE); + builder.feature(ENDER_ORE); + builder.feature(CRASHED_SHIP); - boolean hasCaves = def.getCustomData("has_caves", true); if (hasCaves) { - def.addFeature(ROUND_CAVE); - def.addFeature(TUNEL_CAVE); - } - } - - private static void addFeature(BCLFeature feature, List>>> features) { - int index = feature.getFeatureStep().ordinal(); - if (features.size() > index) { - features.get(index).add(() -> { - return feature.getFeatureConfigured(); - }); - } - else { - List>> newFeature = Lists.newArrayList(); - newFeature.add(() -> { - return feature.getFeatureConfigured(); - }); - features.add(newFeature); + builder.feature(ROUND_CAVE); + builder.feature(TUNEL_CAVE); } + + return builder; } public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index f37b456a..13ed5bfb 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -1,31 +1,25 @@ package ru.betterend.registry; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.Tiers; +import org.jetbrains.annotations.NotNull; import ru.bclib.items.BaseArmorItem; import ru.bclib.items.tool.BaseAxeItem; import ru.bclib.items.tool.BaseHoeItem; -import ru.bclib.items.tool.BasePickaxeItem; import ru.bclib.items.tool.BaseShovelItem; import ru.bclib.items.tool.BaseSwordItem; -import ru.bclib.registry.ItemsRegistry; +import ru.bclib.registry.ItemRegistry; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.item.ArmoredElytra; @@ -35,14 +29,20 @@ import ru.betterend.item.CrystaliteElytra; import ru.betterend.item.CrystaliteHelmet; import ru.betterend.item.CrystaliteLeggings; import ru.betterend.item.EnchantedItem; +import ru.betterend.item.EndArmorItem; import ru.betterend.item.EndBucketItem; import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndPickaxe; import ru.betterend.tab.CreativeTabs; -public class EndItems extends ItemsRegistry { +import java.util.List; + +public class EndItems { + private static final ItemRegistry REGISTRY = new ItemRegistry(CreativeTabs.TAB_ITEMS, Configs.ITEM_CONFIG); + // Materials // public final static Item ENDER_DUST = registerEndItem("ender_dust"); public final static Item ENDER_SHARD = registerEndItem("ender_shard"); @@ -64,13 +64,32 @@ public class EndItems extends ItemsRegistry { public final static Item SILK_FIBER = registerEndItem("silk_fiber"); public final static Item LUMECORN_ROD = registerEndItem("lumecorn_rod"); public final static Item SILK_MOTH_MATRIX = registerEndItem("silk_moth_matrix"); - public final static Item ENCHANTED_MEMBRANE = registerEndItem("enchanted_membrane", new EnchantedItem(Items.PHANTOM_MEMBRANE)); - + public final static Item ENCHANTED_MEMBRANE = registerEndItem( + "enchanted_membrane", + new EnchantedItem(Items.PHANTOM_MEMBRANE) + ); + // Music Discs - public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerEndDisc("music_disc_strange_and_alien", 0, EndSounds.RECORD_STRANGE_AND_ALIEN); - public final static Item MUSIC_DISC_GRASPING_AT_STARS = registerEndDisc("music_disc_grasping_at_stars", 0, EndSounds.RECORD_GRASPING_AT_STARS); - public final static Item MUSIC_DISC_ENDSEEKER = registerEndDisc("music_disc_endseeker", 0, EndSounds.RECORD_ENDSEEKER); - public final static Item MUSIC_DISC_EO_DRACONA = registerEndDisc("music_disc_eo_dracona", 0, EndSounds.RECORD_EO_DRACONA); + public final static Item MUSIC_DISC_STRANGE_AND_ALIEN = registerEndDisc( + "music_disc_strange_and_alien", + 0, + EndSounds.RECORD_STRANGE_AND_ALIEN + ); + public final static Item MUSIC_DISC_GRASPING_AT_STARS = registerEndDisc( + "music_disc_grasping_at_stars", + 0, + EndSounds.RECORD_GRASPING_AT_STARS + ); + public final static Item MUSIC_DISC_ENDSEEKER = registerEndDisc( + "music_disc_endseeker", + 0, + EndSounds.RECORD_ENDSEEKER + ); + public final static Item MUSIC_DISC_EO_DRACONA = registerEndDisc( + "music_disc_eo_dracona", + 0, + EndSounds.RECORD_EO_DRACONA + ); // Armor // public static final Item AETERNIUM_HELMET = registerEndItem("aeternium_helmet", new BaseArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeEndItemSettings().fireResistant())); @@ -83,11 +102,11 @@ public class EndItems extends ItemsRegistry { public static final Item CRYSTALITE_BOOTS = registerEndItem("crystalite_boots", new CrystaliteBoots()); public static final Item ARMORED_ELYTRA = registerEndItem("elytra_armored", new ArmoredElytra("elytra_armored", EndArmorMaterial.AETERNIUM, Items.PHANTOM_MEMBRANE, 900, 0.975D, true)); public static final Item CRYSTALITE_ELYTRA = registerEndItem("elytra_crystalite", new CrystaliteElytra(650, 0.99D)); - + // Tools // public static final TieredItem AETERNIUM_SHOVEL = registerEndTool("aeternium_shovel", new BaseShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_SWORD = registerEndTool("aeternium_sword", new BaseSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeEndItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_PICKAXE = registerEndTool("aeternium_pickaxe", new BasePickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeEndItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_PICKAXE = registerEndTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_AXE = registerEndTool("aeternium_axe", new BaseAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HOE = registerEndTool("aeternium_hoe", new BaseHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HAMMER = registerEndTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeEndItemSettings().fireResistant())); @@ -100,8 +119,8 @@ public class EndItems extends ItemsRegistry { public final static Item AETERNIUM_HAMMER_HEAD = registerEndItem("aeternium_hammer_head"); public final static Item AETERNIUM_SWORD_BLADE = registerEndItem("aeternium_sword_blade"); public final static Item AETERNIUM_SWORD_HANDLE = registerEndItem("aeternium_sword_handle"); - - // Hammers // + + // ITEM_HAMMERS // public static final TieredItem IRON_HAMMER = registerEndTool("iron_hammer", new EndHammerItem(Tiers.IRON, 5.0F, -3.2F, 0.2D, makeEndItemSettings())); public static final TieredItem GOLDEN_HAMMER = registerEndTool("golden_hammer", new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeEndItemSettings())); public static final TieredItem DIAMOND_HAMMER = registerEndTool("diamond_hammer", new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeEndItemSettings())); @@ -113,7 +132,7 @@ public class EndItems extends ItemsRegistry { public final static Item END_FISH_RAW = registerEndFood("end_fish_raw", Foods.SALMON); public final static Item END_FISH_COOKED = registerEndFood("end_fish_cooked", Foods.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerEndItem("bucket_end_fish", new EndBucketItem(EndEntities.END_FISH)); - public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA)); + public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA)); public final static Item SWEET_BERRY_JELLY = registerEndFood("sweet_berry_jelly", 8, 0.7F); public final static Item SHADOW_BERRY_JELLY = registerEndFood("shadow_berry_jelly", 6, 0.8F, new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY_JELLY = registerEndFood("blossom_berry_jelly", 8, 0.7F); @@ -123,96 +142,58 @@ public class EndItems extends ItemsRegistry { public final static Item CHORUS_MUSHROOM_COOKED = registerEndFood("chorus_mushroom_cooked", Foods.MUSHROOM_STEW); public final static Item BOLUX_MUSHROOM_COOKED = registerEndFood("bolux_mushroom_cooked", Foods.MUSHROOM_STEW); public final static Item CAVE_PUMPKIN_PIE = registerEndFood("cave_pumpkin_pie", Foods.PUMPKIN_PIE); - + // Drinks // public final static Item UMBRELLA_CLUSTER_JUICE = registerEndDrink("umbrella_cluster_juice", 5, 0.7F); - - private static ItemsRegistry itemRegistry; - - protected EndItems(CreativeModeTab creativeTab) { - super(creativeTab); - } - + public static List getModItems() { - return getModItems(BetterEnd.MOD_ID); + return REGISTRY.getModItems(BetterEnd.MOD_ID); } - + public static Item registerEndDisc(String name, int power, SoundEvent sound) { - return getItemRegistry().registerDisc(name, power, sound); + return getItemRegistry().registerDisc(BetterEnd.makeID(name), power, sound); } public static Item registerEndItem(String name) { - return getItemRegistry().registerItem(name); + return getItemRegistry().register(BetterEnd.makeID(name)); } public static Item registerEndItem(String name, Item item) { + if (item instanceof EndArmorItem) { + return getItemRegistry().register(BetterEnd.makeID(name), item, "armour"); + } return getItemRegistry().register(BetterEnd.makeID(name), item); } - public static Item registerEndItem(ResourceLocation id, Item item) { - if (item instanceof ArmorItem) { - return registerEndArmor(id, item); - } - if (!Configs.ITEM_CONFIG.getBoolean("items", id.getPath(), true)) { - return item; - } - getItemRegistry().register(id, item); - return item; - } - - private static Item registerEndArmor(ResourceLocation itemId, Item item) { - if (!Configs.ITEM_CONFIG.getBoolean("armor", itemId.getPath(), true)) { - return item; - } - getItemRegistry().register(itemId, item); - return item; - } - public static TieredItem registerEndTool(String name, TieredItem item) { if (!Configs.ITEM_CONFIG.getBoolean("tools", name, true)) { return item; } - return getItemRegistry().registerTool(name, item); + return (TieredItem)getItemRegistry().registerTool(BetterEnd.makeID(name), item); } - public static Item registerEndEgg(String name, EntityType type, int background, int dots) { - return getItemRegistry().registerEgg(name, type, background, dots); + public static Item registerEndEgg(String name, EntityType type, int background, int dots) { + return getItemRegistry().registerEgg(BetterEnd.makeID(name), type, background, dots); } public static Item registerEndFood(String name, int hunger, float saturation, MobEffectInstance... effects) { - return getItemRegistry().registerFood(name, hunger, saturation, effects); + return getItemRegistry().registerFood(BetterEnd.makeID(name), hunger, saturation, effects); } public static Item registerEndFood(String name, FoodProperties foodComponent) { - return getItemRegistry().registerFood(name, foodComponent); - } - - public static Item registerEndDrink(String name) { - return getItemRegistry().registerDrink(name); - } - - public static Item registerEndDrink(String name, FoodProperties foodComponent) { - return getItemRegistry().registerDrink(name, foodComponent); + return getItemRegistry().registerFood(BetterEnd.makeID(name), foodComponent); } public static Item registerEndDrink(String name, int hunger, float saturation) { - return getItemRegistry().registerDrink(name, hunger, saturation); + return getItemRegistry().registerDrink(BetterEnd.makeID(name), hunger, saturation); } - + public static FabricItemSettings makeEndItemSettings() { - return itemRegistry.makeItemSettings(); + return getItemRegistry().makeItemSettings(); } - - @Override - public ResourceLocation createModId(String name) { - return BetterEnd.makeID(name); - } - + @NotNull - private static ItemsRegistry getItemRegistry() { - if (itemRegistry == null) { - itemRegistry = new EndItems(CreativeTabs.TAB_ITEMS); - } - return itemRegistry; + public static ItemRegistry getItemRegistry() { + return REGISTRY; } } diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index 80952641..bf43f23e 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -2,12 +2,12 @@ package ru.betterend.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry; import ru.betterend.item.model.CrystaliteArmorProvider; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) public class EndModelProviders { - + public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); public final static void register() { diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index 2fb673a6..eef59ab0 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -23,7 +23,10 @@ import ru.betterend.particle.SmaragdantParticle; public class EndParticles { public static final SimpleParticleType GLOWING_SPHERE = register("glowing_sphere"); public static final SimpleParticleType PORTAL_SPHERE = register("portal_sphere"); - public static final ParticleType INFUSION = register("infusion", FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY)); + public static final ParticleType INFUSION = register( + "infusion", + FabricParticleTypes.complex(InfusionParticleType.PARAMETERS_FACTORY) + ); public static final SimpleParticleType SULPHUR_PARTICLE = register("sulphur_particle"); public static final SimpleParticleType GEYSER_PARTICLE = registerFar("geyser_particle"); public static final SimpleParticleType SNOWFLAKE = register("snowflake"); diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index e09d0ac2..2d3d905e 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -1,10 +1,7 @@ package ru.betterend.registry; -import java.io.File; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -15,10 +12,12 @@ import ru.bclib.util.JsonFactory; import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; +import java.io.File; + public class EndPortals { - + public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.location(); - + private static PortalInfo[] portals; public static void loadPortals() { @@ -27,7 +26,8 @@ public class EndPortals { if (!file.exists()) { file.getParentFile().mkdirs(); json = makeDefault(file); - } else { + } + else { json = JsonFactory.getJsonObject(file); } if (!json.has("portals") || !json.get("portals").isJsonArray()) { @@ -54,7 +54,7 @@ public class EndPortals { } return portals[portalId].getWorld(server); } - + public static ResourceLocation getWorldId(int portalId) { if (portalId < 0 || portalId >= portals.length) { return OVERWORLD_ID; @@ -70,6 +70,7 @@ public class EndPortals { } return 0; } + public static int getPortalIdByWorld(ResourceLocation world) { for (int i = 0; i < portals.length; i++) { if (portals[i].dimension.equals(world)) { @@ -103,7 +104,13 @@ public class EndPortals { } private static PortalInfo makeDefault() { - return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); + return new PortalInfo( + new ResourceLocation("minecraft:overworld"), + BetterEnd.makeID("eternal_crystal"), + 255, + 255, + 255 + ); } private static class PortalInfo { diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index c0ecf7eb..354d11a0 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -23,6 +23,8 @@ public class EndSounds { public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); public static final SoundEvent AMBIENT_CAVES = register("ambient", "caves"); + public static final SoundEvent AMBIENT_AMBER_LAND = register("ambient", "amber_land"); + public static final SoundEvent UMBRA_VALLEY = register("ambient", "umbra_valley"); // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); @@ -36,7 +38,8 @@ public class EndSounds { public static final SoundEvent RECORD_ENDSEEKER = register("record", "endseeker"); public static final SoundEvent RECORD_EO_DRACONA = register("record", "eo_dracona"); - public static void register() {} + public static void register() { + } private static SoundEvent register(String type, String id) { id = "betterend." + type + "." + id; diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index c3ed2370..32edb605 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -1,16 +1,13 @@ package ru.betterend.registry; -import java.util.Collection; -import java.util.function.Supplier; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.world.structures.BCLStructureFeature; import ru.betterend.BetterEnd; -import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.EternalPortalStructure; import ru.betterend.world.structures.features.GiantIceStarStructure; import ru.betterend.world.structures.features.GiantMossyGlowshroomStructure; @@ -33,13 +30,55 @@ public class EndStructures { public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Decoration.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Decoration.RAW_GENERATION, 4, 1); - public static final EndStructureFeature MOUNTAIN = new EndStructureFeature("mountain", new MountainStructure(), Decoration.RAW_GENERATION, 3, 2); - public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Decoration.RAW_GENERATION, 3, 2); - public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Decoration.SURFACE_STRUCTURES, 16, 6); - public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); + public static final BCLStructureFeature GIANT_MOSSY_GLOWSHROOM = new BCLStructureFeature( + BetterEnd.makeID("giant_mossy_glowshroom"), + new GiantMossyGlowshroomStructure(), + Decoration.SURFACE_STRUCTURES, + 16, + 8 + ); + public static final BCLStructureFeature MEGALAKE = new BCLStructureFeature( + BetterEnd.makeID("megalake"), + new MegaLakeStructure(), + Decoration.RAW_GENERATION, + 4, + 1 + ); + public static final BCLStructureFeature MEGALAKE_SMALL = new BCLStructureFeature( + BetterEnd.makeID("megalake_small"), + new MegaLakeSmallStructure(), + Decoration.RAW_GENERATION, + 4, + 1 + ); + public static final BCLStructureFeature MOUNTAIN = new BCLStructureFeature( + BetterEnd.makeID("mountain"), + new MountainStructure(), + Decoration.RAW_GENERATION, + 3, + 2 + ); + public static final BCLStructureFeature PAINTED_MOUNTAIN = new BCLStructureFeature( + BetterEnd.makeID("painted_mountain"), + new PaintedMountainStructure(), + Decoration.RAW_GENERATION, + 3, + 2 + ); + public static final BCLStructureFeature ETERNAL_PORTAL = new BCLStructureFeature( + BetterEnd.makeID("eternal_portal"), + new EternalPortalStructure(), + Decoration.SURFACE_STRUCTURES, + 16, + 6 + ); + public static final BCLStructureFeature GIANT_ICE_STAR = new BCLStructureFeature( + BetterEnd.makeID("giant_ice_star"), + new GiantIceStarStructure(), + Decoration.SURFACE_STRUCTURES, + 16, + 8 + ); public static void register() {} @@ -47,13 +86,9 @@ public class EndStructures { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - public static void registerBiomeStructures(ResourceLocation id, Biome biome, Collection>> structures) { - if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { - addStructure(ETERNAL_PORTAL, structures); + public static void addBiomeStructures(ResourceLocation biomeID, Biome biome) { + if (!biomeID.getPath().contains("mountain") && !biomeID.getPath().contains("lake")) { + BiomeAPI.addBiomeStructure(BiomeAPI.getBiomeKey(biome), ETERNAL_PORTAL); } } - - private static void addStructure(EndStructureFeature feature, Collection>> structures) { - structures.add(() -> { return feature.getFeatureConfigured(); }); - } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 7ce95c65..569932b9 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,160 +1,147 @@ package ru.betterend.registry; -import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; - -import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; +import net.fabricmc.fabric.mixin.object.builder.AbstractBlockAccessor; +import net.fabricmc.fabric.mixin.object.builder.AbstractBlockSettingsAccessor; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Named; -import net.minecraft.tags.TagCollection; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; import net.minecraft.world.level.material.Material; import ru.bclib.api.BonemealAPI; +import ru.bclib.api.ComposterAPI; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseVineBlock; import ru.bclib.blocks.SimpleLeavesBlock; -import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.item.tool.EndHammerItem; -import ru.betterend.mixin.common.ComposterBlockAccessor; + +import java.util.List; public class EndTags { // Table with common (c) tags: // https://fabricmc.net/wiki/tutorial:tags // Block Tags - public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); - public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); - public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); - + public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); + // Item Tags - public final static Tag.Named HAMMERS = makeFabricItemTag("hammers"); - - public static Tag.Named makeTag(Supplier> containerSupplier, ResourceLocation id) { - Tag tag = containerSupplier.get().getTag(id); - return tag == null ? TagRegistry.create(id, containerSupplier) : (Named) tag; - } - - public static Tag.Named makeBlockTag(String name) { - return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeItemTag(String name) { - return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeCommonBlockTag(String name) { - return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeCommonItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeFabricItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("fabric", name)); - } - - public static Tag.Named getMCBlockTag(String name) { - ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; - } + public static final Tag.Named ALLOYING_IRON = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_iron"); + public static final Tag.Named ALLOYING_GOLD = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_gold"); + public static final Tag.Named ALLOYING_COPPER = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_copper"); public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); TagAPI.addEndGround(EndBlocks.ENDSTONE_DUST); TagAPI.addEndGround(EndBlocks.AMBER_ORE); - + EndBlocks.getModBlocks().forEach(block -> { + Properties properties = ((AbstractBlockAccessor) block).getSettings(); + Material material = ((AbstractBlockSettingsAccessor) properties).getMaterial(); + final Item item = block.asItem(); + + if (material.equals(Material.STONE) || material.equals(Material.METAL) || material.equals(Material.HEAVY_METAL)) { + TagAPI.addTag(TagAPI.MINEABLE_PICKAXE, block); + } + else if (material.equals(Material.WOOD)) { + TagAPI.addTag(TagAPI.MINEABLE_AXE, block); + } + else if (material.equals(Material.LEAVES) || material.equals(Material.PLANT) || material.equals(Material.WATER_PLANT) || material.equals(Material.SPONGE)) { + TagAPI.addTag(TagAPI.MINEABLE_HOE, block); + } + else if (material.equals(Material.SAND)) { + TagAPI.addTag(TagAPI.MINEABLE_SHOVEL, block); + } + if (block instanceof EndTerrainBlock) { TagAPI.addEndGround(block); - TagHelper.addTag(BlockTags.NYLIUM, block); - BonemealAPI.addSpreadableBlock(block); + TagAPI.addTag(BlockTags.NYLIUM, block); + BonemealAPI.addSpreadableBlock(block, Blocks.END_STONE); } else if (block instanceof LeavesBlock || block instanceof SimpleLeavesBlock) { - TagHelper.addTag(BlockTags.LEAVES, block); - ComposterBlockAccessor.callAdd(0.3F, block); + TagAPI.addTag(BlockTags.LEAVES, block); + ComposterAPI.allowCompost(0.3f, item); } else if (block instanceof BaseVineBlock) { - TagHelper.addTag(BlockTags.CLIMBABLE, block); + TagAPI.addTag(BlockTags.CLIMBABLE, block); } else if (block instanceof PedestalBlock) { - TagHelper.addTag(PEDESTALS, block); + TagAPI.addTag(PEDESTALS, block); } Material mat = block.defaultBlockState().getMaterial(); if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { - ComposterBlockAccessor.callAdd(0.1F, block); + ComposterAPI.allowCompost(0.1F, item); } }); - BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS); + TagAPI.addEndGround(EndBlocks.CAVE_MOSS); + TagAPI.addTag(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); + BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS, Blocks.END_STONE); + BonemealAPI.addSpreadableBlock(EndBlocks.MOSSY_OBSIDIAN, Blocks.OBSIDIAN); + BonemealAPI.addSpreadableBlock(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.DRAGON_BONE_BLOCK); - List hammers = Lists.newArrayList(); - EndItems.getModItems(BetterEnd.MOD_ID).forEach(item -> { + List ITEM_HAMMERS = Lists.newArrayList(); + EndItems.getModItems().forEach(item -> { if (item.isEdible()) { FoodProperties food = item.getFoodProperties(); if (food != null) { float compost = food.getNutrition() * food.getSaturationModifier() * 0.18F; - ComposterBlockAccessor.callAdd(compost, item); + ComposterAPI.allowCompost(compost, item); } } if (item instanceof EndHammerItem) { - hammers.add(item); + ITEM_HAMMERS.add(item); } }); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); + ToolManagerImpl.tag(TagAPI.ITEM_HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(ITEM_HAMMERS)); + TagAPI.addTag(TagAPI.ITEM_HAMMERS, EndItems.AETERNIUM_HAMMER); - TagHelper.addTag( - TagAPI.GEN_TERRAIN, + TagAPI.addTag( + TagAPI.BLOCK_GEN_TERRAIN, EndBlocks.ENDER_ORE, - EndBlocks.FLAVOLITE.stone, - EndBlocks.VIOLECITE.stone, - EndBlocks.SULPHURIC_ROCK.stone, - EndBlocks.BRIMSTONE, - EndBlocks.VIRID_JADESTONE.stone, - EndBlocks.AZURE_JADESTONE.stone, - EndBlocks.SANDY_JADESTONE.stone + EndBlocks.BRIMSTONE ); - TagHelper.addTag(TagAPI.END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); - TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); - TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); - TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, + TagAPI.addTag(TagAPI.BLOCK_END_GROUND, EndBlocks.BRIMSTONE); + TagAPI.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); + TagAPI.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); + TagAPI.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); + TagAPI.addTag( + TagAPI.BLOCK_DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED ); - TagHelper.addTag(TagAPI.IRON_INGOTS, EndBlocks.THALLASIUM.ingot); + TagAPI.addTag(TagAPI.ITEM_IRON_INGOTS, EndBlocks.THALLASIUM.ingot); + + TagAPI.addTag(ALLOYING_IRON, Items.IRON_ORE, Items.DEEPSLATE_IRON_ORE, Items.RAW_IRON); + TagAPI.addTag(ALLOYING_GOLD, Items.GOLD_ORE, Items.DEEPSLATE_GOLD_ORE, Items.RAW_GOLD); + TagAPI.addTag(ALLOYING_COPPER, Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER); } + // TODO make getter for biome top blocks public static void addTerrainTags(Registry biomeRegistry) { - biomeRegistry.forEach((biome) -> { + /*biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == BiomeCategory.THEEND) { SurfaceBuilderConfiguration config = biome.getGenerationSettings().getSurfaceBuilderConfig(); Block under = config.getUnderMaterial().getBlock(); Block surface = config.getTopMaterial().getBlock(); - TagHelper.addTag(TagAPI.GEN_TERRAIN, under, surface); - TagHelper.addTag(TagAPI.END_GROUND, surface); + TagAPI.addTag(TagAPI.BLOCK_GEN_TERRAIN, under, surface); + TagAPI.addTag(TagAPI.BLOCK_END_GROUND, surface); } }); - END_STONES.getValues().forEach(TagAPI::addEndGround); + TagAPI.BLOCK_END_STONES.getValues().forEach(TagAPI::addEndGround);*/ } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 1d7ebbdc..c2df4716 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -1,24 +1,13 @@ package ru.betterend.rituals; -import java.awt.Point; -import java.util.List; -import java.util.Objects; -import java.util.Random; -import java.util.Set; -import java.util.function.Predicate; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.Features; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; @@ -37,6 +26,7 @@ import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.material.Material; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BlockProperties; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPortalBlock; @@ -46,62 +36,95 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndPortals; +import java.awt.Point; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.Set; +import java.util.function.Predicate; + public class EternalRitual { private final static Set STRUCTURE_MAP = Sets.newHashSet( - new Point(-4, -5), new Point(-4, 5), new Point(-6, 0), - new Point(4, -5), new Point(4, 5), new Point(6, 0)); + new Point(-4, -5), + new Point(-4, 5), + new Point(-6, 0), + new Point(4, -5), + new Point(4, 5), + new Point(6, 0) + ); private final static Set FRAME_MAP = Sets.newHashSet( - new Point(0, 0), new Point(0, 6), new Point(1, 0), - new Point(1, 6), new Point(2, 1), new Point(2, 5), - new Point(3, 2), new Point(3, 3), new Point(3, 4)); + new Point(0, 0), + new Point(0, 6), + new Point(1, 0), + new Point(1, 6), + new Point(2, 1), + new Point(2, 5), + new Point(3, 2), + new Point(3, 3), + new Point(3, 4) + ); private final static Set PORTAL_MAP = Sets.newHashSet( - new Point(0, 0), new Point(0, 1), new Point(0, 2), - new Point(0, 3), new Point(0, 4), new Point(1, 0), - new Point(1, 1), new Point(1, 2), new Point(1, 3), - new Point(1, 4), new Point(2, 1), new Point(2, 2), - new Point(2, 3)); + new Point(0, 0), + new Point(0, 1), + new Point(0, 2), + new Point(0, 3), + new Point(0, 4), + new Point(1, 0), + new Point(1, 1), + new Point(1, 2), + new Point(1, 3), + new Point(1, 4), + new Point(2, 1), + new Point(2, 2), + new Point(2, 3) + ); private final static Set BASE_MAP = Sets.newHashSet( - new Point(3, 0), new Point(2, 0), new Point(2, 1), new Point(1, 1), - new Point(1, 2), new Point(0, 1), new Point(0, 2)); - + new Point(3, 0), + new Point(2, 0), + new Point(2, 1), + new Point(1, 1), + new Point(1, 2), + new Point(0, 1), + new Point(0, 2) + ); + private final static Block BASE = EndBlocks.FLAVOLITE.tiles; private final static Block PEDESTAL = EndBlocks.ETERNAL_PEDESTAL; private final static Block FRAME = EndBlocks.FLAVOLITE_RUNED_ETERNAL; private final static Block PORTAL = EndBlocks.END_PORTAL_BLOCK; private final static BooleanProperty ACTIVE = BlockProperties.ACTIVE; - + public final static int SEARCH_RADIUS = calculateSearchSteps(48); - + private Level world; private Direction.Axis axis; private ResourceLocation targetWorldId; private BlockPos center; private BlockPos exit; private boolean active = false; - + public EternalRitual(Level world) { this.world = world; } - + public EternalRitual(Level world, BlockPos initial) { this(world); this.configure(initial); } - + public void setWorld(Level world) { this.world = world; } - + @Nullable public ResourceLocation getTargetWorldId() { return targetWorldId; } - + private boolean isInvalid() { - return world == null || world.isClientSide() || - center == null || axis == null; + return world == null || world.isClientSide() || center == null || axis == null; } - + public void checkStructure() { if (isInvalid()) return; Direction moveX, moveY; @@ -125,7 +148,8 @@ public class EternalRitual { Item pItem = pedestal.getItem(0).getItem(); if (item == null) { item = pItem; - } else if (!item.equals(pItem)) { + } + else if (!item.equals(pItem)) { valid = false; } } @@ -135,7 +159,7 @@ public class EternalRitual { activatePortal(item); } } - + private boolean checkFrame(Level world, BlockPos framePos) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; boolean valid = true; @@ -149,11 +173,11 @@ public class EternalRitual { } return valid; } - + public boolean isActive() { return active; } - + private void activatePortal(Item keyItem) { if (active) return; ResourceLocation itemId = Registry.ITEM.getKey(keyItem); @@ -163,10 +187,12 @@ public class EternalRitual { try { if (exit == null) { initPortal(worldId, portalId); - } else { + } + else { if (!worldId.equals(targetWorldId)) { initPortal(worldId, portalId); - } else if (!checkFrame(targetWorld, exit.below())) { + } + else if (!checkFrame(targetWorld, exit.below())) { Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; generatePortal(targetWorld, exit, portalAxis, portalId); } @@ -175,19 +201,20 @@ public class EternalRitual { activatePortal(world, center, portalId); doEffects((ServerLevel) world, center); active = true; - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.error("Create End portals error.", ex); removePortal(targetWorld, exit); removePortal(world, center); active = false; } } - + private void initPortal(ResourceLocation worldId, int portalId) { targetWorldId = worldId; exit = findPortalPos(portalId); } - + private void doEffects(ServerLevel serverWorld, BlockPos center) { Direction moveX, moveY; if (Direction.Axis.X == axis) { @@ -201,12 +228,32 @@ public class EternalRitual { for (Point pos : STRUCTURE_MAP) { BlockPos.MutableBlockPos p = center.mutable(); p.move(moveX, pos.x).move(moveY, pos.y); - serverWorld.sendParticles(ParticleTypes.PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, p.getX() + 0.5, p.getY() + 1.5, p.getZ() + 0.5, 20, 0, 0, 0, 0.3); + serverWorld.sendParticles( + ParticleTypes.PORTAL, + p.getX() + 0.5, + p.getY() + 1.5, + p.getZ() + 0.5, + 20, + 0, + 0, + 0, + 1 + ); + serverWorld.sendParticles( + ParticleTypes.REVERSE_PORTAL, + p.getX() + 0.5, + p.getY() + 1.5, + p.getZ() + 0.5, + 20, + 0, + 0, + 0, + 0.3 + ); } serverWorld.playSound(null, center, SoundEvents.END_PORTAL_SPAWN, SoundSource.NEUTRAL, 16, 1); } - + private void activatePortal(Level world, BlockPos center, int portalId) { BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; @@ -224,32 +271,74 @@ public class EternalRitual { } }); Direction.Axis portalAxis = Direction.Axis.X == axis ? Direction.Axis.Z : Direction.Axis.X; - BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, portalAxis).setValue(EndPortalBlock.PORTAL, portalId); + BlockState portal = PORTAL.defaultBlockState() + .setValue(EndPortalBlock.AXIS, portalAxis) + .setValue(EndPortalBlock.PORTAL, portalId); ParticleOptions effect = new BlockParticleOption(ParticleTypes.BLOCK, portal); ServerLevel serverWorld = (ServerLevel) world; - + PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); if (!world.getBlockState(pos).is(PORTAL)) { world.setBlockAndUpdate(pos, portal); - serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + serverWorld.sendParticles( + effect, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + 10, + 0.5, + 0.5, + 0.5, + 0.1 + ); + serverWorld.sendParticles( + ParticleTypes.REVERSE_PORTAL, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + 10, + 0.5, + 0.5, + 0.5, + 0.3 + ); } pos = center.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); if (!world.getBlockState(pos).is(PORTAL)) { world.setBlockAndUpdate(pos, portal); - serverWorld.sendParticles(effect, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.1); - serverWorld.sendParticles(ParticleTypes.REVERSE_PORTAL, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 10, 0.5, 0.5, 0.5, 0.3); + serverWorld.sendParticles( + effect, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + 10, + 0.5, + 0.5, + 0.5, + 0.1 + ); + serverWorld.sendParticles( + ParticleTypes.REVERSE_PORTAL, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + 10, + 0.5, + 0.5, + 0.5, + 0.3 + ); } }); } - + public void disablePortal(int state) { if (!active || isInvalid()) return; removePortal(getTargetWorld(state), exit); removePortal(world, center); } - + private void removePortal(Level world, BlockPos center) { BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; @@ -277,25 +366,36 @@ public class EternalRitual { }); this.active = false; } - + @Nullable private BlockPos findFrame(Level world, BlockPos.MutableBlockPos startPos) { - List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, - blockState -> blockState.is(FRAME) && !blockState.getValue(ACTIVE)); - for(BlockPos.MutableBlockPos testPos : foundPos) { + List foundPos = findAllBlockPos( + world, + startPos, + (SEARCH_RADIUS >> 4) + 1, + FRAME, + blockState -> blockState.is(FRAME) && !blockState.getValue(ACTIVE) + ); + for (BlockPos.MutableBlockPos testPos : foundPos) { if (checkFrame(world, testPos)) { return testPos; } } return null; } - + private BlockPos findPortalPos(int portalId) { MinecraftServer server = world.getServer(); ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); - Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); + Registry registry = Objects.requireNonNull(server) + .registryAccess() + .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); - BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); + BlockPos.MutableBlockPos basePos = center.mutable() + .set(center.getX() / multiplier, + center.getY(), + center.getZ() / multiplier + ); BlockPos framePos = findFrame(targetWorld, basePos.mutable()); if (framePos != null) { return framePos.above(); @@ -305,7 +405,8 @@ public class EternalRitual { if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); - } else { + } + else { Direction direction = Direction.EAST; BlockPos.MutableBlockPos checkPos = basePos.mutable(); int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); @@ -313,13 +414,21 @@ public class EternalRitual { for (int i = 0; i < (step >> 1); i++) { ChunkAccess chunk = targetWorld.getChunk(checkPos); if (chunk != null) { - int surfaceY = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, checkPos.getX() & 15, checkPos.getZ() & 15); - int motionY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, checkPos.getX() & 15, checkPos.getZ() & 15); + int surfaceY = chunk.getHeight( + Heightmap.Types.WORLD_SURFACE, + checkPos.getX() & 15, + checkPos.getZ() & 15 + ); + int motionY = chunk.getHeight( + Heightmap.Types.MOTION_BLOCKING, + checkPos.getX() & 15, + checkPos.getZ() & 15 + ); int ceil = Math.min(Math.max(surfaceY, motionY) + 1, worldCeil); if (ceil < 5) continue; checkPos.setY(ceil); while (checkPos.getY() >= 5) { - if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + if (checkIsAreaValid(targetWorld, checkPos, portalAxis)) { generatePortal(targetWorld, checkPos, portalAxis, portalId); return checkPos.immutable(); } @@ -332,28 +441,40 @@ public class EternalRitual { } } if (targetWorld.dimension() == Level.END) { - Features.END_ISLAND.place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); - } else if (targetWorld.dimension() == Level.OVERWORLD) { + net.minecraft.data.worldgen.features.EndFeatures.END_ISLAND.place( + targetWorld, + targetWorld.getChunkSource().getGenerator(), + new Random(basePos.asLong()), + basePos.below() + ); + } + else if (targetWorld.dimension() == Level.OVERWORLD) { basePos.setY(targetWorld.getChunk(basePos).getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); } - EndFeatures.BIOME_ISLAND.getFeatureConfigured().place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); + EndFeatures.BIOME_ISLAND + .getPlacedFeature() + .place(targetWorld, + targetWorld.getChunkSource().getGenerator(), + new Random(basePos.asLong()), + basePos.below() + ); generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); } - + private Level getTargetWorld(int state) { if (world.dimension() == Level.END) { return EndPortals.getWorld(world.getServer(), state); } return Objects.requireNonNull(world.getServer()).getLevel(Level.END); } - + private boolean checkIsAreaValid(Level world, BlockPos pos, Direction.Axis axis) { if (pos.getY() >= world.getHeight() - 1) return false; if (!isBaseValid(world, pos, axis)) return false; return EternalRitual.checkArea(world, pos, axis); } - + private boolean isBaseValid(Level world, BlockPos pos, Direction.Axis axis) { boolean solid = true; if (axis.equals(Direction.Axis.X)) { @@ -374,11 +495,11 @@ public class EternalRitual { } return solid; } - + private boolean validBlock(Level world, BlockPos pos, BlockState state) { return state.isRedstoneConductor(world, pos) && state.isCollisionShapeFullBlock(world, pos); } - + public void configure(BlockPos initial) { BlockPos checkPos = initial.east(12); if (this.hasPedestal(checkPos)) { @@ -410,7 +531,8 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.north(5).east(4); - } else { + } + else { this.center = initial.north(5).west(4); } return; @@ -421,7 +543,8 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.south(5).east(4); - } else { + } + else { this.center = initial.south(5).west(4); } return; @@ -432,7 +555,8 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.east(5).south(4); - } else { + } + else { this.center = initial.east(5).north(4); } return; @@ -443,16 +567,17 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.west(5).south(4); - } else { + } + else { this.center = initial.west(5).north(4); } } } - + private boolean hasPedestal(BlockPos pos) { return world.getBlockState(pos).is(PEDESTAL); } - + private boolean isActive(BlockPos pos) { BlockState state = world.getBlockState(pos); if (state.is(PEDESTAL)) { @@ -460,7 +585,8 @@ public class EternalRitual { if (pedestal != null) { if (!pedestal.hasRitual()) { pedestal.linkRitual(this); - } else { + } + else { EternalRitual ritual = pedestal.getRitual(); if (!ritual.equals(this)) { pedestal.linkRitual(this); @@ -471,7 +597,7 @@ public class EternalRitual { } return false; } - + public CompoundTag toTag(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putString("axis", axis.getName()); @@ -484,7 +610,7 @@ public class EternalRitual { } return tag; } - + public void fromTag(CompoundTag tag) { axis = Direction.Axis.byName(tag.getString("axis")); center = NbtUtils.readBlockPos(tag.getCompound("center")); @@ -496,17 +622,15 @@ public class EternalRitual { targetWorldId = new ResourceLocation(tag.getString("key_item")); } } - + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; EternalRitual ritual = (EternalRitual) o; - return world.equals(ritual.world) && - Objects.equals(center, ritual.center) && - Objects.equals(exit, ritual.exit); + return world.equals(ritual.world) && Objects.equals(center, ritual.center) && Objects.equals(exit, ritual.exit); } - + public static void generatePortal(Level world, BlockPos center, Direction.Axis axis, int portalId) { BlockPos framePos = center.below(); Direction moveDir = Direction.Axis.X == axis ? Direction.EAST : Direction.NORTH; @@ -517,7 +641,9 @@ public class EternalRitual { pos = framePos.mutable().move(moveDir, -point.x).move(Direction.UP, point.y); world.setBlockAndUpdate(pos, frame); }); - BlockState portal = PORTAL.defaultBlockState().setValue(EndPortalBlock.AXIS, axis).setValue(EndPortalBlock.PORTAL, portalId); + BlockState portal = PORTAL.defaultBlockState() + .setValue(EndPortalBlock.AXIS, axis) + .setValue(EndPortalBlock.PORTAL, portalId); PORTAL_MAP.forEach(point -> { BlockPos pos = center.mutable().move(moveDir, point.x).move(Direction.UP, point.y); world.setBlockAndUpdate(pos, portal); @@ -526,7 +652,7 @@ public class EternalRitual { }); generateBase(world, framePos, moveDir); } - + private static void generateBase(Level world, BlockPos center, Direction moveX) { BlockState base = BASE.defaultBlockState(); Direction moveY = moveX.getClockWise(); @@ -541,10 +667,13 @@ public class EternalRitual { world.setBlockAndUpdate(pos, base); }); } - + public static boolean checkArea(Level world, BlockPos center, Direction.Axis axis) { Direction moveDir = Direction.Axis.X == axis ? Direction.NORTH : Direction.EAST; - for (BlockPos checkPos : BlockPos.betweenClosed(center.relative(moveDir.getClockWise()), center.relative(moveDir.getCounterClockWise()))) { + for (BlockPos checkPos : BlockPos.betweenClosed( + center.relative(moveDir.getClockWise()), + center.relative(moveDir.getCounterClockWise()) + )) { for (Point point : PORTAL_MAP) { BlockPos pos = checkPos.mutable().move(moveDir, point.x).move(Direction.UP, point.y); BlockState state = world.getBlockState(pos); @@ -556,20 +685,19 @@ public class EternalRitual { } return true; } - + private static boolean isStateInvalid(BlockState state) { if (!state.getFluidState().isEmpty()) return true; Material material = state.getMaterial(); return !material.isReplaceable() && !material.equals(Material.PLANT); } - + /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section - * + * @param condition Predicate for test block states in the chunk section * @return Position of the first found block or null. */ @Nullable @@ -583,7 +711,7 @@ public class EternalRitual { if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; @@ -602,14 +730,13 @@ public class EternalRitual { } return null; } - + /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section - * + * @param condition Predicate for test block states in the chunk section * @return List of positions of the all found blocks or empty list. */ public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { @@ -623,7 +750,7 @@ public class EternalRitual { if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; @@ -642,7 +769,7 @@ public class EternalRitual { } return posFound; } - + public static int calculateSearchSteps(int radius) { return radius * 4 - 1; } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index f240ec47..689e9fca 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,9 +1,5 @@ package ru.betterend.rituals; -import java.awt.Point; -import java.util.Arrays; -import java.util.Objects; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -11,7 +7,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -20,18 +15,22 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; +import java.awt.Point; +import java.util.Arrays; +import java.util.Objects; + public class InfusionRitual implements Container { private static final Point[] PEDESTALS_MAP = new Point[] { - new Point(0, 3), - new Point(2, 2), - new Point(3, 0), - new Point(2, -2), - new Point(0, -3), - new Point(-2, -2), - new Point(-3, 0), - new Point(-2, 2) + new Point(0, 3), + new Point(2, 2), + new Point(3, 0), + new Point(2, -2), + new Point(0, -3), + new Point(-2, -2), + new Point(-3, 0), + new Point(-2, 2) }; - + private Level world; private BlockPos worldPos; private InfusionRecipe activeRecipe; @@ -39,7 +38,7 @@ public class InfusionRitual implements Container { private boolean hasRecipe = false; private int progress = 0; private int time = 0; - + private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; private final InfusionPedestalEntity input; @@ -58,7 +57,8 @@ public class InfusionRitual implements Container { BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; - } else { + } + else { catalysts[i] = null; } } @@ -71,7 +71,8 @@ public class InfusionRitual implements Container { if (recipe == null) { reset(); return false; - } else if (activeRecipe == null || recipe.getInfusionTime() != time) { + } + else if (activeRecipe == null || recipe.getInfusionTime() != time) { updateRecipe(recipe); } return true; @@ -82,14 +83,14 @@ public class InfusionRitual implements Container { } return false; } - + private void updateRecipe(InfusionRecipe recipe) { activeRecipe = recipe; hasRecipe = true; resetTimer(); setChanged(); } - + private void resetTimer() { time = activeRecipe != null ? activeRecipe.getInfusionTime() : 0; progress = 0; @@ -113,7 +114,8 @@ public class InfusionRitual implements Container { clearContent(); input.setItem(0, activeRecipe.assemble(this)); reset(); - } else { + } + else { ServerLevel serverLevel = (ServerLevel) world; BlockPos target = worldPos.above(); double tx = target.getX() + 0.5; @@ -126,11 +128,21 @@ public class InfusionRitual implements Container { double sx = start.getX() + 0.5; double sy = start.getY() + 1.25; double sz = start.getZ() + 0.5; - serverLevel.sendParticles(new InfusionParticleType(stack), sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.5); + serverLevel.sendParticles( + new InfusionParticleType(stack), + sx, + sy, + sz, + 0, + tx - sx, + ty - sy, + tz - sz, + 0.5 + ); } } } - + } @Override @@ -146,65 +158,68 @@ public class InfusionRitual implements Container { public boolean hasRecipe() { return hasRecipe; } - + public void setLocation(Level world, BlockPos pos) { this.world = world; this.worldPos = pos; this.isDirty = true; } - + @Override public void clearContent() { if (!isValid()) return; input.clearContent(); Arrays.stream(catalysts).forEach(PedestalBlockEntity::clearContent); } - + @Override public int getContainerSize() { return 9; } - + @Override public boolean isEmpty() { return false; } - + @Override public ItemStack getItem(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { return input.getItem(0); - } else { + } + else { return catalysts[slot - 1].getItem(0); } } - + @Override public ItemStack removeItem(int slot, int amount) { return removeItemNoUpdate(slot); } - + @Override public ItemStack removeItemNoUpdate(int slot) { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { return input.removeItemNoUpdate(0); - } else { + } + else { return catalysts[slot - 1].removeItemNoUpdate(0); } } - + @Override public void setItem(int slot, ItemStack stack) { if (slot > 8) return; if (slot == 0) { input.setItem(0, stack); - } else { + } + else { catalysts[slot - 1].setItem(0, stack); } } - + @Override public void setChanged() { if (isValid()) { @@ -212,11 +227,11 @@ public class InfusionRitual implements Container { Arrays.stream(catalysts).forEach(PedestalBlockEntity::setChanged); } } - + public void markDirty() { this.isDirty = true; } - + @Override public boolean stillValid(Player player) { return true; @@ -229,7 +244,7 @@ public class InfusionRitual implements Container { time = tag.getInt("time"); } } - + public CompoundTag toTag(CompoundTag tag) { if (hasRecipe()) { tag.putBoolean("recipe", hasRecipe); @@ -238,7 +253,7 @@ public class InfusionRitual implements Container { } return tag; } - + public static Point[] getMap() { return PEDESTALS_MAP; } diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index fab36d20..cc85999b 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -1,7 +1,5 @@ package ru.betterend.tab; -import java.util.stream.Collectors; - import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; @@ -9,20 +7,28 @@ import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.stream.Collectors; + public class CreativeTabs { public static final CreativeModeTab TAB_BLOCKS; public static final CreativeModeTab TAB_ITEMS; - + static { - TAB_BLOCKS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_blocks")) - .icon(() -> new ItemStack(EndBlocks.END_MYCELIUM)).appendItems(stacks -> { - stacks.addAll(EndBlocks.getModBlocks().stream() - .map(ItemStack::new).collect(Collectors.toList())); - }).build(); - TAB_ITEMS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_items")) - .icon(() -> new ItemStack(EndItems.ETERNAL_CRYSTAL)).appendItems(stacks -> { - stacks.addAll(EndItems.getModItems().stream() - .map(ItemStack::new).collect(Collectors.toList())); - }).build(); + TAB_BLOCKS = FabricItemGroupBuilder + .create(BetterEnd.makeID("end_blocks")) + .icon(() -> new ItemStack(EndBlocks.END_MYCELIUM)) + .appendItems(stacks -> stacks.addAll(EndBlocks.getModBlockItems() + .stream() + .map(ItemStack::new) + .collect(Collectors.toList()))) + .build(); + TAB_ITEMS = FabricItemGroupBuilder + .create(BetterEnd.makeID("end_items")) + .icon(() -> new ItemStack(EndItems.ETERNAL_CRYSTAL)) + .appendItems(stacks -> stacks.addAll(EndItems.getModItems() + .stream() + .map(ItemStack::new) + .collect(Collectors.toList()))) + .build(); } } diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index 9e9a0dcb..76b6de89 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -1,16 +1,16 @@ package ru.betterend.util; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.FallingBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.dimension.DimensionType; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.blocks.BaseVineBlock; import ru.bclib.blocks.StalactiteBlock; @@ -19,183 +19,204 @@ import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; +import java.util.Set; +import java.util.stream.IntStream; + public class BlockFixer { - private static final MutableBlockPos POS = new MutableBlockPos(); private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); - public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { - BlockState state; - Set doubleCheck = Sets.newHashSet(); - for (int x = start.getX(); x <= end.getX(); x++) { - POS.setX(x); - for (int z = start.getZ(); z <= end.getZ(); z++) { - POS.setZ(z); - for (int y = start.getY(); y <= end.getY(); y++) { - POS.setY(y); - state = world.getBlockState(POS); - - if (state.getBlock() instanceof FurBlock) { - doubleCheck.add(POS.immutable()); - } - // Liquids - else if (!state.getFluidState().isEmpty()) { - if (!state.canSurvive(world, POS)) { - BlocksHelper.setWithoutUpdate(world, POS, WATER); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - while (!state.canSurvive(world, POS)) { - state = state.getFluidState().isEmpty() ? AIR : WATER; - BlocksHelper.setWithoutUpdate(world, POS, state); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - POS.setY(y - 1); - if (world.isEmptyBlock(POS)) { - POS.setY(y); - while (!world.getFluidState(POS).isEmpty()) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - } - continue; - } - for (Direction dir : BlocksHelper.HORIZONTAL) { - if (world.isEmptyBlock(POS.relative(dir))) { - world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); - break; - } - } - } - else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + public static void fixBlocks(LevelAccessor level, BlockPos start, BlockPos end) { + final Registry registry = level.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); + final ResourceLocation dimKey = registry.getKey(level.dimensionType()); + if (dimKey != null && "world_blender".equals(dimKey.getNamespace())) { + return; + } + final Set doubleCheck = Sets.newConcurrentHashSet(); + final int dx = end.getX() - start.getX() + 1; + final int dz = end.getZ() - start.getZ() + 1; + final int count = dx * dz; + final int minY = Math.max(start.getY(), level.getMinBuildHeight()); + final int maxY = Math.min(end.getY(), level.getMaxBuildHeight()); + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos POS = new MutableBlockPos(); + POS.setX((index % dx) + start.getX()); + POS.setZ((index / dx) + start.getZ()); + BlockState state; + for (int y = minY; y <= maxY; y++) { + POS.setY(y); + state = level.getBlockState(POS); + + if (state.getBlock() instanceof FurBlock) { + doubleCheck.add(POS.immutable()); + } + // Liquids + else if (!state.getFluidState().isEmpty()) { + if (!state.canSurvive(level, POS)) { + setWithoutUpdate(level, POS, WATER); POS.setY(POS.getY() - 1); - if (world.isEmptyBlock(POS)) { - POS.setY(POS.getY() + 1); - while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - } - else if (state.getBlock() instanceof StalactiteBlock) { - if (!state.canSurvive(world, POS)) { - if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - else { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - } - } - else if (state.is(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - } - else if (!state.canSurvive(world, POS)) { - // Chorus - if (state.is(Blocks.CHORUS_PLANT)) { - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(POS.immutable()); - - for (int i = 0; i < 64 && !ends.isEmpty(); i++) { - ends.forEach((pos) -> { - BlocksHelper.setWithoutUpdate(world, pos, AIR); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos p = pos.relative(dir); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - } - BlockPos p = pos.above(); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - }); - ends.clear(); - ends.addAll(add); - add.clear(); - } - } - // Vines - else if (state.getBlock() instanceof BaseVineBlock) { - while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - } - } - // Falling blocks - else if (state.getBlock() instanceof FallingBlock) { - BlockState falling = state; - + state = level.getBlockState(POS); + while (!state.canSurvive(level, POS)) { + state = state.getFluidState().isEmpty() ? AIR : WATER; + setWithoutUpdate(level, POS, state); POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - - int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); - if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - if (world.getRandom().nextBoolean()) { - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - } + state = level.getBlockState(POS); + } + } + POS.setY(y - 1); + if (level.isEmptyBlock(POS)) { + POS.setY(y); + while (!level.getFluidState(POS).isEmpty()) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() + 1); + } + continue; + } + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (level.isEmptyBlock(POS.relative(dir))) { + try { + level.scheduleTick(POS, state.getFluidState().getType(), 0); } - else { - POS.setY(y); - BlockState replacement = AIR; - for (Direction dir : BlocksHelper.HORIZONTAL) { - state = world.getBlockState(POS.relative(dir)); - if (!state.getFluidState().isEmpty()) { - replacement = state; - break; - } - } - BlocksHelper.setWithoutUpdate(world, POS, replacement); - POS.setY(y - ray); - BlocksHelper.setWithoutUpdate(world, POS, falling); + catch (Exception e) {} + break; + } + } + } + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (level.isEmptyBlock(POS)) { + POS.setY(POS.getY() + 1); + while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() + 1); + state = level.getBlockState(POS); + } + } + } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canSurvive(level, POS)) { + if (level.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() + 1); + state = level.getBlockState(POS); } } - // Blocks without support else { - // Blue Vine - if (state.getBlock() instanceof BlueVineBlock) { - while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - // Double plants - if (state.getBlock() instanceof BaseDoublePlantBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - // Other blocks - else { - BlocksHelper.setWithoutUpdate(world, POS, getAirOrFluid(state)); + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() - 1); + state = level.getBlockState(POS); } } } } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!level.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(level, POS, AIR); + } + } + else if (!state.canSurvive(level, POS)) { + // Chorus + if (state.is(Blocks.CHORUS_PLANT)) { + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(POS.immutable()); + + for (int i = 0; i < 64 && !ends.isEmpty(); i++) { + ends.forEach((pos) -> { + setWithoutUpdate(level, pos, AIR); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); + BlockState st = level.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive( + level, + p + )) { + add.add(p); + } + } + BlockPos p = pos.above(); + BlockState st = level.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive( + level, + p + )) { + add.add(p); + } + }); + ends.clear(); + ends.addAll(add); + add.clear(); + } + } + // Vines + else if (state.getBlock() instanceof BaseVineBlock) { + while (level.getBlockState(POS).getBlock() instanceof BaseVineBlock) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() - 1); + } + } + // Falling blocks + else if (state.getBlock() instanceof FallingBlock) { + BlockState falling = state; + + POS.setY(POS.getY() - 1); + state = level.getBlockState(POS); + + int ray = BlocksHelper.downRayRep(level, POS.immutable(), 64); + if (ray > 32) { + setWithoutUpdate(level, POS, Blocks.END_STONE.defaultBlockState()); + if (level.getRandom().nextBoolean()) { + POS.setY(POS.getY() - 1); + state = level.getBlockState(POS); + setWithoutUpdate(level, POS, Blocks.END_STONE.defaultBlockState()); + } + } + else { + POS.setY(y); + BlockState replacement = AIR; + for (Direction dir : BlocksHelper.HORIZONTAL) { + state = level.getBlockState(POS.relative(dir)); + if (!state.getFluidState().isEmpty()) { + replacement = state; + break; + } + } + setWithoutUpdate(level, POS, replacement); + POS.setY(y - ray); + setWithoutUpdate(level, POS, falling); + } + } + // Blocks without support + else { + // Blue Vine + if (state.getBlock() instanceof BlueVineBlock) { + while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is( + EndBlocks.BLUE_VINE_FUR)) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() + 1); + state = level.getBlockState(POS); + } + } + // Double plants + if (state.getBlock() instanceof BaseDoublePlantBlock) { + setWithoutUpdate(level, POS, AIR); + POS.setY(POS.getY() + 1); + setWithoutUpdate(level, POS, AIR); + } + // Other blocks + else { + setWithoutUpdate(level, POS, getAirOrFluid(state)); + } + } + } } - } + }); doubleCheck.forEach((pos) -> { - if (!world.getBlockState(pos).canSurvive(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + if (!level.getBlockState(pos).canSurvive(level, pos)) { + setWithoutUpdate(level, pos, AIR); } }); } @@ -203,4 +224,10 @@ public class BlockFixer { private static BlockState getAirOrFluid(BlockState state) { return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } + + private static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + synchronized (world) { + BlocksHelper.setWithoutUpdate(world, pos, state); + } + } } diff --git a/src/main/java/ru/betterend/util/BonemealPlants.java b/src/main/java/ru/betterend/util/BonemealPlants.java index b2a5cdf6..b8d0ad24 100644 --- a/src/main/java/ru/betterend/util/BonemealPlants.java +++ b/src/main/java/ru/betterend/util/BonemealPlants.java @@ -1,9 +1,15 @@ package ru.betterend.util; +import com.google.common.collect.Lists; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import ru.bclib.api.BonemealAPI; +import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class BonemealPlants { public static void init() { BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MOSS); @@ -20,38 +26,96 @@ public class BonemealPlants { BonemealAPI.addLandGrass(EndBlocks.JUNGLE_GRASS, EndBlocks.JUNGLE_MOSS); BonemealAPI.addLandGrass(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.JUNGLE_MOSS); - BonemealAPI.addLandGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); + BonemealAPI.addLandGrass(EndBlocks.SMALL_JELLYSHROOM, EndBlocks.JUNGLE_MOSS, 0.1F); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.BLOOMING_COOKSONIA, EndBlocks.END_MOSS); + BonemealAPI.addLandGrass( + EndBiomes.GLOWING_GRASSLANDS.getID(), + EndBlocks.BLOOMING_COOKSONIA, + EndBlocks.END_MOSS + ); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.VAIOLUSH_FERN, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.FRACTURN, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.SALTEAGO, EndBlocks.END_MOSS); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); - BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); + BonemealAPI.addLandGrass( + EndBiomes.GLOWING_GRASSLANDS.getID(), + EndBlocks.CREEPING_MOSS, + EndBlocks.END_MOSS, + 0.1F + ); + BonemealAPI.addLandGrass( + EndBiomes.GLOWING_GRASSLANDS.getID(), + EndBlocks.UMBRELLA_MOSS, + EndBlocks.END_MOSS, + 0.1F + ); + BonemealAPI.addLandGrass( + EndBiomes.GLOWING_GRASSLANDS.getID(), + EndBlocks.TWISTED_UMBRELLA_MOSS, + EndBlocks.END_MOSS, + 0.1F + ); BonemealAPI.addLandGrass(EndBlocks.ORANGO, EndBlocks.RUTISCUS); - BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); - BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); - BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); + BonemealAPI.addLandGrass(EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); + BonemealAPI.addLandGrass(EndBlocks.LUTEBUS, EndBlocks.RUTISCUS, 0.2F); + BonemealAPI.addLandGrass(EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); - BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); + BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.AERIDIUM, EndBlocks.RUTISCUS, 0.2F); BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); - BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); + BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.BOLUX_MUSHROOM, EndBlocks.RUTISCUS, 0.05F); - BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.SANGNUM, EndBlocks.MOSSY_OBSIDIAN, EndBlocks.MOSSY_DRAGON_BONE); - BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.SANGNUM, EndBlocks.MOSSY_OBSIDIAN, EndBlocks.MOSSY_DRAGON_BONE); + BonemealAPI.addLandGrass( + EndBlocks.GLOBULAGUS, + EndBlocks.SANGNUM, + EndBlocks.MOSSY_OBSIDIAN, + EndBlocks.MOSSY_DRAGON_BONE + ); + BonemealAPI.addLandGrass( + EndBlocks.CLAWFERN, + EndBlocks.SANGNUM, + EndBlocks.MOSSY_OBSIDIAN, + EndBlocks.MOSSY_DRAGON_BONE + ); BonemealAPI.addLandGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - BonemealAPI.addLandGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - BonemealAPI.addLandGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); + BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_DRAGON_BONE); BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_DRAGON_BONE); - BonemealAPI.addLandGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_DRAGON_BONE, 0.1F); BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_OBSIDIAN); BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_OBSIDIAN); - BonemealAPI.addLandGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); + BonemealAPI.addLandGrass(EndBlocks.SMALL_AMARANITA_MUSHROOM, EndBlocks.MOSSY_OBSIDIAN, 0.1F); + + Block[] charnias = new Block[] { + EndBlocks.CHARNIA_CYAN, + EndBlocks.CHARNIA_GREEN, + EndBlocks.CHARNIA_ORANGE, + EndBlocks.CHARNIA_LIGHT_BLUE, + EndBlocks.CHARNIA_PURPLE, + EndBlocks.CHARNIA_RED + }; + List terrain = Lists.newArrayList(); + EndBlocks.getModBlocks().forEach(block -> { + if (block instanceof EndTerrainBlock) { + terrain.add(block); + } + }); + terrain.add(Blocks.END_STONE); + terrain.add(EndBlocks.ENDSTONE_DUST); + terrain.add(EndBlocks.CAVE_MOSS); + terrain.add(EndBlocks.SULPHURIC_ROCK.stone); + terrain.add(EndBlocks.VIOLECITE.stone); + terrain.add(EndBlocks.FLAVOLITE.stone); + terrain.add(EndBlocks.AZURE_JADESTONE.stone); + terrain.add(EndBlocks.VIRID_JADESTONE.stone); + terrain.add(EndBlocks.SANDY_JADESTONE.stone); + terrain.add(EndBlocks.BRIMSTONE); + Block[] terrainBlocks = terrain.toArray(new Block[terrain.size()]); + for (Block charnia : charnias) { + BonemealAPI.addWaterGrass(charnia, terrainBlocks); + } } } diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java deleted file mode 100644 index d2b9658c..00000000 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.betterend.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.Supplier; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; -import ru.betterend.registry.EndFeatures; -import ru.betterend.registry.EndStructures; - -public class FeaturesHelper { - private static final Set INJECTED = Sets.newHashSet(); - - public static void addFeatures(Registry biomeRegistry) { - biomeRegistry.forEach((biome) -> { - if (biome.getBiomeCategory() == Biome.BiomeCategory.THEEND && !INJECTED.contains(biome)) { - BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.be_getStructures()); - List>>> preFeatures = accessor.be_getFeatures(); - List>>> features = new ArrayList>>>(preFeatures.size()); - preFeatures.forEach((list) -> { - features.add(Lists.newArrayList(list)); - }); - - EndFeatures.registerBiomeFeatures(biomeRegistry.getKey(biome), biome, features); - EndStructures.registerBiomeStructures(biomeRegistry.getKey(biome), biome, structures); - - accessor.be_setFeatures(features); - accessor.be_setStructures(structures); - INJECTED.add(biome); - } - }); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java deleted file mode 100644 index 20f57987..00000000 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ /dev/null @@ -1,73 +0,0 @@ -package ru.betterend.util; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.gson.JsonObject; - -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import ru.betterend.BetterEnd; - -public class ItemUtil { - - public static String toStackString(@NotNull ItemStack stack) { - try { - if (stack == null) { - throw new IllegalStateException("Stack can't be null!"); - } - Item item = stack.getItem(); - return Registry.ITEM.getKey(item) + ":" + stack.getCount(); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack serialization error!", ex); - } - return ""; - } - - @Nullable - public static ItemStack fromStackString(String stackString) { - if (stackString == null || stackString.equals("")) { - return null; - } - try { - String[] parts = stackString.split(":"); - if (parts.length < 2) return null; - if (parts.length == 2) { - ResourceLocation itemId = new ResourceLocation(stackString); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - return new ItemStack(item); - } - ResourceLocation itemId = new ResourceLocation(parts[0], parts[1]); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - return new ItemStack(item, Integer.valueOf(parts[2])); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); - } - return null; - } - - @Nullable - public static ItemStack fromJsonRecipe(JsonObject recipe) { - try { - if (!recipe.has("item")) { - throw new IllegalStateException("Invalid JsonObject. Entry 'item' does not exists!"); - } - ResourceLocation itemId = new ResourceLocation(GsonHelper.getAsString(recipe, "item")); - Item item = Registry.ITEM.getOptional(itemId).orElseThrow(() -> { - return new IllegalStateException("Output item " + itemId + " does not exists!"); - }); - int count = GsonHelper.getAsInt(recipe, "count", 1); - return new ItemStack(item, count); - } catch (Exception ex) { - BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); - } - return null; - } -} diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index 1b8cb09d..8f314f52 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -1,35 +1,154 @@ package ru.betterend.util; import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; +import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder; import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.RandomValueBounds; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.complexmaterials.WoodenComplexMaterial; +import ru.bclib.world.biomes.BCLBiome; +import ru.betterend.BetterEnd; +import ru.betterend.registry.EndBiomes; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class LootTableUtil { private static final ResourceLocation END_CITY_TREASURE_ID = new ResourceLocation("chests/end_city_treasure"); - + private static final ResourceLocation COMMON = BetterEnd.makeID("chests/common"); + private static final ResourceLocation FOGGY_MUSHROOMLAND = BetterEnd.makeID("chests/foggy_mushroomland"); + private static final ResourceLocation CHORUS_FOREST = BetterEnd.makeID("chests/chorus_forest"); + private static final ResourceLocation SHADOW_FOREST = BetterEnd.makeID("chests/shadow_forest"); + private static final ResourceLocation LANTERN_WOODS = BetterEnd.makeID("chests/lantern_woods"); + private static final ResourceLocation UMBRELLA_JUNGLE = BetterEnd.makeID("chests/umbrella_jungle"); + public static void init() { - LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { + LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, table, setter) -> { if (END_CITY_TREASURE_ID.equals(id)) { FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); - builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); + builder.setRolls(ConstantValue.exactly(1)); + builder.withCondition(LootItemRandomChanceCondition.randomChance(0.2f).build()); builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); - supplier.withPool(builder); + table.withPool(builder); builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); - builder.withCondition(LootItemRandomChanceCondition.randomChance(0.1f).build()); + builder.setRolls(UniformGenerator.between(0, 3)); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_GRASPING_AT_STARS).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_ENDSEEKER).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_EO_DRACONA).build()); - supplier.withPool(builder); + table.withPool(builder); + } + else if (id.getNamespace().equals(BetterEnd.MOD_ID)) { + addCommonItems(table); + if (FOGGY_MUSHROOMLAND.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.MOSSY_GLOWSHROOM.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.MOSSY_GLOWSHROOM_SAPLING).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.BLUE_VINE_SEED).build()); + table.withPool(builder); + } + else if (CHORUS_FOREST.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.PYTHADENDRON.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.PYTHADENDRON_SAPLING).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.CHORUS_MUSHROOM).build()); + table.withPool(builder); + } + else if (SHADOW_FOREST.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.DRAGON_TREE.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.DRAGON_TREE_SAPLING).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.SHADOW_BERRY).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.SHADOW_BERRY_RAW).build()); + table.withPool(builder); + } + else if (LANTERN_WOODS.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.LUCERNIA.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.LUCERNIA_SAPLING).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.BOLUX_MUSHROOM).build()); + table.withPool(builder); + } + else if (UMBRELLA_JUNGLE.equals(id)) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.UMBRELLA_TREE.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.UMBRELLA_TREE_SAPLING).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.SMALL_JELLYSHROOM).build()); + table.withPool(builder); + } } }); } + + public static ResourceLocation getTable(Biome biome) { + BCLBiome bclBiome = BiomeAPI.getBiome(biome); + if (bclBiome == EndBiomes.FOGGY_MUSHROOMLAND) { + return FOGGY_MUSHROOMLAND; + } + else if (bclBiome == EndBiomes.CHORUS_FOREST) { + return CHORUS_FOREST; + } + else if (bclBiome == EndBiomes.SHADOW_FOREST) { + return SHADOW_FOREST; + } + else if (bclBiome == EndBiomes.LANTERN_WOODS) { + return LANTERN_WOODS; + } + else if (bclBiome == EndBiomes.UMBRELLA_JUNGLE) { + return UMBRELLA_JUNGLE; + } + return COMMON; + } + + private static void addCommonItems(FabricLootSupplierBuilder table) { + FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(0, 2)); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_GRASPING_AT_STARS).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_ENDSEEKER).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_EO_DRACONA).build()); + table.withPool(builder); + + builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(4, 8)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.ingot).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.rawOre).build()); + builder.withEntry(LootItem.lootTableItem(Items.ENDER_PEARL).build()); + table.withPool(builder); + + builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(2, 4)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.TERMINITE.ingot).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.ENDER_SHARD).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.AURORA_CRYSTAL).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.axe).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.pickaxe).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.hoe).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.sword).build()); + builder.withEntry(LootItem.lootTableItem(EndBlocks.THALLASIUM.shovel).build()); + builder.withEntry(LootItem.lootTableItem(Items.ENDER_EYE).build()); + builder.withEntry(LootItem.lootTableItem(Blocks.OBSIDIAN).build()); + table.withPool(builder); + + builder = FabricLootPoolBuilder.builder(); + builder.setRolls(UniformGenerator.between(0, 4)); + builder.withEntry(LootItem.lootTableItem(EndBlocks.FLAVOLITE_RUNED).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.AETERNIUM_INGOT).build()); + builder.withEntry(LootItem.lootTableItem(EndItems.AMBER_GEM).build()); + builder.withEntry(LootItem.lootTableItem(Items.END_CRYSTAL).build()); + builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); + table.withPool(builder); + } } diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java deleted file mode 100644 index 7b0f879e..00000000 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.betterend.util; - -import net.minecraft.core.Registry; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; - -public class RecipeHelper { - public static boolean exists(ItemLike item) { - if (item instanceof Block) { - return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultKey(); - } else { - return Registry.ITEM.getKey(item.asItem()) != Registry.ITEM.getDefaultKey(); - } - } - - public static boolean exists(ItemLike... items) { - for (ItemLike item : items) { - if (!exists(item)) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java deleted file mode 100644 index e42a688a..00000000 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.betterend.util; - -import net.fabricmc.fabric.mixin.object.builder.SpawnRestrictionAccessor; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; -import net.minecraft.world.entity.SpawnPlacements.Type; -import net.minecraft.world.level.levelgen.Heightmap.Types; - -public class SpawnHelper { - public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Type.NO_RESTRICTIONS, Types.MOTION_BLOCKING, predicate); - } - - public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Type.ON_GROUND, Types.MOTION_BLOCKING, predicate); - } - - public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { - SpawnRestrictionAccessor.callRegister(entity, Type.IN_WATER, Types.MOTION_BLOCKING, predicate); - } -} diff --git a/src/main/java/ru/betterend/util/StructureErode.java b/src/main/java/ru/betterend/util/StructureErode.java new file mode 100644 index 00000000..82441194 --- /dev/null +++ b/src/main/java/ru/betterend/util/StructureErode.java @@ -0,0 +1,276 @@ +package ru.betterend.util; + +import com.google.common.collect.Sets; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +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.structure.BoundingBox; +import net.minecraft.world.level.material.Material; +import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.util.BlocksHelper; +import ru.bclib.util.MHelper; + +import java.util.Random; +import java.util.Set; + +public class StructureErode { + private static final Direction[] DIR = BlocksHelper.makeHorizontal(); + + public static void erode(WorldGenLevel world, BoundingBox bounds, int iterations, Random random) { + MutableBlockPos mut = new MutableBlockPos(); + boolean canDestruct = true; + for (int i = 0; i < iterations; i++) { + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + for (int y = bounds.maxY(); y >= bounds.minY(); y--) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + boolean ignore = ignore(state, world, mut); + if (canDestruct && BlocksHelper.isInvulnerable( + state, + world, + mut + ) && random.nextInt(8) == 0 && world.isEmptyBlock(mut.below(2))) { + int r = MHelper.randRange(1, 4, random); + int cx = mut.getX(); + int cy = mut.getY(); + int cz = mut.getZ(); + int x1 = cx - r; + int y1 = cy - r; + int z1 = cz - r; + int x2 = cx + r; + int y2 = cy + r; + int z2 = cz + r; + for (int px = x1; px <= x2; px++) { + int dx = px - cx; + dx *= dx; + mut.setX(px); + for (int py = y1; py <= y2; py++) { + int dy = py - cy; + dy *= dy; + mut.setY(py); + for (int pz = z1; pz <= z2; pz++) { + int dz = pz - cz; + dz *= dz; + mut.setZ(pz); + if (dx + dy + dz <= r && BlocksHelper.isInvulnerable( + world.getBlockState(mut), + world, + mut + )) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + } + } + } + } + mut.setX(cx); + mut.setY(cy); + mut.setZ(cz); + canDestruct = false; + continue; + } + else if (ignore) { + continue; + } + if (!state.isAir() && random.nextBoolean()) { + MHelper.shuffle(DIR, random); + for (Direction dir : DIR) { + if (world.isEmptyBlock(mut.relative(dir)) && world.isEmptyBlock(mut.below() + .relative(dir))) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + mut.move(dir).move(Direction.DOWN); + for (int py = mut.getY(); y >= bounds.minY() - 10; y--) { + mut.setY(py - 1); + if (!world.isEmptyBlock(mut)) { + mut.setY(py); + BlocksHelper.setWithoutUpdate(world, mut, state); + break; + } + } + } + } + break; + } + else if (random.nextInt(8) == 0 && !BlocksHelper.isInvulnerable( + world.getBlockState(mut.above()), + world, + mut + )) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + } + } + } + } + } + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + for (int y = bounds.maxY(); y >= bounds.minY(); y--) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (!ignore(state, world, mut) && world.isEmptyBlock(mut.below())) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + for (int py = mut.getY(); py >= bounds.minY() - 10; py--) { + mut.setY(py - 1); + if (!world.isEmptyBlock(mut)) { + mut.setY(py); + BlocksHelper.setWithoutUpdate(world, mut, state); + break; + } + } + } + } + } + } + } + + public static void erodeIntense(WorldGenLevel world, BoundingBox bounds, Random random) { + MutableBlockPos mut = new MutableBlockPos(); + MutableBlockPos mut2 = new MutableBlockPos(); + int minY = bounds.minY() - 10; + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + for (int y = bounds.maxY(); y >= bounds.minY(); y--) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (!ignore(state, world, mut)) { + if (random.nextInt(6) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + if (random.nextBoolean()) { + int px = MHelper.floor(random.nextGaussian() * 2 + x + 0.5); + int pz = MHelper.floor(random.nextGaussian() * 2 + z + 0.5); + mut2.set(px, y, pz); + while (world.getBlockState(mut2).getMaterial().isReplaceable() && mut2.getY() > minY) { + mut2.setY(mut2.getY() - 1); + } + if (!world.getBlockState(mut2).isAir() && state.canSurvive(world, mut2)) { + mut2.setY(mut2.getY() + 1); + BlocksHelper.setWithoutUpdate(world, mut2, state); + } + } + } + else if (random.nextInt(8) == 0) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + } + } + } + } + } + + drop(world, bounds); + } + + private static void drop(WorldGenLevel world, BoundingBox bounds) { + MutableBlockPos mut = new MutableBlockPos(); + + Set blocks = Sets.newHashSet(); + Set edge = Sets.newHashSet(); + Set add = Sets.newHashSet(); + + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + for (int y = bounds.minY(); y <= bounds.maxY(); y++) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (!ignore(state, world, mut) && isTerrainNear(world, mut)) { + edge.add(mut.immutable()); + } + } + } + } + + if (edge.isEmpty()) { + return; + } + + while (!edge.isEmpty()) { + for (BlockPos center : edge) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + BlockState state = world.getBlockState(center); + if (state.isCollisionShapeFullBlock(world, center)) { + mut.set(center).move(dir); + if (bounds.isInside(mut)) { + state = world.getBlockState(mut); + if (!ignore(state, world, mut) && !blocks.contains(mut)) { + add.add(mut.immutable()); + } + } + } + } + } + + blocks.addAll(edge); + edge.clear(); + edge.addAll(add); + add.clear(); + } + + int minY = bounds.minY() - 10; + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + for (int y = bounds.minY(); y <= bounds.maxY(); y++) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (!ignore(state, world, mut) && !blocks.contains(mut)) { + BlocksHelper.setWithoutUpdate(world, mut, Blocks.AIR); + while (world.getBlockState(mut).getMaterial().isReplaceable() && mut.getY() > minY) { + mut.setY(mut.getY() - 1); + } + if (mut.getY() > minY) { + mut.setY(mut.getY() + 1); + BlocksHelper.setWithoutUpdate(world, mut, state); + } + } + } + } + } + } + + private static boolean ignore(BlockState state, WorldGenLevel world, BlockPos pos) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(BlockTags.NYLIUM)) { + return true; + } + return !state.getMaterial().equals(Material.STONE) || BlocksHelper.isInvulnerable(state, world, pos); + } + + private static boolean isTerrainNear(WorldGenLevel world, BlockPos pos) { + for (Direction dir : BlocksHelper.DIRECTIONS) { + if (world.getBlockState(pos.relative(dir)).is(TagAPI.BLOCK_GEN_TERRAIN)) { + return true; + } + } + return false; + } + + public static void cover(WorldGenLevel world, BoundingBox bounds, Random random, BlockState defaultBlock) { + MutableBlockPos mut = new MutableBlockPos(); + for (int x = bounds.minX(); x <= bounds.maxX(); x++) { + mut.setX(x); + for (int z = bounds.minZ(); z <= bounds.maxZ(); z++) { + mut.setZ(z); + BlockState top = BiomeAPI.findTopMaterial(world.getBiome(mut)).orElse(defaultBlock); + for (int y = bounds.maxY(); y >= bounds.minY(); y--) { + mut.setY(y); + BlockState state = world.getBlockState(mut); + if (state.is(TagAPI.BLOCK_END_GROUND) && !world.getBlockState(mut.above()).getMaterial().isSolidBlocking()) { + BlocksHelper.setWithoutUpdate(world, mut, top); + } + } + } + } + } +} diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index e2c210b5..25c27a65 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -1,18 +1,177 @@ package ru.betterend.world.biome; +import net.minecraft.core.BlockPos; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.config.Configs; +import ru.bclib.world.biomes.BCLBiomeSettings; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.StructureFeaturesAccessor; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; -public class EndBiome extends BCLBiome { - public EndBiome(BCLBiomeDef definition) { - super(definition.loadConfigValues(Configs.BIOME_CONFIG)); +public class EndBiome extends BCLBiome implements SurfaceMaterialProvider { + public static class DefaultSurfaceMaterialProvider implements SurfaceMaterialProvider{ + public static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + @Override + public BlockState getTopMaterial() { + return getUnderMaterial(); + } + + @Override + public BlockState getAltTopMaterial() { + return getTopMaterial(); + } + + @Override + public BlockState getUnderMaterial() { + return END_STONE; + } + + @Override + public boolean generateFloorRule(){ + return true; + } + + @Override + public SurfaceRuleBuilder surface() { + SurfaceRuleBuilder builder = SurfaceRuleBuilder.start(); + + if (generateFloorRule() && getTopMaterial()!=getUnderMaterial()){ + if (getTopMaterial()!=getAltTopMaterial()){ + builder.floor(getTopMaterial()); + } else { + builder.chancedFloor(getTopMaterial(), getAltTopMaterial()); + } + } + return builder.filler(getUnderMaterial()); + } } - public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { - super(id, biome, fogDensity, genChance); - this.addCustomData("has_caves", hasCaves); + public abstract static class Config { + public static final SurfaceMaterialProvider DEFAULT_MATERIAL = new DefaultSurfaceMaterialProvider(); + + protected static final StructureFeaturesAccessor VANILLA_FEATURES = (StructureFeaturesAccessor)new StructureFeatures(); + protected static final SurfaceRules.RuleSource END_STONE = SurfaceRules.state(DefaultSurfaceMaterialProvider.END_STONE); + protected static final SurfaceRules.RuleSource END_MOSS = SurfaceRules.state(EndBlocks.END_MOSS.defaultBlockState()); + protected static final SurfaceRules.RuleSource ENDSTONE_DUST = SurfaceRules.state(EndBlocks.ENDSTONE_DUST.defaultBlockState()); + protected static final SurfaceRules.RuleSource END_MYCELIUM = SurfaceRules.state(EndBlocks.END_MYCELIUM.defaultBlockState()); + protected static final SurfaceRules.RuleSource FLAVOLITE =SurfaceRules.state(EndBlocks.FLAVOLITE.stone.defaultBlockState()); + protected static final SurfaceRules.RuleSource SULPHURIC_ROCK =SurfaceRules.state(EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState()); + protected static final SurfaceRules.RuleSource BRIMSTONE =SurfaceRules.state(EndBlocks.BRIMSTONE.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_FULL =SurfaceRules.state(EndBlocks.PALLIDIUM_FULL.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_HEAVY =SurfaceRules.state(EndBlocks.PALLIDIUM_HEAVY.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_THIN =SurfaceRules.state(EndBlocks.PALLIDIUM_THIN.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_TINY =SurfaceRules.state(EndBlocks.PALLIDIUM_TINY.defaultBlockState()); + protected static final SurfaceRules.RuleSource UMBRALITH =SurfaceRules.state(EndBlocks.UMBRALITH.stone.defaultBlockState()); + + public final ResourceLocation ID; + + protected Config(String name) { + this.ID = BetterEnd.makeID(name); + } + + protected abstract void addCustomBuildData(BCLBiomeBuilder builder); + + public BiomeSupplier getSupplier(){ + return EndBiome::new; + } + + protected boolean hasCaves(){ + return true; + } + + protected SurfaceMaterialProvider surfaceMaterial() { + return DEFAULT_MATERIAL; + } + } + + public EndBiome(ResourceLocation biomeID, Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + } + + public static EndBiome create(Config biomeConfig){ + BCLBiomeBuilder builder = BCLBiomeBuilder + .start(biomeConfig.ID) + .category(Biome.BiomeCategory.THEEND) + .music(SoundEvents.MUSIC_END) + .waterColor(4159204) + .waterFogColor(329011) + .fogColor(0xA080A0) + .skyColor(0) + .mood(EndSounds.AMBIENT_DUST_WASTELANDS) + .temperature(0.5f) + .wetness(0.5f) + .precipitation(Biome.Precipitation.NONE) + .surface(biomeConfig.surfaceMaterial().surface().build()); + + biomeConfig.addCustomBuildData(builder); + EndFeatures.addDefaultFeatures(builder, biomeConfig.hasCaves()); + + + EndBiome biome = builder.build(biomeConfig.getSupplier()); + biome.addCustomData("has_caves", biomeConfig.hasCaves()); + biome.setSurfaceMaterial(biomeConfig.surfaceMaterial()); + + return biome; + } + + + private SurfaceMaterialProvider surfMatProv = Config.DEFAULT_MATERIAL; + private void setSurfaceMaterial(SurfaceMaterialProvider prov) { + surfMatProv = prov; + } + + @Override + public BlockState getTopMaterial() { + return surfMatProv.getTopMaterial(); + } + + @Override + public BlockState getUnderMaterial() { + return surfMatProv.getUnderMaterial(); + } + + @Override + public BlockState getAltTopMaterial() { + return surfMatProv.getAltTopMaterial(); + } + + @Override + public boolean generateFloorRule() { return surfMatProv.generateFloorRule(); } + + @Override + public SurfaceRuleBuilder surface() { return surfMatProv.surface(); } + + public static BlockState findTopMaterial(BCLBiome biome){ + return BiomeAPI.findTopMaterial(biome).orElse(EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); + } + + public static BlockState findTopMaterial(Biome biome){ + return findTopMaterial(BiomeAPI.getBiome(biome)); + } + + public static BlockState findTopMaterial(WorldGenLevel world, BlockPos pos){ + return findTopMaterial(BiomeAPI.getBiome(world.getBiome(pos))); + } + + public static BlockState findUnderMaterial(BCLBiome biome){ + return BiomeAPI.findUnderMaterial(biome).orElse(EndBiome.Config.DEFAULT_MATERIAL.getUnderMaterial()); + } + + public static BlockState findUnderMaterial(WorldGenLevel world, BlockPos pos){ + return findUnderMaterial(BiomeAPI.getBiome(world.getBiome(pos))); } } diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index ac5109ee..1fbd812a 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -1,26 +1,33 @@ package ru.betterend.world.biome.air; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class BiomeIceStarfield extends EndBiome { +public class BiomeIceStarfield extends EndBiome.Config { public BiomeIceStarfield() { - super(new BCLBiomeDef(BetterEnd.makeID("ice_starfield")) - .addCustomData("has_caves", false) - .addStructureFeature(EndStructures.GIANT_ICE_STAR.getFeatureConfigured()) - .setFogColor(224, 245, 254) - .setTemperature(0F) - .setFogDensity(2.2F) - .setFoliageColor(193, 244, 244) - .setGenChance(0.25F) - .setParticles(EndParticles.SNOWFLAKE, 0.002F) - .addFeature(EndFeatures.ICE_STAR) - .addFeature(EndFeatures.ICE_STAR_SMALL) - .addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); + super("ice_starfield"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.GIANT_ICE_STAR.getFeatureConfigured()) + .fogColor(224, 245, 254) + .temperature(0F) + .fogDensity(2.2F) + .foliageColor(193, 244, 244) + .genChance(0.25F) + .particles(EndParticles.SNOWFLAKE, 0.002F) + .feature(EndFeatures.ICE_STAR) + .feature(EndFeatures.ICE_STAR_SMALL) + .spawn(EntityType.ENDERMAN, 20, 1, 4); } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 7ab06f41..8d6dbdb4 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -1,31 +1,50 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +public class EmptyAuroraCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.01F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptyAuroraCaveBiome extends EndCaveBiome { public EmptyAuroraCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_aurora_cave")) - .setFogColor(150, 30, 68) - .setFogDensity(2.0F) - .setPlantsColor(108, 25, 46) - .setWaterAndFogColor(186, 77, 237) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); - - this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_aurora_cave"); } - + @Override - public float getFloorDensity() { - return 0.01F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(150, 30, 68) + .fogDensity(2.0F) + .plantsColor(108, 25, 46) + .waterAndFogColor(186, 77, 237) + .particles(EndParticles.GLOWING_SPHERE, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiomeSupplier getSupplier() { + return EmptyAuroraCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 151e7475..d6e1b52c 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -1,23 +1,46 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class EmptyEndCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptyEndCaveBiome extends EndCaveBiome { public EmptyEndCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_end_cave")).setFogDensity(2.0F)); - this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_end_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogDensity(2.0F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiomeSupplier getSupplier() { + return Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index 8fe0f4a8..a90d3536 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -1,32 +1,51 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +public class EmptySmaragdantCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptySmaragdantCaveBiome extends EndCaveBiome { public EmptySmaragdantCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_smaragdant_cave")) - .setFogColor(0, 253, 182) - .setFogDensity(2.0F) - .setPlantsColor(0, 131, 145) - .setWaterAndFogColor(31, 167, 212) - .setParticles(EndParticles.SMARAGDANT, 0.001F)); - - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_smaragdant_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(0, 253, 182) + .fogDensity(2.0F) + .plantsColor(0, 131, 145) + .waterAndFogColor(31, 167, 212) + .particles(EndParticles.SMARAGDANT, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiomeSupplier getSupplier() { + return EmptySmaragdantCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index e25ea7db..d1047305 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,53 +1,77 @@ package ru.betterend.world.biome.cave; -import java.util.Random; - import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.api.BiomeAPI; -import ru.bclib.world.biomes.BCLBiomeDef; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.util.WeightedList; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.bclib.world.features.BCLFeature; import ru.betterend.BetterEnd; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; +import java.util.Random; + public class EndCaveBiome extends EndBiome { + public static abstract class Config extends EndBiome.Config { + protected Config(String name) { + super(name); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + BCLFeature feature = BCLFeature.makeChunkFeature( + BetterEnd.makeID(ID.getPath() + "_cave_populator"), + GenerationStep.Decoration.RAW_GENERATION, + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(ID)) + ); + + builder.category(BiomeCategory.NONE) + .feature(feature) + .music(EndSounds.MUSIC_CAVES) + .loop(EndSounds.AMBIENT_CAVES); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + public BiomeSupplier getSupplier() { + return EndCaveBiome::new; + } + } + private WeightedList> floorFeatures = new WeightedList>(); private WeightedList> ceilFeatures = new WeightedList>(); - - public EndCaveBiome(BCLBiomeDef definition) { - super(makeDef(definition)); + + public EndCaveBiome(ResourceLocation biomeID, Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); } - private static BCLBiomeDef makeDef(BCLBiomeDef definition) { - BCLFeature feature = BCLFeature.makeChunkFeature( - BetterEnd.makeID(definition.getID().getPath() + "_cave_populator"), - new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(definition.getID())) - ); - definition.setCategory(BiomeCategory.NONE).addFeature(feature); - definition.setMusic(EndSounds.MUSIC_CAVES); - definition.setLoop(EndSounds.AMBIENT_CAVES); - return definition; - } - - public void addFloorFeature(Feature feature, int weight) { + public void addFloorFeature(Feature feature, float weight) { floorFeatures.add(feature, weight); } - public void addCeilFeature(Feature feature, int weight) { + public void addCeilFeature(Feature feature, float weight) { ceilFeatures.add(feature, weight); } public Feature getFloorFeature(Random random) { - return floorFeatures.isEmpty() ? null : floorFeatures.getOne(random); + return floorFeatures.isEmpty() ? null : floorFeatures.get(random); } public Feature getCeilFeature(Random random) { - return ceilFeatures.isEmpty() ? null : ceilFeatures.getOne(random); + return ceilFeatures.isEmpty() ? null : ceilFeatures.get(random); } public float getFloorDensity() { @@ -65,4 +89,8 @@ public class EndCaveBiome extends EndBiome { public BlockState getWall(BlockPos pos) { return null; } + + public static EndCaveBiome create(EndBiome.Config biomeConfig){ + return (EndCaveBiome) EndBiome.create(biomeConfig); + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java index 17c9b05e..39e22937 100644 --- a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java @@ -1,34 +1,53 @@ package ru.betterend.world.biome.cave; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import ru.betterend.world.biome.EndBiome; -public class JadeCaveBiome extends EndCaveBiome { - private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); - private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); - private static final BlockState[] JADE = new BlockState[3]; - - public JadeCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("jade_cave")) - .setFogColor(118, 150, 112) - .setFogDensity(2.0F) - .setWaterAndFogColor(95, 223, 255) - ); - JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); - JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); - JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); +public class JadeCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); + private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); + private static final BlockState[] JADE = new BlockState[3]; + + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); + JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); + JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); + } + + @Override + public BlockState getWall(BlockPos pos) { + double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; + int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); + index = Mth.abs(index) % 3; + return JADE[index]; + } } - + + public JadeCaveBiome() { + super("jade_cave"); + } + @Override - public BlockState getWall(BlockPos pos) { - double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; - int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); - index = Mth.abs(index) % 3; - return JADE[index]; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(118, 150, 112) + .fogDensity(2.0F) + .waterAndFogColor(95, 223, 255); + } + + @Override + public BiomeSupplier getSupplier() { + return JadeCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 0ac0206e..fd452ad1 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -1,48 +1,79 @@ package ru.betterend.world.biome.cave; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; import ru.bclib.blocks.BlockProperties; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +public class LushAuroraCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); + this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); + + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); + this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); + this.addCeilFeature(EndFeatures.RUBINEA, 3); + this.addCeilFeature(EndFeatures.MAGNULA, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); + } + + @Override + public float getFloorDensity() { + return 0.2F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + + @Override + public BlockState getCeil(BlockPos pos) { + return EndBlocks.CAVE_MOSS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP); + } + } -public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lush_aurora_cave")) - .setFogColor(150, 30, 68) - .setFogDensity(2.0F) - .setPlantsColor(108, 25, 46) - .setWaterAndFogColor(186, 77, 237) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setSurface(EndBlocks.CAVE_MOSS)); - - this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); - this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); - this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); - - this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); - this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); - this.addCeilFeature(EndFeatures.RUBINEA, 3); - this.addCeilFeature(EndFeatures.MAGNULA, 1); - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); + super("lush_aurora_cave"); } - + @Override - public float getFloorDensity() { - return 0.2F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(150, 30, 68) + .fogDensity(2.0F) + .plantsColor(108, 25, 46) + .waterAndFogColor(186, 77, 237) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + ; } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiomeSupplier getSupplier() { + return LushAuroraCaveBiome.Biome::new; } - + @Override - public BlockState getCeil(BlockPos pos) { - return EndBlocks.CAVE_MOSS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP); + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CAVE_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index 814ad4a6..240e7a52 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -1,34 +1,64 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BCLBiomeBuilder.BiomeSupplier; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.bclib.world.biomes.BCLBiomeSettings; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +public class LushSmaragdantCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome, BCLBiomeSettings settings) { + super(biomeID, biome, settings); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class LushSmaragdantCaveBiome extends EndCaveBiome { public LushSmaragdantCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lush_smaragdant_cave")) - .setFogColor(0, 253, 182) - .setFogDensity(2.0F) - .setPlantsColor(0, 131, 145) - .setWaterAndFogColor(31, 167, 212) - .setParticles(EndParticles.SMARAGDANT, 0.001F) - .setSurface(EndBlocks.CAVE_MOSS)); - - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("lush_smaragdant_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(0, 253, 182) + .fogDensity(2.0F) + .plantsColor(0, 131, 145) + .waterAndFogColor(31, 167, 212) + .particles(EndParticles.SMARAGDANT, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiomeSupplier getSupplier() { + return LushSmaragdantCaveBiome.Biome::new; + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CAVE_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index 63032057..10ab2c0d 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,9 +1,9 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -11,29 +11,44 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class AmberLandBiome extends EndBiome { +public class AmberLandBiome extends EndBiome.Config { public AmberLandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("amber_land")) - .setFogColor(255, 184, 71) - .setFogDensity(2.0F) - .setPlantsColor(219, 115, 38) - .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.AMBER_SPHERE, 0.001F) - .setSurface(EndBlocks.AMBER_MOSS) - .addFeature(EndFeatures.AMBER_ORE) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.HELIX_TREE) - .addFeature(EndFeatures.LANCELEAF) - .addFeature(EndFeatures.GLOW_PILLAR) - .addFeature(EndFeatures.AMBER_GRASS) - .addFeature(EndFeatures.AMBER_ROOT) - .addFeature(EndFeatures.BULB_MOSS) - .addFeature(EndFeatures.BULB_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); + super("amber_land"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(255, 184, 71) + .fogDensity(2.0F) + .plantsColor(219, 115, 38) + .waterAndFogColor(145, 108, 72) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_AMBER_LAND) + .particles(EndParticles.AMBER_SPHERE, 0.001F) + .feature(EndFeatures.AMBER_ORE) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.HELIX_TREE) + .feature(EndFeatures.LANCELEAF) + .feature(EndFeatures.GLOW_PILLAR) + .feature(EndFeatures.AMBER_GRASS) + .feature(EndFeatures.AMBER_ROOT) + .feature(EndFeatures.BULB_MOSS) + .feature(EndFeatures.BULB_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 4) + .spawn(EndEntities.END_SLIME, 30, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.AMBER_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index 46e0c3a8..90fdda64 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -1,36 +1,55 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class BlossomingSpiresBiome extends EndBiome { +public class BlossomingSpiresBiome extends EndBiome.Config { public BlossomingSpiresBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("blossoming_spires")) - .addCustomData("has_caves", false) - .setFogColor(241, 146, 229) - .setFogDensity(1.7F) - .setPlantsColor(122, 45, 122) - .setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) - .addFeature(EndFeatures.SPIRE) - .addFeature(EndFeatures.FLOATING_SPIRE) - .addFeature(EndFeatures.TENANEA) - .addFeature(EndFeatures.TENANEA_BUSH) - .addFeature(EndFeatures.BULB_VINE) - .addFeature(EndFeatures.BUSHY_GRASS) - .addFeature(EndFeatures.BUSHY_GRASS_WG) - .addFeature(EndFeatures.BLOSSOM_BERRY) - .addFeature(EndFeatures.TWISTED_MOSS) - .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addFeature(EndFeatures.SILK_MOTH_NEST) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); + super("blossoming_spires"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(241, 146, 229) + .fogDensity(1.7F) + .plantsColor(122, 45, 122) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) + .feature(EndFeatures.SPIRE) + .feature(EndFeatures.FLOATING_SPIRE) + .feature(EndFeatures.TENANEA) + .feature(EndFeatures.TENANEA_BUSH) + .feature(EndFeatures.BULB_VINE) + .feature(EndFeatures.BUSHY_GRASS) + .feature(EndFeatures.BUSHY_GRASS_WG) + .feature(EndFeatures.BLOSSOM_BERRY) + .feature(EndFeatures.TWISTED_MOSS) + .feature(EndFeatures.TWISTED_MOSS_WOOD) + .feature(EndFeatures.SILK_MOTH_NEST) + .spawn(EntityType.ENDERMAN, 50, 1, 4) + .spawn(EndEntities.SILK_MOTH, 5, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.PINK_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 5a2024cc..e3f2c38a 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -1,44 +1,57 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.Features; -import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.data.worldgen.placement.EndPlacements; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class ChorusForestBiome extends EndBiome { +public class ChorusForestBiome extends EndBiome.Config { public ChorusForestBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("chorus_forest")) - .setFogColor(87, 26, 87) - .setFogDensity(1.5F) - .setPlantsColor(122, 45, 122) - .setWaterAndFogColor(73, 30, 73) - .setSurface(EndBlocks.CHORUS_NYLIUM) - .setParticles(ParticleTypes.PORTAL, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.PYTHADENDRON_TREE) - .addFeature(EndFeatures.PYTHADENDRON_BUSH) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) - .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) - .addFeature(EndFeatures.CHORUS_GRASS) - .addFeature(EndFeatures.CHORUS_MUSHROOM) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + super("chorus_forest"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(87, 26, 87) + .fogDensity(1.5F) + .plantsColor(122, 45, 122) + .waterAndFogColor(73, 30, 73) + .particles(ParticleTypes.PORTAL, 0.01F) + .loop(EndSounds.AMBIENT_CHORUS_FOREST) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.VIOLECITE_LAYER) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.PYTHADENDRON_TREE) + .feature(EndFeatures.PYTHADENDRON_BUSH) + .feature(EndFeatures.PURPLE_POLYPORE) + .feature(Decoration.VEGETAL_DECORATION, EndPlacements.CHORUS_PLANT) + .feature(EndFeatures.CHORUS_GRASS) + .feature(EndFeatures.CHORUS_MUSHROOM) + .feature(EndFeatures.TAIL_MOSS) + .feature(EndFeatures.TAIL_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_PURPLE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 50, 1, 4); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CHORUS_NYLIUM.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index bbdbfc9e..67e2d18f 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -1,23 +1,37 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class CrystalMountainsBiome extends EndBiome { +public class CrystalMountainsBiome extends EndBiome.Config { public CrystalMountainsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("crystal_mountains")) - .addStructureFeature(EndStructures.MOUNTAIN.getFeatureConfigured()) - .setPlantsColor(255, 133, 211) - .setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.ROUND_CAVE) - .addFeature(EndFeatures.CRYSTAL_GRASS) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("crystal_mountains"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .structure(EndStructures.MOUNTAIN.getFeatureConfigured()) + .plantsColor(255, 133, 211) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.CRYSTAL_GRASS) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CRYSTAL_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 57e1fc00..07a60085 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -1,34 +1,50 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DragonGraveyardsBiome extends EndBiome { +public class DragonGraveyardsBiome extends EndBiome.Config { public DragonGraveyardsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dragon_graveyards")) - .setGenChance(0.1F) - .setFogColor(244, 46, 79) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.0007F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.SANGNUM) - .setWaterAndFogColor(203, 59, 167) - .setPlantsColor(244, 46, 79) - .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) - .addFeature(EndFeatures.FALLEN_PILLAR) - .addFeature(EndFeatures.OBSIDIAN_BOULDER) - .addFeature(EndFeatures.GIGANTIC_AMARANITA) - .addFeature(EndFeatures.LARGE_AMARANITA) - .addFeature(EndFeatures.SMALL_AMARANITA) - .addFeature(EndFeatures.GLOBULAGUS) - .addFeature(EndFeatures.CLAWFERN) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dragon_graveyards"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .genChance(0.1f) + .fogColor(244, 46, 79) + .fogDensity(1.3F) + .particles(EndParticles.FIREFLY, 0.0007F) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .waterAndFogColor(203, 59, 167) + .plantsColor(244, 46, 79) + .feature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .feature(EndFeatures.DRAGON_BONE_BLOCK_ORE) + .feature(EndFeatures.FALLEN_PILLAR) + .feature(EndFeatures.OBSIDIAN_BOULDER) + .feature(EndFeatures.GIGANTIC_AMARANITA) + .feature(EndFeatures.LARGE_AMARANITA) + .feature(EndFeatures.SMALL_AMARANITA) + .feature(EndFeatures.GLOBULAGUS) + .feature(EndFeatures.CLAWFERN) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.SANGNUM.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index 6d78ad1a..d8e2362f 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,29 +1,43 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DryShrublandBiome extends EndBiome { +public class DryShrublandBiome extends EndBiome.Config { public DryShrublandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dry_shrubland")) - .setFogColor(132, 35, 13) - .setFogDensity(1.2F) - .setWaterAndFogColor(113, 88, 53) - .setPlantsColor(237, 122, 66) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.LUCERNIA_BUSH_RARE) - .addFeature(EndFeatures.ORANGO) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS) - .addFeature(EndFeatures.LAMELLARIUM) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dry_shrubland"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(132, 35, 13) + .fogDensity(1.2F) + .waterAndFogColor(113, 88, 53) + .plantsColor(237, 122, 66) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.LUCERNIA_BUSH_RARE) + .feature(EndFeatures.ORANGO) + .feature(EndFeatures.AERIDIUM) + .feature(EndFeatures.LUTEBUS) + .feature(EndFeatures.LAMELLARIUM) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.RUTISCUS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index e13be0f7..ebed3bbc 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -1,26 +1,54 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.placement.CaveSurface; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DustWastelandsBiome extends EndBiome { +public class DustWastelandsBiome extends EndBiome.Config { public DustWastelandsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dust_wastelands")) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setDepth(1.5F) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dust_wastelands"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(192, 180, 131) + .terrainHeight(1.5F) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .music(EndSounds.MUSIC_OPENSPACE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + + @Override + public SurfaceRuleBuilder surface() { + return super + .surface() + .ceil(Blocks.END_STONE.defaultBlockState()) + .rule(4, SurfaceRules.ifTrue(SurfaceRules.stoneDepthCheck(5, false, false, CaveSurface.FLOOR), + SurfaceRules.state(EndBlocks.ENDSTONE_DUST.defaultBlockState()) + )); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 3896e6a6..1f8d065d 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,9 +1,9 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -12,37 +12,58 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class FoggyMushroomlandBiome extends EndBiome { +public class FoggyMushroomlandBiome extends EndBiome.Config { public FoggyMushroomlandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("foggy_mushroomland")) - .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM.getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(41, 122, 173) - .setFogDensity(3) - .setWaterAndFogColor(119, 227, 250) - .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOREST) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.BLUE_VINE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.DENSE_VINE) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.END_LILY) - .addFeature(EndFeatures.BUBBLE_CORAL) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) - .addMobSpawn(EndEntities.END_FISH, 20, 2, 5) - .addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("foggy_mushroomland"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .structure(EndStructures.GIANT_MOSSY_GLOWSHROOM.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(41, 122, 173) + .fogDensity(3) + .waterAndFogColor(119, 227, 250) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .loop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) + .music(EndSounds.MUSIC_FOREST) + .feature(EndFeatures.END_LAKE) + .feature(EndFeatures.MOSSY_GLOWSHROOM) + .feature(EndFeatures.BLUE_VINE) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.DENSE_VINE) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CYAN_MOSS) + .feature(EndFeatures.CYAN_MOSS_WOOD) + .feature(EndFeatures.END_LILY) + .feature(EndFeatures.BUBBLE_CORAL) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EndEntities.DRAGONFLY, 80, 2, 5) + .spawn(EndEntities.END_FISH, 20, 2, 5) + .spawn(EndEntities.CUBOZOA, 10, 3, 8) + .spawn(EndEntities.END_SLIME, 10, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.END_MYCELIUM.defaultBlockState(); + } + }; + + } } diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index 5435e994..6e84c521 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,40 +1,54 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class GlowingGrasslandsBiome extends EndBiome { +public class GlowingGrasslandsBiome extends EndBiome.Config { public GlowingGrasslandsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("glowing_grasslands")) - .setFogColor(99, 228, 247) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.001F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.END_MOSS) - .setWaterAndFogColor(92, 250, 230) - .setPlantsColor(73, 210, 209) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.LUMECORN) - .addFeature(EndFeatures.BLOOMING_COOKSONIA) - .addFeature(EndFeatures.SALTEAGO) - .addFeature(EndFeatures.VAIOLUSH_FERN) - .addFeature(EndFeatures.FRACTURN) - .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CREEPING_MOSS_RARE) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("glowing_grasslands"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(99, 228, 247) + .fogDensity(1.3F) + .particles(EndParticles.FIREFLY, 0.001F) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .waterAndFogColor(92, 250, 230) + .plantsColor(73, 210, 209) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.LUMECORN) + .feature(EndFeatures.BLOOMING_COOKSONIA) + .feature(EndFeatures.SALTEAGO) + .feature(EndFeatures.VAIOLUSH_FERN) + .feature(EndFeatures.FRACTURN) + .feature(EndFeatures.UMBRELLA_MOSS_RARE) + .feature(EndFeatures.CREEPING_MOSS_RARE) + .feature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index a7954a63..d738a6ef 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -1,40 +1,54 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class LanternWoodsBiome extends EndBiome { +public class LanternWoodsBiome extends EndBiome.Config { public LanternWoodsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lantern_woods")) - .setFogColor(189, 82, 70) - .setFogDensity(1.1F) - .setWaterAndFogColor(171, 234, 226) - .setPlantsColor(254, 85, 57) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .addFeature(EndFeatures.END_LAKE_NORMAL) - .addFeature(EndFeatures.FLAMAEA) - .addFeature(EndFeatures.LUCERNIA) - .addFeature(EndFeatures.LUCERNIA_BUSH) - .addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LAMELLARIUM) - .addFeature(EndFeatures.BOLUX_MUSHROOM) - .addFeature(EndFeatures.AURANT_POLYPORE) - .addFeature(EndFeatures.POND_ANEMONE) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addFeature(EndFeatures.RUSCUS) - .addFeature(EndFeatures.RUSCUS_WOOD) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("lantern_woods"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(189, 82, 70) + .fogDensity(1.1F) + .waterAndFogColor(171, 234, 226) + .plantsColor(254, 85, 57) + .music(EndSounds.MUSIC_FOREST) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .feature(EndFeatures.END_LAKE_NORMAL) + .feature(EndFeatures.FLAMAEA) + .feature(EndFeatures.LUCERNIA) + .feature(EndFeatures.LUCERNIA_BUSH) + .feature(EndFeatures.FILALUX) + .feature(EndFeatures.AERIDIUM) + .feature(EndFeatures.LAMELLARIUM) + .feature(EndFeatures.BOLUX_MUSHROOM) + .feature(EndFeatures.AURANT_POLYPORE) + .feature(EndFeatures.POND_ANEMONE) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED) + .feature(EndFeatures.RUSCUS) + .feature(EndFeatures.RUSCUS_WOOD) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.RUTISCUS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 7a42bccd..964f329d 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -1,8 +1,9 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -10,33 +11,52 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class MegalakeBiome extends EndBiome { +public class MegalakeBiome extends EndBiome.Config { public MegalakeBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("megalake")) - .addStructureFeature(EndStructures.MEGALAKE.getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(1.75F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE) - .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) - .setDepth(0F) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("megalake"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .structure(EndStructures.MEGALAKE.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(178, 209, 248) + .waterAndFogColor(96, 163, 255) + .fogDensity(1.75F) + .music(EndSounds.MUSIC_WATER) + .loop(EndSounds.AMBIENT_MEGALAKE) + .terrainHeight(0F) + .feature(EndFeatures.END_LOTUS) + .feature(EndFeatures.END_LOTUS_LEAF) + .feature(EndFeatures.BUBBLE_CORAL_RARE) + .feature(EndFeatures.END_LILY_RARE) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .feature(EndFeatures.MENGER_SPONGE) + .spawn(EndEntities.DRAGONFLY, 50, 1, 3) + .spawn(EndEntities.END_FISH, 50, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index a5e16704..46e51902 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -1,8 +1,9 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -11,35 +12,49 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class MegalakeGroveBiome extends EndBiome { +public class MegalakeGroveBiome extends EndBiome.Config { public MegalakeGroveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("megalake_grove")) - .addStructureFeature(EndStructures.MEGALAKE_SMALL.getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(2.0F) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) - .setSurface(EndBlocks.END_MOSS) - .setDepth(0F) - .addFeature(EndFeatures.LACUGROVE) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("megalake_grove"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .structure(EndStructures.MEGALAKE_SMALL.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(178, 209, 248) + .waterAndFogColor(96, 163, 255) + .fogDensity(2.0F) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .music(EndSounds.MUSIC_WATER) + .loop(EndSounds.AMBIENT_MEGALAKE_GROVE) + .terrainHeight(0F) + .feature(EndFeatures.LACUGROVE) + .feature(EndFeatures.END_LOTUS) + .feature(EndFeatures.END_LOTUS_LEAF) + .feature(EndFeatures.BUBBLE_CORAL_RARE) + .feature(EndFeatures.END_LILY_RARE) + .feature(EndFeatures.UMBRELLA_MOSS) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .feature(EndFeatures.MENGER_SPONGE) + .spawn(EndEntities.DRAGONFLY, 20, 1, 3) + .spawn(EndEntities.END_FISH, 20, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 3d2619b1..b5fa6294 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -1,34 +1,80 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.placement.CaveSurface; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.api.surface.rules.SwitchRuleSource; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.surface.SplitNoiseCondition; -public class NeonOasisBiome extends EndBiome { +import java.util.List; + +public class NeonOasisBiome extends EndBiome.Config { public NeonOasisBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("neon_oasis")) - .setGenChance(0.5F) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(106, 238, 215) - .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.DESERT_LAKE) - .addFeature(EndFeatures.NEON_CACTUS) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("neon_oasis"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .genChance(0.5F) + .fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(106, 238, 215) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.DESERT_LAKE) + .feature(EndFeatures.NEON_CACTUS) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_RED) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + + @Override + public SurfaceRuleBuilder surface() { + RuleSource surfaceBlockRule = new SwitchRuleSource( + new SplitNoiseCondition(), + List.of( + SurfaceRules.state(EndBlocks.ENDSTONE_DUST.defaultBlockState()), + SurfaceRules.state(EndBlocks.END_MOSS.defaultBlockState()) + ) + ); + return super + .surface() + .ceil(Blocks.END_STONE.defaultBlockState()) + .rule(1, SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, surfaceBlockRule)) + .rule(4, SurfaceRules.ifTrue(SurfaceRules.stoneDepthCheck(5, false, false, CaveSurface.FLOOR), + SurfaceRules.state(EndBlocks.ENDSTONE_DUST.defaultBlockState()) + )); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index 8bf6fbbc..f313a597 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -2,24 +2,39 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class PaintedMountainsBiome extends EndBiome { +public class PaintedMountainsBiome extends EndBiome.Config { public PaintedMountainsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("painted_mountains")) - .addStructureFeature(EndStructures.PAINTED_MOUNTAIN.getFeatureConfigured()) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("painted_mountains"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .structure(EndStructures.PAINTED_MOUNTAIN.getFeatureConfigured()) + .fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(192, 180, 131) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index a3bde81b..ad3fdeed 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -1,44 +1,58 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class ShadowForestBiome extends EndBiome { +public class ShadowForestBiome extends EndBiome.Config { public ShadowForestBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("shadow_forest")) - .setFogColor(0, 0, 0) - .setFogDensity(2.5F) - .setPlantsColor(45, 45, 45) - .setWaterAndFogColor(42, 45, 80) - .setSurface(EndBlocks.SHADOW_GRASS) - .setParticles(ParticleTypes.MYCELIUM, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.DRAGON_TREE) - .addFeature(EndFeatures.DRAGON_TREE_BUSH) - .addFeature(EndFeatures.SHADOW_PLANT) - .addFeature(EndFeatures.MURKWEED) - .addFeature(EndFeatures.NEEDLEGRASS) - .addFeature(EndFeatures.SHADOW_BERRY) - .addFeature(EndFeatures.TWISTED_VINE) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4) - .addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) - .addMobSpawn(EntityType.PHANTOM, 1, 1, 2)); + super("shadow_forest"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(0, 0, 0) + .fogDensity(2.5F) + .plantsColor(45, 45, 45) + .waterAndFogColor(42, 45, 80) + .particles(ParticleTypes.MYCELIUM, 0.01F) + .loop(EndSounds.AMBIENT_CHORUS_FOREST) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.VIOLECITE_LAYER) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.DRAGON_TREE) + .feature(EndFeatures.DRAGON_TREE_BUSH) + .feature(EndFeatures.SHADOW_PLANT) + .feature(EndFeatures.MURKWEED) + .feature(EndFeatures.NEEDLEGRASS) + .feature(EndFeatures.SHADOW_BERRY) + .feature(EndFeatures.TWISTED_VINE) + .feature(EndFeatures.PURPLE_POLYPORE) + .feature(EndFeatures.TAIL_MOSS) + .feature(EndFeatures.TAIL_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_PURPLE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EndEntities.SHADOW_WALKER, 80, 2, 4) + .spawn(EntityType.ENDERMAN, 40, 1, 4) + .spawn(EntityType.PHANTOM, 1, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.SHADOW_GRASS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 8caad6f7..0b4a25d5 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -1,38 +1,93 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import net.minecraft.world.level.levelgen.placement.CaveSurface; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.api.surface.rules.SwitchRuleSource; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.surface.SurfaceBuilders; +import ru.betterend.world.surface.SulphuricSurfaceNoiseCondition; -public class SulphurSpringsBiome extends EndBiome { +import java.util.List; + +public class SulphurSpringsBiome extends EndBiome.Config { public SulphurSpringsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("sulphur_springs")) - .addCustomData("has_caves", false) - .setSurface(SurfaceBuilders.SULPHURIC_SURFACE.configured(SurfaceBuilders.DEFAULT_END_CONFIG)) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) - .setWaterColor(25, 90, 157) - .setWaterFogColor(30, 65, 61) - .setFogColor(207, 194, 62) - .setFogDensity(1.5F) - .setDepth(0F) - .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) - .addFeature(EndFeatures.GEYSER) - .addFeature(EndFeatures.SURFACE_VENT) - .addFeature(EndFeatures.SULPHURIC_LAKE) - .addFeature(EndFeatures.SULPHURIC_CAVE) - .addFeature(EndFeatures.HYDRALUX) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + super("sulphur_springs"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_SULPHUR_SPRINGS) + .waterColor(25, 90, 157) + .waterFogColor(30, 65, 61) + .fogColor(207, 194, 62) + .fogDensity(1.5F) + .terrainHeight(0F) + .particles(EndParticles.SULPHUR_PARTICLE, 0.001F) + .feature(EndFeatures.GEYSER) + .feature(EndFeatures.SURFACE_VENT) + .feature(EndFeatures.SULPHURIC_LAKE) + .feature(EndFeatures.SULPHURIC_CAVE) + .feature(EndFeatures.HYDRALUX) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .spawn(EndEntities.END_FISH, 50, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EntityType.ENDERMAN, 50, 1, 4); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.FLAVOLITE.stone.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return Blocks.END_STONE.defaultBlockState(); + } + + @Override + public boolean generateFloorRule() { + return false; + } + + @Override + public SurfaceRuleBuilder surface() { + RuleSource surfaceBlockRule = new SwitchRuleSource( + new SulphuricSurfaceNoiseCondition(), + List.of( + SurfaceRules.state(surfaceMaterial().getAltTopMaterial()), + SurfaceRules.state(surfaceMaterial().getTopMaterial()), + SULPHURIC_ROCK, + BRIMSTONE + ) + ); + return super + .surface() + .rule(2, SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, surfaceBlockRule)) + .rule(2, SurfaceRules.ifTrue(SurfaceRules.stoneDepthCheck(5, false, false, CaveSurface.FLOOR), surfaceBlockRule)); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java new file mode 100644 index 00000000..5e75208d --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java @@ -0,0 +1,92 @@ +package ru.betterend.world.biome.land; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.api.surface.rules.SwitchRuleSource; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndParticles; +import ru.betterend.registry.EndSounds; +import ru.betterend.world.biome.EndBiome; +import ru.betterend.world.surface.UmbraSurfaceNoiseCondition; + +import java.util.List; + +public class UmbraValleyBiome extends EndBiome.Config { + private static final Block[] SURFACE_BLOCKS = new Block[] { + EndBlocks.PALLIDIUM_FULL, + EndBlocks.PALLIDIUM_HEAVY, + EndBlocks.PALLIDIUM_THIN, + EndBlocks.PALLIDIUM_TINY, + EndBlocks.UMBRALITH.stone + }; + + public UmbraValleyBiome() { + super("umbra_valley"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(100, 100, 100) + .plantsColor(172, 189, 190) + .waterAndFogColor(69, 104, 134) + .particles(EndParticles.AMBER_SPHERE, 0.0001F) + .loop(EndSounds.UMBRA_VALLEY) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.UMBRALITH_ARCH) + .feature(EndFeatures.THIN_UMBRALITH_ARCH) + .feature(EndFeatures.INFLEXIA) + .feature(EndFeatures.FLAMMALIX); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.UMBRALITH.stone.defaultBlockState(); + } + + @Override + public BlockState getUnderMaterial() { + return EndBlocks.UMBRALITH.stone.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.PALLIDIUM_FULL.defaultBlockState(); + } + + @Override + public boolean generateFloorRule() { + return false; + } + + @Override + public SurfaceRuleBuilder surface() { + return super.surface() + .rule(2, SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, + new SwitchRuleSource( + new UmbraSurfaceNoiseCondition(), + List.of( + SurfaceRules.state(surfaceMaterial().getAltTopMaterial()), + PALLIDIUM_HEAVY, + PALLIDIUM_THIN, + PALLIDIUM_TINY, + SurfaceRules.state(surfaceMaterial().getTopMaterial()) + ) + ) + )); + } + }; + } + + public static Block getSurface(int x, int z) { + return SURFACE_BLOCKS[UmbraSurfaceNoiseCondition.getDepth(x, z)]; + } +} diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index dacda618..35b5d09f 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -1,44 +1,58 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class UmbrellaJungleBiome extends EndBiome { +public class UmbrellaJungleBiome extends EndBiome.Config { public UmbrellaJungleBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("umbrella_jungle")) - .setFogColor(87, 223, 221) - .setWaterAndFogColor(119, 198, 253) - .setFoliageColor(27, 183, 194) - .setFogDensity(2.3F) - .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) - .setSurface(EndBlocks.JUNGLE_MOSS) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.UMBRELLA_TREE) - .addFeature(EndFeatures.JELLYSHROOM) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) - .addFeature(EndFeatures.JUNGLE_GRASS) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.JUNGLE_FERN_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) - .addFeature(EndFeatures.JUNGLE_VINE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("umbrella_jungle"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .fogColor(87, 223, 221) + .waterAndFogColor(119, 198, 253) + .foliageColor(27, 183, 194) + .fogDensity(2.3F) + .particles(EndParticles.JUNGLE_SPORE, 0.001F) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) + .feature(EndFeatures.END_LAKE) + .feature(EndFeatures.UMBRELLA_TREE) + .feature(EndFeatures.JELLYSHROOM) + .feature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .feature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) + .feature(EndFeatures.JUNGLE_GRASS) + .feature(EndFeatures.CYAN_MOSS) + .feature(EndFeatures.CYAN_MOSS_WOOD) + .feature(EndFeatures.JUNGLE_FERN_WOOD) + .feature(EndFeatures.SMALL_JELLYSHROOM_WALL) + .feature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .feature(EndFeatures.SMALL_JELLYSHROOM_CEIL) + .feature(EndFeatures.JUNGLE_VINE) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEndCity()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.JUNGLE_MOSS.defaultBlockState(); + } + }; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index b58474a3..95e7c05e 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -1,17 +1,13 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.operator.SDFTranslate; @@ -19,39 +15,43 @@ import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.world.biome.EndBiome; public class BiomeIslandFeature extends DefaultFeature { private static final MutableBlockPos CENTER = new MutableBlockPos(); private static final SDF ISLAND; - + private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Biome biome = world.getBiome(pos); - SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); - BlockState topMaterial = surfaceConfig.getTopMaterial(); + int dist = BlocksHelper.downRay(world, pos, 10) + 1; + BlockPos surfacePos = new BlockPos(pos.getX(), pos.getY()-dist, pos.getZ()); + BlockState topMaterial = EndBiome.findTopMaterial(world, surfacePos);; + if (BlocksHelper.isFluid(topMaterial)) { - topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); - } else { - topBlock = topMaterial; + topBlock = Blocks.GRAVEL.defaultBlockState(); + underBlock = Blocks.STONE.defaultBlockState(); } - underBlock = surfaceConfig.getUnderMaterial(); + else { + underBlock = EndBiome.findUnderMaterial(world, surfacePos); + } + simplexNoise = new OpenSimplexNoise(world.getSeed()); CENTER.set(pos); ISLAND.fillRecursive(world, pos.below()); return true; } - + private static SDF createSDFIsland() { SDF sdfCone = new SDFCappedCone().setRadius1(0).setRadius2(6).setHeight(4).setBlock(pos -> { - if (pos.getY() > CENTER.getY()) - return AIR; - if (pos.getY() == CENTER.getY()) - return topBlock; + if (pos.getY() > CENTER.getY()) return AIR; + if (pos.getY() == CENTER.getY()) return topBlock; return underBlock; }); sdfCone = new SDFTranslate().setTranslate(0, -2, 0).setSource(sdfCone); @@ -59,14 +59,15 @@ public class BiomeIslandFeature extends DefaultFeature { float deltaX = Math.abs(pos.x()); float deltaY = Math.abs(pos.y()); float deltaZ = Math.abs(pos.z()); - if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) - return 0.0f; + if (deltaY < 2.0f && (deltaX < 3.0f || deltaZ < 3.0F)) return 0.0f; return (float) simplexNoise.eval(CENTER.getX() + pos.x(), CENTER.getY() + pos.y(), CENTER.getZ() + pos.z()); - }).setSource(sdfCone) - .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial().isReplaceable()); + }) + .setSource(sdfCone) + .setReplaceFunction(state -> BlocksHelper.isFluid(state) || state.getMaterial() + .isReplaceable()); return sdfCone; } - + static { ISLAND = createSDFIsland(); } diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 568424a5..0578fca0 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.bclib.util.BlocksHelper; @@ -9,24 +7,34 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BlueVineFeature extends ScatterFeature { private boolean small; public BlueVineFeature() { super(5); } - + @Override + @SuppressWarnings("deprecation") public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; + float d = MHelper.length( + center.getX() - blockPos.getX(), + center.getZ() - blockPos.getZ() + ) / radius * 0.6F + random.nextFloat() * 0.4F; small = d > 0.5F; return EndBlocks.BLUE_VINE_SEED.canSurvive(AIR, world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (small) { - BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.BLUE_VINE_SEED.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, random.nextInt(4))); + BlocksHelper.setWithoutUpdate( + world, + blockPos, + EndBlocks.BLUE_VINE_SEED.defaultBlockState().setValue(EndPlantWithAgeBlock.AGE, random.nextInt(4)) + ); } else { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.BLUE_VINE_SEED); diff --git a/src/main/java/ru/betterend/world/features/BuildingListFeature.java b/src/main/java/ru/betterend/world/features/BuildingListFeature.java new file mode 100644 index 00000000..949f7060 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/BuildingListFeature.java @@ -0,0 +1,61 @@ +package ru.betterend.world.features; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import org.jetbrains.annotations.Nullable; +import ru.bclib.world.features.ListFeature; +import ru.betterend.util.LootTableUtil; + +import java.util.List; +import java.util.Random; + +public class BuildingListFeature extends ListFeature { + public BuildingListFeature(List list, BlockState defaultBlock) { + super(list, defaultBlock); + } + + @Override + protected void addStructureData(StructurePlaceSettings data) { + super.addStructureData(data); + data.addProcessor(new ChestProcessor()); + } + + class ChestProcessor extends StructureProcessor { + @Nullable + @Override + public StructureTemplate.StructureBlockInfo processBlock(LevelReader levelReader, BlockPos blockPos, BlockPos blockPos2, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlaceSettings) { + BlockState blockState = structureBlockInfo2.state; + if (blockState.getBlock() instanceof ChestBlock) { + Random random = structurePlaceSettings.getRandom(structureBlockInfo2.pos); + BlockPos chestPos = structureBlockInfo2.pos; + ChestBlock chestBlock = ChestBlock.class.cast(blockState.getBlock()); + BlockEntity entity = chestBlock.newBlockEntity(chestPos, blockState); + levelReader.getChunk(chestPos).setBlockEntity(entity); + RandomizableContainerBlockEntity chestEntity = RandomizableContainerBlockEntity.class.cast(entity); + Biome biome = levelReader.getNoiseBiome( + chestPos.getX() >> 2, + chestPos.getY() >> 2, + chestPos.getZ() >> 2 + ); + chestEntity.setLootTable(LootTableUtil.getTable(biome), random.nextLong()); + chestEntity.setChanged(); + } + return structureBlockInfo2; + } + + @Override + protected StructureProcessorType getType() { + return StructureProcessorType.NOP; + } + } +} diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 839f6120..6af34e7d 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -1,10 +1,8 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -12,23 +10,33 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class CavePumpkinFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.above()).is(TagAPI.GEN_TERRAIN) || !world.isEmptyBlock(pos) - || !world.isEmptyBlock(pos.below())) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.above()).is(TagAPI.BLOCK_GEN_TERRAIN) || !world.isEmptyBlock(pos) || !world.isEmptyBlock( + pos.below())) { return false; } - + int age = random.nextInt(4); - BlocksHelper.setWithoutUpdate(world, pos, - EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().setValue(EndBlockProperties.AGE, age)); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.CAVE_PUMPKIN_SEED.defaultBlockState().setValue(EndBlockProperties.AGE, age) + ); if (age > 1) { - BlocksHelper.setWithoutUpdate(world, pos.below(), - EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(EndBlockProperties.SMALL, age < 3)); + BlocksHelper.setWithoutUpdate( + world, + pos.below(), + EndBlocks.CAVE_PUMPKIN.defaultBlockState().setValue(EndBlockProperties.SMALL, age < 3) + ); } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 4be8dfdd..124e07ea 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelReader; @@ -10,7 +8,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; @@ -25,12 +23,20 @@ import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; import ru.bclib.world.features.NBTStructureFeature; import ru.betterend.util.BlockFixer; +import ru.betterend.util.StructureErode; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; public class CrashedShipFeature extends NBTStructureFeature { private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; private StructureTemplate structure; + public CrashedShipFeature() { + super(EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); + } + @Override protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { if (structure == null) { @@ -41,7 +47,7 @@ public class CrashedShipFeature extends NBTStructureFeature { } return structure; } - + @Override protected boolean canSpawn(WorldGenLevel world, BlockPos pos, Random random) { long x = pos.getX() >> 4; @@ -49,80 +55,89 @@ public class CrashedShipFeature extends NBTStructureFeature { if (x * x + z * z < 3600) { return false; } - return pos.getY() > 5 && world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN); + return pos.getY() > 5 && world.getBlockState(pos.below()).is(TagAPI.BLOCK_GEN_TERRAIN); } - + @Override protected Rotation getRotation(WorldGenLevel world, BlockPos pos, Random random) { return Rotation.getRandom(random); } - + @Override protected Mirror getMirror(WorldGenLevel world, BlockPos pos, Random random) { return Mirror.values()[random.nextInt(3)]; } - + @Override protected int getYOffset(StructureTemplate structure, WorldGenLevel world, BlockPos pos, Random random) { int min = structure.getSize().getY() >> 3; int max = structure.getSize().getY() >> 2; return -MHelper.randRange(min, max, random); } - + @Override protected TerrainMerge getTerrainMerge(WorldGenLevel world, BlockPos pos, Random random) { return TerrainMerge.NONE; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BoundingBox bounds = makeBox(center); - + if (!canSpawn(world, center, random)) { return false; } - + StructureTemplate structure = getStructure(world, center, random); Rotation rotation = getRotation(world, center, random); Mirror mirror = getMirror(world, center, random); - BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + BlockPos offset = StructureTemplate.transform( + new BlockPos(structure.getSize()), + mirror, + rotation, + BlockPos.ZERO + ); center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror); center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); - + BoundingBox structB = structure.getBoundingBox(placementData, center); bounds = StructureHelper.intersectBoxes(bounds, structB); - + addStructureData(placementData); - structure.placeInWorldChunk(world, center, placementData.setBoundingBox(bounds), random); - - StructureHelper.erodeIntense(world, bounds, random); - BlockFixer.fixBlocks(world, new BlockPos(bounds.x0, bounds.y0, bounds.z0), new BlockPos(bounds.x1, bounds.y1, bounds.z1)); - + structure.placeInWorld(world, center, center, placementData.setBoundingBox(bounds), random, 2); + + StructureErode.erodeIntense(world, bounds, random); + BlockFixer.fixBlocks( + world, + new BlockPos(bounds.minX(), bounds.minY(), bounds.minZ()), + new BlockPos(bounds.maxX(), bounds.maxY(), bounds.maxZ()) + ); + return true; } - + @Override protected void addStructureData(StructurePlaceSettings data) { data.addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR).addProcessor(REPLACER).setIgnoreEntities(true); } - + static { REPLACER = new StructureProcessor() { @Override - public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, - StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, - StructurePlaceSettings structurePlacementData) { + public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, StructurePlaceSettings structurePlacementData) { BlockState state = structureBlockInfo2.state; if (state.is(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); } return structureBlockInfo2; } - + @Override protected StructureProcessorType getType() { return StructureProcessorType.NOP; diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index f98b1beb..2a8ccb5c 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -10,6 +8,8 @@ import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; +import java.util.Random; + public class DoublePlantFeature extends ScatterFeature { private final Block smallPlant; private final Block largePlant; @@ -23,11 +23,14 @@ public class DoublePlantFeature extends ScatterFeature { @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { - float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; + float d = MHelper.length( + center.getX() - blockPos.getX(), + center.getZ() - blockPos.getZ() + ) / radius * 0.6F + random.nextFloat() * 0.4F; plant = d < 0.5F ? largePlant : smallPlant; return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof BaseDoublePlantBlock) { diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 4ecbd3cf..490c3ca4 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -1,17 +1,17 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLilyFeature extends UnderwaterPlantScatter { public EndLilyFeature(int radius) { super(radius); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index dc65d14a..489fb561 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -1,17 +1,17 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusFeature extends UnderwaterPlantScatter { public EndLotusFeature(int radius) { super(radius); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index e166e2b2..eab0eb99 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -13,11 +11,13 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusLeafFeature extends ScatterFeature { public EndLotusLeafFeature(int radius) { super(radius); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (canGenerate(world, blockPos)) { @@ -39,13 +39,23 @@ public class EndLotusLeafFeature extends ScatterFeature { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); + for (Direction move : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate( + world, + p.set(pos).move(move), + leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move) + .setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE) + ); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); + BlocksHelper.setWithoutUpdate( + world, + p.set(pos).move(d1).move(d2), + leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1) + .setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP) + ); } } @@ -53,17 +63,16 @@ public class EndLotusLeafFeature extends ScatterFeature { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); - if (world.isEmptyBlock(p) && world.getBlockState(p.below()).is(Blocks.WATER)) - count ++; + if (world.isEmptyBlock(p) && world.getBlockState(p.below()).is(Blocks.WATER)) count++; } } return count == 9; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return world.isEmptyBlock(blockPos) && world.getBlockState(blockPos.below()).is(Blocks.WATER); diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index 32eee7fe..4ead10d7 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -13,19 +11,29 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class FilaluxFeature extends SkyScatterFeature { public FilaluxFeature() { super(10); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState vine = EndBlocks.FILALUX.defaultBlockState(); BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); - BlocksHelper.setWithoutUpdate(world, blockPos.above(), wings.setValue(BlockStateProperties.FACING, Direction.UP)); - for (Direction dir: BlocksHelper.HORIZONTAL) { - BlocksHelper.setWithoutUpdate(world, blockPos.relative(dir), wings.setValue(BlockStateProperties.FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + blockPos.above(), + wings.setValue(BlockStateProperties.FACING, Direction.UP) + ); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlocksHelper.setWithoutUpdate( + world, + blockPos.relative(dir), + wings.setValue(BlockStateProperties.FACING, dir) + ); } int length = MHelper.randRange(1, 3, random); for (int i = 1; i <= length; i++) { diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 9912e3be..0adf51e5 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -1,33 +1,34 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class FullHeightScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public FullHeightScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { @@ -40,13 +41,12 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, y + 5, center.getZ() + z); int down = BlocksHelper.downRay(world, POS, 16); - if (down > 10) - continue; + if (down > 10) continue; POS.setY(POS.getY() - down); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index b8a1d6f2..2bd24160 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -1,22 +1,22 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class GlowPillarFeature extends ScatterFeature { public GlowPillarFeature() { super(9); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return EndBlocks.GLOWING_PILLAR_SEED.canSurvive(AIR, world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 73d6b4ec..12c6fbdb 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -1,17 +1,17 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class HydraluxFeature extends UnderwaterPlantScatter { public HydraluxFeature(int radius) { super(radius); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index c0807972..ba38dfb4 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -1,33 +1,34 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class InvertedScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public InvertedScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { @@ -40,13 +41,12 @@ public abstract class InvertedScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() - 7, center.getZ() + z); int up = BlocksHelper.upRay(world, POS, 16); - if (up > 14) - continue; + if (up > 14) continue; POS.setY(POS.getY() + up); - + if (canGenerate(world, random, center, POS, r)) { generate(world, random, POS); } diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 5800a71f..7eb3966c 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -1,22 +1,22 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LanceleafFeature extends ScatterFeature { public LanceleafFeature() { super(7); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return EndBlocks.LANCELEAF_SEED.canSurvive(AIR, world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index d5f9c5fd..6dc0e6d3 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -1,8 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -10,18 +7,21 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; +import java.util.function.Function; + public class MengerSpongeFeature extends UnderwaterPlantScatter { private static final Function REPLACE; public MengerSpongeFeature(int radius) { super(radius); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos pos = blockPos.relative(dir); if (REPLACE.apply(world.getBlockState(pos))) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.MENGER_SPONGE_WET); diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 523e4dac..3b3164a3 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -1,19 +1,22 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.NeonCactusPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class NeonCactusFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState ground = world.getBlockState(pos.below()); if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; @@ -21,7 +24,7 @@ public class NeonCactusFeature extends DefaultFeature { NeonCactusPlantBlock cactus = ((NeonCactusPlantBlock) EndBlocks.NEON_CACTUS); cactus.growPlant(world, pos, random); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 620be106..7539ec00 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -1,43 +1,43 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class ScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; - + public ScatterFeature(int radius) { this.radius = radius; } - - public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); - + + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius); + public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); - + protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurfaceWG(world, pos); } - + protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { if (pos.getY() < 5) { return false; - } else if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { + } + else if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { return false; } return true; } - + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { int down = BlocksHelper.downRay(world, pos, 16); if (down > Math.abs(getYOffset() * 2)) { @@ -46,24 +46,26 @@ public abstract class ScatterFeature extends DefaultFeature { pos.setY(pos.getY() - down); return true; } - + protected int getYOffset() { return 5; } - + protected int getChance() { return 1; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); center = getCenterGround(world, center); - + if (!canSpawn(world, center)) { return false; } - + float r = MHelper.randRange(radius * 0.5F, radius, random); int count = MHelper.floor(r * r * MHelper.randRange(1.5F, 3F, random)); for (int i = 0; i < count; i++) { @@ -71,14 +73,19 @@ public abstract class ScatterFeature extends DefaultFeature { float theta = random.nextFloat() * MHelper.PI2; float x = pr * (float) Math.cos(theta); float z = pr * (float) Math.sin(theta); - + POS.set(center.getX() + x, center.getY() + getYOffset(), center.getZ() + z); - if (getGroundPlant(world, POS) && canGenerate(world, random, center, POS, r) - && (getChance() < 2 || random.nextInt(getChance()) == 0)) { + if (getGroundPlant(world, POS) && canGenerate( + world, + random, + center, + POS, + r + ) && (getChance() < 2 || random.nextInt(getChance()) == 0)) { generate(world, random, POS); } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index 25ca6aed..3e918d28 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -9,17 +7,19 @@ import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SilkMothNestFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); - + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { BlockState state = world.getBlockState(pos.above()); if (state.is(BlockTags.LEAVES) || state.is(BlockTags.LOGS)) { @@ -32,10 +32,12 @@ public class SilkMothNestFeature extends DefaultFeature { } return false; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); @@ -43,11 +45,19 @@ public class SilkMothNestFeature extends DefaultFeature { POS.setY(y); if (canGenerate(world, POS)) { Direction dir = BlocksHelper.randomHorizontal(random); - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() - .setValue(BlockStateProperties.HORIZONTAL_FACING, dir).setValue(BlockProperties.ACTIVE, false)); + BlocksHelper.setWithoutUpdate( + world, + POS, + EndBlocks.SILK_MOTH_NEST.defaultBlockState() + .setValue(BlockStateProperties.HORIZONTAL_FACING, dir) + .setValue(BlockProperties.ACTIVE, false) + ); POS.setY(y - 1); - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.SILK_MOTH_NEST.defaultBlockState() - .setValue(BlockStateProperties.HORIZONTAL_FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + POS, + EndBlocks.SILK_MOTH_NEST.defaultBlockState().setValue(BlockStateProperties.HORIZONTAL_FACING, dir) + ); return true; } } diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 053f33c3..452b9afe 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -11,6 +9,8 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class SingleInvertedScatterFeature extends InvertedScatterFeature { private final Block block; @@ -18,7 +18,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { super(radius); this.block = block; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { if (!world.isEmptyBlock(blockPos)) { @@ -30,7 +30,7 @@ public class SingleInvertedScatterFeature extends InvertedScatterFeature { } return state.canSurvive(world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlockState state = block.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index b663c2dc..c7379c73 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -11,6 +9,8 @@ import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import java.util.Random; + public class SinglePlantFeature extends ScatterFeature { private final Block plant; private final boolean rawHeightmap; @@ -48,7 +48,7 @@ public class SinglePlantFeature extends ScatterFeature { public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return plant.canSurvive(plant.defaultBlockState(), world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof BaseDoublePlantBlock) { diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index d14dbd3a..4f17b028 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -9,6 +7,8 @@ import net.minecraft.world.level.WorldGenLevel; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; +import java.util.Random; + public abstract class SkyScatterFeature extends ScatterFeature { public SkyScatterFeature(int radius) { super(radius); @@ -18,14 +18,14 @@ public abstract class SkyScatterFeature extends ScatterFeature { protected int getChance() { return 10; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { if (!world.isEmptyBlock(blockPos)) { return false; } - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { if (!world.isEmptyBlock(blockPos.relative(dir))) { return false; } diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index a31a36dd..bbc6fc6e 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -9,6 +7,8 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class UnderwaterPlantFeature extends UnderwaterPlantScatter { private final Block plant; @@ -21,7 +21,7 @@ public class UnderwaterPlantFeature extends UnderwaterPlantScatter { public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return super.canSpawn(world, blockPos) && plant.canSurvive(plant.defaultBlockState(), world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { if (plant instanceof BaseDoublePlantBlock) { diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index c97f15df..38106f16 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; +import java.util.Random; + public abstract class UnderwaterPlantScatter extends ScatterFeature { private static final MutableBlockPos POS = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 1d2d083f..366fbee6 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -11,6 +9,8 @@ import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; @@ -22,13 +22,13 @@ public class VineFeature extends InvertedScatterFeature { this.maxLength = maxLength; this.vine = vineBlock instanceof BaseVineBlock; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { BlockState state = world.getBlockState(blockPos); return state.getMaterial().isReplaceable() && canPlaceBlock(state, world, blockPos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { int h = BlocksHelper.downRay(world, blockPos, random.nextInt(maxLength)) - 1; diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index b218a663..00e346d1 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -12,6 +10,8 @@ import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.blocks.BaseWallPlantBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class WallPlantFeature extends WallScatterFeature { private final Block block; @@ -19,7 +19,7 @@ public class WallPlantFeature extends WallScatterFeature { super(radius); this.block = block; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { if (block instanceof BaseWallPlantBlock) { @@ -32,7 +32,7 @@ public class WallPlantFeature extends WallScatterFeature { } return block.canSurvive(block.defaultBlockState(), world, pos); } - + @Override public void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockState state = block.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index 7ca5cb1e..ddbe8993 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; @@ -9,11 +7,13 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import java.util.Random; + public class WallPlantOnLogFeature extends WallPlantFeature { public WallPlantOnLogFeature(Block block, int radius) { super(block, radius); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir) { BlockPos blockPos = pos.relative(dir.getOpposite()); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index d9dee786..ea32e39b 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -1,39 +1,42 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class WallScatterFeature extends DefaultFeature { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private final int radius; - + public WallScatterFeature(int radius) { this.radius = radius; } - + public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); - + public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { return false; } int py = MHelper.randRange(minY, maxY, random); - + MutableBlockPos mut = new MutableBlockPos(); for (int x = -radius; x <= radius; x++) { mut.setX(center.getX() + x); @@ -53,10 +56,10 @@ public abstract class WallScatterFeature extends DefaultFeature { } } } - + return true; } - + private void shuffle(Random random) { for (int i = 0; i < 4; i++) { int j = random.nextInt(4); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index d3a78ecc..6f11fef4 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -1,15 +1,12 @@ package ru.betterend.world.features.bushes; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,23 +21,28 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.function.Function; + public class BushFeature extends DefaultFeature { private static final Function REPLACE; private final Block leaves; private final Block stem; - + public BushFeature(Block leaves, Block stem) { this.leaves = leaves; this.stem = stem; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND) && !world.getBlockState(pos.above()) + .is(TagAPI.BLOCK_END_GROUND)) return false; - + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); @@ -52,14 +54,15 @@ public class BushFeature extends DefaultFeature { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere) - .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().distManhattan(pos); if (distance < 7) { return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } @@ -71,17 +74,21 @@ public class BushFeature extends DefaultFeature { BlockPos p = pos.relative(d); if (world.isEmptyBlock(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, - leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); - } else { + BlocksHelper.setWithoutUpdate( + world, + p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1) + ); + } + else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } } - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 67daa795..b87a4fa1 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -1,8 +1,5 @@ package ru.betterend.world.features.bushes; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -10,7 +7,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -25,26 +22,31 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.function.Function; + public class BushWithOuterFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; private final Block outer_leaves; private final Block leaves; private final Block stem; - + public BushWithOuterFeature(Block leaves, Block outer_leaves, Block stem) { this.outer_leaves = outer_leaves; this.leaves = leaves; this.stem = stem; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND) && !world.getBlockState(pos.above()) + .is(TagAPI.BLOCK_END_GROUND)) return false; - + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves); @@ -56,14 +58,15 @@ public class BushWithOuterFeature extends DefaultFeature { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere) - .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); sphere.addPostProcess((info) -> { if (info.getState().getBlock() instanceof LeavesBlock) { int distance = info.getPos().distManhattan(pos); if (distance < 7) { return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } @@ -73,8 +76,10 @@ public class BushWithOuterFeature extends DefaultFeature { MHelper.shuffle(DIRECTIONS, random); for (Direction dir : DIRECTIONS) { if (info.getState(dir).isAir()) { - info.setBlockPos(info.getPos().relative(dir), - outer_leaves.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); + info.setBlockPos( + info.getPos().relative(dir), + outer_leaves.defaultBlockState().setValue(BlockStateProperties.FACING, dir) + ); } } } @@ -86,17 +91,21 @@ public class BushWithOuterFeature extends DefaultFeature { BlockPos p = pos.relative(d); if (world.isEmptyBlock(p)) { if (leaves instanceof LeavesBlock) { - BlocksHelper.setWithoutUpdate(world, p, - leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); - } else { + BlocksHelper.setWithoutUpdate( + world, + p, + leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1) + ); + } + else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } } - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index a3c8018a..4752f2a7 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.bushes; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; @@ -17,13 +15,16 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LargeAmaranitaFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + MutableBlockPos mut = new MutableBlockPos().set(pos); int height = MHelper.randRange(2, 3, random); for (int i = 1; i < height; i++) { @@ -33,16 +34,22 @@ public class LargeAmaranitaFeature extends DefaultFeature { } } mut.set(pos); - + BlockState state = EndBlocks.LARGE_AMARANITA_MUSHROOM.defaultBlockState(); BlocksHelper.setWithUpdate(world, mut, state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); if (height > 2) { - BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), - state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); + BlocksHelper.setWithUpdate( + world, + mut.move(Direction.UP), + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) + ); } - BlocksHelper.setWithUpdate(world, mut.move(Direction.UP), - state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); - + BlocksHelper.setWithUpdate( + world, + mut.move(Direction.UP), + state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) + ); + return true; } } diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index ec9b0682..46f41366 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.bushes; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -17,13 +15,16 @@ import ru.betterend.blocks.EndBlockProperties.LumecornShape; import ru.betterend.blocks.LumecornBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class Lumecorn extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + int height = MHelper.randRange(4, 7, random); MutableBlockPos mut = new MutableBlockPos().set(pos); for (int i = 1; i < height; i++) { @@ -33,29 +34,42 @@ public class Lumecorn extends DefaultFeature { } } mut.set(pos); - BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, - LumecornShape.LIGHT_TOP_MIDDLE); - BlockState middle = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, - LumecornShape.LIGHT_MIDDLE); - BlockState bottom = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, - LumecornShape.LIGHT_BOTTOM); + BlockState topMiddle = EndBlocks.LUMECORN.defaultBlockState() + .setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP_MIDDLE); + BlockState middle = EndBlocks.LUMECORN.defaultBlockState() + .setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_MIDDLE); + BlockState bottom = EndBlocks.LUMECORN.defaultBlockState() + .setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_BOTTOM); BlockState top = EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.LIGHT_TOP); if (height == 4) { - BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL) + ); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), topMiddle); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), top); return true; } if (random.nextBoolean()) { - BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); - } else { - BlocksHelper.setWithoutUpdate(world, mut, - EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); - BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), - EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.MIDDLE)); + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL) + ); + } + else { + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG) + ); + BlocksHelper.setWithoutUpdate( + world, + mut.move(Direction.UP), + EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.MIDDLE) + ); height--; } BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), bottom); diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 21e7d95e..9f19222e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -1,18 +1,13 @@ package ru.betterend.world.features.bushes; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -31,30 +26,37 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class TenaneaBushFeature extends DefaultFeature { private static final Function REPLACE; private static final Direction[] DIRECTIONS = Direction.values(); - + public TenaneaBushFeature() { } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) return false; + float radius = MHelper.randRange(1.8F, 3.5F, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); BlockState leaves = EndBlocks.TENANEA_LEAVES.defaultBlockState(); SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - MHelper.randRange(-2F, 2F, random)).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> (float) noise.eval( + vec.x() * 0.2, + vec.y() * 0.2, + vec.z() * 0.2 + ) * 3).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> MHelper.randRange(-2F, 2F, random)).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere) - .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere.setReplaceFunction(REPLACE); List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { @@ -65,24 +67,27 @@ public class TenaneaBushFeature extends DefaultFeature { BlockPos d = info.getPos().below(); support.add(d); } - + MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { - info.setBlockPos(info.getPos().relative(d), - EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().setValue(FurBlock.FACING, d)); + info.setBlockPos( + info.getPos().relative(d), + EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState().setValue(FurBlock.FACING, d) + ); } } - + return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } return info.getState(); }); sphere.fillRecursive(world, pos); - BlockState stem = EndBlocks.TENANEA.bark.defaultBlockState(); + BlockState stem = EndBlocks.TENANEA.getBark().defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, stem); for (Direction d : Direction.values()) { BlockPos p = pos.relative(d); @@ -90,14 +95,14 @@ public class TenaneaBushFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, p, leaves.setValue(LeavesBlock.DISTANCE, 1)); } } - + MutableBlockPos mut = new MutableBlockPos(); - BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.BOTTOM); + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { @@ -109,7 +114,8 @@ public class TenaneaBushFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } @@ -117,10 +123,10 @@ public class TenaneaBushFeature extends DefaultFeature { } } }); - + return true; } - + static { REPLACE = (state) -> { if (state.getMaterial().equals(Material.PLANT)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java b/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java new file mode 100644 index 00000000..ef2fe51c --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java @@ -0,0 +1,85 @@ +package ru.betterend.world.features.terrain; + +import com.google.common.collect.Lists; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import ru.bclib.api.TagAPI; +import ru.bclib.sdf.SDF; +import ru.bclib.sdf.operator.SDFDisplacement; +import ru.bclib.sdf.operator.SDFRotation; +import ru.bclib.sdf.primitive.SDFTorus; +import ru.bclib.util.MHelper; +import ru.bclib.world.features.DefaultFeature; +import ru.betterend.noise.OpenSimplexNoise; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +public class ArchFeature extends DefaultFeature { + private Function surfaceFunction; + private Block block; + + public ArchFeature(Block block, Function surfaceFunction) { + this.surfaceFunction = surfaceFunction; + this.block = block; + } + + @Override + public boolean place(FeaturePlaceContext featurePlaceContext) { + final WorldGenLevel world = featurePlaceContext.level(); + BlockPos origin = featurePlaceContext.origin(); + Random random = featurePlaceContext.random(); + + BlockPos pos = getPosOnSurfaceWG( + world, + new BlockPos((origin.getX() & 0xFFFFFFF0) | 7, 0, (origin.getZ() & 0xFFFFFFF0) | 7) + ); + if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { + return false; + } + + float bigRadius = MHelper.randRange(10F, 20F, random); + float smallRadius = MHelper.randRange(3F, 7F, random); + if (smallRadius + bigRadius > 23) { + smallRadius = 23 - bigRadius; + } + SDF arch = new SDFTorus().setBigRadius(bigRadius).setSmallRadius(smallRadius).setBlock(block); + arch = new SDFRotation().setRotation(MHelper.randomHorizontal(random), (float) Math.PI * 0.5F).setSource(arch); + + final float smallRadiusF = smallRadius; + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + arch = new SDFDisplacement().setFunction((vec) -> { + return (float) (Math.abs(noise.eval(vec.x() * 0.1, + vec.y() * 0.1, + vec.z() * 0.1 + )) * 3F + Math.abs(noise.eval( + vec.x() * 0.3, + vec.y() * 0.3 + 100, + vec.z() * 0.3 + )) * 1.3F) - smallRadiusF * Math.abs(1 - vec.y() / bigRadius); + }).setSource(arch); + + List surface = Lists.newArrayList(); + arch.addPostProcess((info) -> { + if (info.getStateUp().isAir()) { + return surfaceFunction.apply(info.getPos()); + } + return info.getState(); + }); + + float side = (bigRadius + smallRadius + 3F) * 2; + if (side > 47) { + side = 47; + } + arch.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 5ccdefe2..82faf6d5 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -1,12 +1,9 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -18,32 +15,39 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BigAuroraCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); - + if (maxY - minY < 10) { return false; } - + int y = MHelper.randRange(minY, maxY, random); pos = new BlockPos(pos.getX(), y, pos.getZ()); - + int height = MHelper.randRange(5, 25, random); - SDF prism = new SDFHexPrism().setHeight(height).setRadius(MHelper.randRange(1.7F, 3F, random)) - .setBlock(EndBlocks.AURORA_CRYSTAL); + SDF prism = new SDFHexPrism().setHeight(height) + .setRadius(MHelper.randRange(1.7F, 3F, random)) + .setBlock(EndBlocks.AURORA_CRYSTAL); Vector3f vec = MHelper.randomHorizontal(random); prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); prism.setReplaceFunction((bState) -> { - return bState.getMaterial().isReplaceable() || bState.is(TagAPI.GEN_TERRAIN) - || bState.getMaterial().equals(Material.PLANT) || bState.getMaterial().equals(Material.LEAVES); + return bState.getMaterial().isReplaceable() || bState.is(TagAPI.BLOCK_GEN_TERRAIN) || bState.getMaterial() + .equals(Material.PLANT) || bState + .getMaterial() + .equals(Material.LEAVES); }); prism.fillRecursive(world, pos); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.AURORA_CRYSTAL); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index 7724bae3..8774f75c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -18,49 +16,55 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; public class DesertLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(8.0, 15.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); int dist2 = MHelper.floor(radius * 1.5); int bott = MHelper.floor(depth); blockPos = getPosOnSurfaceWG(world, blockPos); - + if (blockPos.getY() < 10) return false; - + int waterLevel = blockPos.getY(); - + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); BlockState state; - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; int maskMinX = minX - 1; int maskMinZ = minZ - 1; - + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -86,7 +90,7 @@ public class DesertLakeFeature extends DefaultFeature { } } } - + for (int x = minX; x <= maxX; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -106,23 +110,34 @@ public class DesertLakeFeature extends DefaultFeature { size *= 0.8; add = 5; } - double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; + double r = (add * 1.8 + radius * (NOISE.eval( + x * 0.2, + y * 0.2, + z * 0.2 + ) * 0.25 + 0.75)) - 1.0 / size; if (r > 0) { r *= r; if (x2 + z2 <= r) { state = world.getBlockState(POS); - if (state.is(TagAPI.GEN_TERRAIN)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } pos = POS.below(); - if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - if (y > waterLevel + 1) - BlocksHelper.setWithoutUpdate(world, pos, state); + if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { + state = EndBiome.findTopMaterial(world, pos); //world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) - BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate( + world, + pos, + random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); else - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); } } } @@ -133,9 +148,9 @@ public class DesertLakeFeature extends DefaultFeature { } } } - + double aspect = ((double) radius / (double) depth); - + for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -163,11 +178,12 @@ public class DesertLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); - while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState() + .isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); pos = pos.above(); } @@ -175,17 +191,25 @@ public class DesertLakeFeature extends DefaultFeature { // Make border else if (y2 + x2 + z2 <= rb) { state = world.getBlockState(POS); - if (state.is(TagAPI.GEN_TERRAIN) && world.isEmptyBlock(POS.above())) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) && world.isEmptyBlock(POS.above())) { BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.END_MOSS); } else if (y < waterLevel) { if (world.isEmptyBlock(POS.above())) { - state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + state = EndBiome.findTopMaterial(world, pos); //world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlocksHelper.setWithoutUpdate( + world, + POS, + random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } else { - BlocksHelper.setWithoutUpdate(world, POS, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate( + world, + POS, + EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } } @@ -194,18 +218,22 @@ public class DesertLakeFeature extends DefaultFeature { } } } - - BlockFixer.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); - + + BlockFixer.fixBlocks( + world, + new BlockPos(minX - 2, waterLevel - 2, minZ - 2), + new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2) + ); + return true; } - + private boolean canReplace(BlockState state) { - return state.getMaterial().isReplaceable() - || state.is(TagAPI.GEN_TERRAIN) - || state.is(EndBlocks.ENDSTONE_DUST) - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + return state.getMaterial() + .isReplaceable() || state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial() + .equals( + Material.PLANT) || state + .getMaterial() + .equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 55075fcb..7a9b7dba 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -18,49 +16,59 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; public class EndLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); + public EndLakeFeature(){ + + } + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); int dist2 = MHelper.floor(radius * 1.5); int bott = MHelper.floor(depth); blockPos = getPosOnSurfaceWG(world, blockPos); - + if (blockPos.getY() < 10) return false; - + int waterLevel = blockPos.getY(); - + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).above(10), 20); if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); BlockState state; - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; int maskMinX = minX - 1; int maskMinZ = minZ - 1; - + boolean[][] mask = new boolean[maxX - minX + 3][maxZ - minZ + 3]; for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -86,7 +94,7 @@ public class EndLakeFeature extends DefaultFeature { } } } - + for (int x = minX; x <= maxX; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -106,23 +114,34 @@ public class EndLakeFeature extends DefaultFeature { size *= 0.8; add = 5; } - double r = (add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75)) - 1.0 / size; + double r = (add * 1.8 + radius * (NOISE.eval( + x * 0.2, + y * 0.2, + z * 0.2 + ) * 0.25 + 0.75)) - 1.0 / size; if (r > 0) { r *= r; if (x2 + z2 <= r) { state = world.getBlockState(POS); - if (state.is(TagAPI.GEN_TERRAIN)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } pos = POS.below(); - if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { - state = world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - if (y > waterLevel + 1) - BlocksHelper.setWithoutUpdate(world, pos, state); + if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { + state = EndBiome.findTopMaterial(world, pos); + if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) - BlocksHelper.setWithoutUpdate(world, pos, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate( + world, + pos, + random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); else - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); + BlocksHelper.setWithoutUpdate( + world, + pos, + EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); } } } @@ -133,9 +152,9 @@ public class EndLakeFeature extends DefaultFeature { } } } - + double aspect = ((double) radius / (double) depth); - + for (int x = blockPos.getX() - dist; x <= blockPos.getX() + dist; x++) { POS.setX(x); int x2 = x - blockPos.getX(); @@ -163,11 +182,12 @@ public class EndLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); - while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState().isEmpty()) { + while (canReplace(state = world.getBlockState(pos)) && !state.isAir() && state.getFluidState() + .isEmpty()) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); pos = pos.above(); } @@ -175,8 +195,16 @@ public class EndLakeFeature extends DefaultFeature { // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { if (world.isEmptyBlock(POS.above())) { - state = world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState()); + state = EndBiome.findTopMaterial(world, pos); +// state = world.getBiome(POS) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); + BlocksHelper.setWithoutUpdate( + world, + POS, + random.nextBoolean() ? state : EndBlocks.ENDSTONE_DUST.defaultBlockState() + ); BlocksHelper.setWithoutUpdate(world, POS.below(), END_STONE); } else { @@ -188,18 +216,22 @@ public class EndLakeFeature extends DefaultFeature { } } } - - BlockFixer.fixBlocks(world, new BlockPos(minX - 2, waterLevel - 2, minZ - 2), new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2)); - + + BlockFixer.fixBlocks( + world, + new BlockPos(minX - 2, waterLevel - 2, minZ - 2), + new BlockPos(maxX + 2, blockPos.getY() + 20, maxZ + 2) + ); + return true; } - + private boolean canReplace(BlockState state) { - return state.getMaterial().isReplaceable() - || state.is(TagAPI.GEN_TERRAIN) - || state.is(EndBlocks.ENDSTONE_DUST) - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + return state.getMaterial() + .isReplaceable() || state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial() + .equals( + Material.PLANT) || state + .getMaterial() + .equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index f0b9e545..b5ca611e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -22,19 +19,28 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class FallenPillarFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - pos = getPosOnSurface(world, - new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + pos = getPosOnSurface( + world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16)) + ); + if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + float height = MHelper.randRange(20F, 40F, random); float radius = MHelper.randRange(2F, 4F, random); - SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F) - .setBlock(Blocks.OBSIDIAN); + SDF pillar = new SDFCappedCone().setRadius1(radius) + .setRadius2(radius) + .setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); pillar = new SDFDisplacement().setFunction((vec) -> { @@ -43,7 +49,7 @@ public class FallenPillarFeature extends DefaultFeature { Vector3f vec = MHelper.randomHorizontal(random); float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); - + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); pillar.addPostProcess((info) -> { if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { @@ -51,10 +57,10 @@ public class FallenPillarFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.is(TagAPI.GEN_TERRAIN) - || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.getMaterial() + .equals(Material.PLANT); }).fillRecursive(world, pos); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index af955ffe..632b5101 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -1,17 +1,14 @@ package ru.betterend.world.features.terrain; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.primitive.SDFSphere; @@ -19,19 +16,30 @@ import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; + +import java.util.List; +import java.util.Optional; +import java.util.Random; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); int minY = getYOnSurface(world, pos.getX(), pos.getZ()); - int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) - : MHelper.randRange(64, 192, random); + int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange( + 64, + 192, + random + ); pos = new BlockPos(pos.getX(), y, pos.getZ()); - + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); int count = MHelper.randRange(3, 5, random); - + for (int i = 0; i < count; i++) { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); @@ -40,11 +48,14 @@ public class FloatingSpireFeature extends SpireFeature { float rMin = (i * 1.3F) + 2.5F; sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F - + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval( + vec.x() * 0.1, + vec.y() * 0.1, + vec.z() * 0.1 + )) * 3F + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); @@ -53,21 +64,26 @@ public class FloatingSpireFeature extends SpireFeature { if (random.nextInt(16) == 0) { support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() - .getUnderMaterial(); + return EndBiome.findTopMaterial(world, info.getPos());//world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + else if (info.getState(Direction.UP, 3).isAir()) { + return EndBiome.findUnderMaterial(world, info.getPos()); +// return world.getBiome(info.getPos()) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getUnderMaterial(); } return info.getState(); }); sdf.fillRecursive(world, center); - + support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature() + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, bpos, null)); } }); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 61da80ad..ca9db523 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,6 +10,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -40,127 +37,139 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.util.BlockFixer; +import java.util.Optional; +import java.util.Random; +import java.util.function.Function; + public class GeyserFeature extends DefaultFeature { protected static final Function REPLACE1; protected static final Function REPLACE2; private static final Function IGNORE; private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - pos = getPosOnSurfaceWG(world, pos); - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final WorldGenLevel world = featureConfig.level(); + final BlockPos pos = getPosOnSurfaceWG(world, featureConfig.origin()); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); + if (pos.getY() < 10) { return false; } - + MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() - 1); BlockState state = world.getBlockState(bpos); - while (state.is(TagAPI.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + while (state.is(TagAPI.BLOCK_GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } - + if (pos.getY() - bpos.getY() < 25) { return false; } - + int halfHeight = MHelper.randRange(10, 20, random); float radius1 = halfHeight * 0.5F; float radius2 = halfHeight * 0.1F + 0.5F; - SDF sdf = new SDFCappedCone().setHeight(halfHeight).setRadius1(radius1).setRadius2(radius2) - .setBlock(EndBlocks.SULPHURIC_ROCK.stone); + SDF sdf = new SDFCappedCone().setHeight(halfHeight) + .setRadius1(radius1) + .setRadius2(radius2) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); sdf = new SDFTranslate().setTranslate(0, halfHeight - 3, 0).setSource(sdf); - + int count = halfHeight; for (int i = 0; i < count; i++) { int py = i << 1; float delta = (float) i / (float) (count - 1); float radius = Mth.lerp(delta, radius1, radius2) * 1.3F; - - SDF bowl = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) - .setBlock(EndBlocks.SULPHURIC_ROCK.stone); - - SDF brimstone = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius) - .setBlock(EndBlocks.BRIMSTONE); + + SDF bowl = new SDFCappedCone().setHeight(radius) + .setRadius1(0) + .setRadius2(radius) + .setBlock(EndBlocks.SULPHURIC_ROCK.stone); + + SDF brimstone = new SDFCappedCone().setHeight(radius) + .setRadius1(0) + .setRadius2(radius) + .setBlock(EndBlocks.BRIMSTONE); brimstone = new SDFTranslate().setTranslate(0, 2F, 0).setSource(brimstone); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(brimstone); bowl = new SDFUnion().setSourceA(brimstone).setSourceB(bowl); - + SDF water = new SDFCappedCone().setHeight(radius).setRadius1(0).setRadius2(radius).setBlock(Blocks.WATER); water = new SDFTranslate().setTranslate(0, 4, 0).setSource(water); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(water); bowl = new SDFUnion().setSourceA(water).setSourceB(bowl); - + final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextLong()); final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextLong()); - + bowl = new SDFCoordModify().setFunction((vec) -> { float dx = (float) noise1.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); float dz = (float) noise2.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1); vec.set(vec.x() + dx, vec.y(), vec.z() + dz); }).setSource(bowl); - + SDF cut = new SDFFlatland().setBlock(Blocks.AIR); cut = new SDFInvert().setSource(cut); cut = new SDFTranslate().setTranslate(0, radius - 2, 0).setSource(cut); bowl = new SDFSubtraction().setSourceA(bowl).setSourceB(cut); - + bowl = new SDFTranslate().setTranslate(radius, py - radius, 0).setSource(bowl); bowl = new SDFRotation().setRotation(Vector3f.YP, i * 4F).setSource(bowl); sdf = new SDFUnion().setSourceA(sdf).setSourceB(bowl); } sdf.setReplaceFunction(REPLACE2).fillRecursive(world, pos); - + radius2 = radius2 * 0.5F; if (radius2 < 0.7F) { radius2 = 0.7F; } final OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - + SDFPrimitive obj1; SDFPrimitive obj2; - + obj1 = new SDFCappedCone().setHeight(halfHeight + 5).setRadius1(radius1 * 0.5F).setRadius2(radius2); sdf = new SDFTranslate().setTranslate(0, halfHeight - 13, 0).setSource(obj1); sdf = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.3F, vec.y() * 0.3F, vec.z() * 0.3F) * 0.5F; }).setSource(sdf); - + obj2 = new SDFSphere().setRadius(radius1); SDF cave = new SDFScale3D().setScale(1.5F, 1, 1.5F).setSource(obj2); cave = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.1F, vec.y() * 0.1F, vec.z() * 0.1F) * 2F; }).setSource(cave); cave = new SDFTranslate().setTranslate(0, -halfHeight - 10, 0).setSource(cave); - + sdf = new SDFSmoothUnion().setRadius(5).setSourceA(cave).setSourceB(sdf); - + obj1.setBlock(WATER); obj2.setBlock(WATER); sdf.setReplaceFunction(REPLACE2); sdf.fillRecursive(world, pos); - + obj1.setBlock(EndBlocks.BRIMSTONE); obj2.setBlock(EndBlocks.BRIMSTONE); new SDFDisplacement().setFunction((vec) -> { return -2F; }).setSource(sdf).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - + obj1.setBlock(EndBlocks.SULPHURIC_ROCK.stone); obj2.setBlock(EndBlocks.SULPHURIC_ROCK.stone); new SDFDisplacement().setFunction((vec) -> { return -4F; }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - + obj1.setBlock(Blocks.END_STONE); obj2.setBlock(Blocks.END_STONE); new SDFDisplacement().setFunction((vec) -> { return -6F; }).setSource(cave).setReplaceFunction(REPLACE1).fillRecursiveIgnore(world, pos, IGNORE); - + BlocksHelper.setWithoutUpdate(world, pos, WATER); MutableBlockPos mut = new MutableBlockPos().set(pos); count = getYOnSurface(world, pos.getX(), pos.getZ()) - pos.getY(); @@ -171,10 +180,13 @@ public class GeyserFeature extends DefaultFeature { } mut.setY(mut.getY() + 1); } - + for (int i = 0; i < 150; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 4 + 0.5), -halfHeight - 10, - MHelper.floor(random.nextGaussian() * 4 + 0.5)); + mut.set(pos) + .move(MHelper.floor(random.nextGaussian() * 4 + 0.5), + -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 4 + 0.5) + ); float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); if (dist >= 0) { @@ -183,22 +195,25 @@ public class GeyserFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(TagAPI.GEN_TERRAIN) - && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); for (Direction dir : HORIZONTAL) { BlockPos p = mut.relative(dir); if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() - .setValue(HorizontalDirectionalBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + p, + EndBlocks.TUBE_WORM.defaultBlockState() + .setValue(HorizontalDirectionalBlock.FACING, dir) + ); } } mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, - distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState() + .setValue(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); @@ -210,10 +225,13 @@ public class GeyserFeature extends DefaultFeature { } } } - + for (int i = 0; i < 10; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), -halfHeight - 10, - MHelper.floor(random.nextGaussian() * 0.7 + 0.5)); + mut.set(pos) + .move(MHelper.floor(random.nextGaussian() * 0.7 + 0.5), + -halfHeight - 10, + MHelper.floor(random.nextGaussian() * 0.7 + 0.5) + ); float distRaw = MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ()); int dist = MHelper.floor(6 - distRaw) + random.nextInt(2); if (dist >= 0) { @@ -222,13 +240,13 @@ public class GeyserFeature extends DefaultFeature { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(TagAPI.GEN_TERRAIN)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); } - state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.ACTIVATED, - distRaw < 2); + state = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState() + .setValue(HydrothermalVentBlock.ACTIVATED, distRaw < 2); BlocksHelper.setWithoutUpdate(world, mut, state); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); @@ -240,24 +258,25 @@ public class GeyserFeature extends DefaultFeature { } } } - - EndFeatures.SULPHURIC_LAKE.getFeature().place(world, chunkGenerator, random, pos, null); - + + EndFeatures.SULPHURIC_LAKE.getFeature() + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, pos, null)); + double distance = radius1 * 1.7; BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); BlockPos end = pos.offset(distance, -halfHeight - 5 + distance, distance); BlockFixer.fixBlocks(world, start, end); - + return true; } - + static { REPLACE1 = (state) -> { - return state.isAir() || (state.is(TagAPI.GEN_TERRAIN)); + return state.isAir() || (state.is(TagAPI.BLOCK_GEN_TERRAIN)); }; - + REPLACE2 = (state) -> { - if (state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) || state.is(EndBlocks.SULPHUR_CRYSTAL)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) || state.is(EndBlocks.SULPHUR_CRYSTAL)) { return true; } if (state.getMaterial().equals(Material.PLANT)) { @@ -265,9 +284,10 @@ public class GeyserFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { - return state.is(Blocks.WATER) || state.is(Blocks.CAVE_AIR) || state.is(EndBlocks.SULPHURIC_ROCK.stone) || state.is(EndBlocks.BRIMSTONE); + return state.is(Blocks.WATER) || state.is(Blocks.CAVE_AIR) || state.is(EndBlocks.SULPHURIC_ROCK.stone) || state + .is(EndBlocks.BRIMSTONE); }; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index c76424ff..fa5b1618 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -1,15 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; @@ -20,28 +15,36 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class IceStarFeature extends DefaultFeature { private final float minSize; private final float maxSize; private final int minCount; private final int maxCount; - + public IceStarFeature(float minSize, float maxSize, int minCount, int maxCount) { this.minSize = minSize; this.maxSize = maxSize; this.minCount = minCount; this.maxCount = maxCount; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size) - .setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F) + .setRadius2(0) + .setHeight(size) + .setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); for (Vector3f point : points) { SDF rotated = spike; @@ -50,47 +53,53 @@ public class IceStarFeature extends DefaultFeature { if (angle > 0.01F && angle < 3.14F) { Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } else if (angle > 1) { + } + else if (angle > 1) { rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); } - + int x1 = (pos.getX() >> 4) << 4; int z1 = (pos.getZ() >> 4) << 4; pos = new BlockPos(x1 + random.nextInt(16), MHelper.randRange(32, 128, random), z1 + random.nextInt(16)); - + final float ancientRadius = size * 0.7F; final float denseRadius = size * 0.9F; final float iceRadius = size < 7 ? size * 5 : size * 1.3F; final float randScale = size * 0.3F; - + final BlockPos center = pos; final BlockState ice = EndBlocks.EMERALD_ICE.defaultBlockState(); final BlockState dense = EndBlocks.DENSE_EMERALD_ICE.defaultBlockState(); final BlockState ancient = EndBlocks.ANCIENT_EMERALD_ICE.defaultBlockState(); final SDF sdfCopy = sdf; - + sdf.addPostProcess((info) -> { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F - + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance( + px, + py, + pz + ) * 0.4F + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } else if (distance < denseRadius) { + } + else if (distance < denseRadius) { return dense; - } else if (distance < iceRadius) { + } + else if (distance < iceRadius) { return ice; } return info.getState(); }).fillRecursive(world, pos); - + return true; } - + private List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 840f53f1..736af16c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -1,12 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -19,31 +17,39 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class ObsidianBoulderFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - pos = getPosOnSurface(world, - new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + pos = getPosOnSurface( + world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16)) + ); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { return false; } - + int count = MHelper.randRange(1, 5, random); for (int i = 0; i < count; i++) { - BlockPos p = getPosOnSurface(world, - new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); + BlockPos p = getPosOnSurface( + world, + new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8) + ); makeBoulder(world, p, random); } - + return true; } - + private void makeBoulder(WorldGenLevel world, BlockPos pos, Random random) { - if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_END_GROUND)) { return; } - + float radius = MHelper.randRange(1F, 5F, random); SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.OBSIDIAN); float sx = MHelper.randRange(0.7F, 1.3F, random); @@ -54,7 +60,7 @@ public class ObsidianBoulderFeature extends DefaultFeature { sphere = new SDFDisplacement().setFunction((vec) -> { return (float) (noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 1.5F); }).setSource(sphere); - + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.defaultBlockState(); sphere.addPostProcess((info) -> { if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { @@ -62,8 +68,8 @@ public class ObsidianBoulderFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.is(TagAPI.GEN_TERRAIN) - || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.getMaterial() + .equals(Material.PLANT); }).fillRecursive(world, pos); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 3106db14..9411bbbf 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,17 +21,28 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class ObsidianPillarBasementFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + pos = getPosOnSurface( + world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16)) + ); + if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + float height = MHelper.randRange(10F, 35F, random); float radius = MHelper.randRange(2F, 5F, random); - SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + SDF pillar = new SDFCappedCone().setRadius1(radius) + .setRadius2(radius) + .setHeight(height * 0.5F) + .setBlock(Blocks.OBSIDIAN); pillar = new SDFTranslate().setTranslate(0, height * 0.5F - 3, 0).setSource(pillar); SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); @@ -56,9 +64,10 @@ public class ObsidianPillarBasementFeature extends DefaultFeature { } return info.getState(); }).setReplaceFunction((state) -> { - return state.getMaterial().isReplaceable() || state.is(TagAPI.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + return state.getMaterial().isReplaceable() || state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.getMaterial() + .equals(Material.PLANT); }).fillRecursive(world, pos); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 0bbb70ea..9a253f40 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -1,12 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFCoordModify; @@ -16,37 +14,41 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; + public class OreLayerFeature extends DefaultFeature { private static final SDFSphere SPHERE; private static final SDFCoordModify NOISE; private static final SDF FUNCTION; - + private final BlockState state; private final float radius; private final int minY; private final int maxY; private OpenSimplexNoise noise; - + public OreLayerFeature(BlockState state, float radius, int minY, int maxY) { this.state = state; this.radius = radius; this.minY = minY; this.maxY = maxY; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); int posZ = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getZ(); int posY = MHelper.randRange(minY, maxY, random); - + if (noise == null) { noise = new OpenSimplexNoise(world.getSeed()); } - + SPHERE.setRadius(radius).setBlock(state); NOISE.setFunction((vec) -> { double x = (vec.x() + pos.getX()) * 0.1; @@ -57,18 +59,18 @@ public class OreLayerFeature extends DefaultFeature { FUNCTION.fillRecursive(world, new BlockPos(posX, posY, posZ)); return true; } - + static { SPHERE = new SDFSphere(); NOISE = new SDFCoordModify(); - + SDF body = SPHERE; body = new SDFScale3D().setScale(1, 0.2F, 1).setSource(body); body = NOISE.setSource(body); body.setReplaceFunction((state) -> { return state.is(Blocks.END_STONE); }); - + FUNCTION = body; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 8fceba8d..416680fe 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -1,38 +1,41 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public class SingleBlockFeature extends DefaultFeature { private final Block block; - + public SingleBlockFeature(Block block) { this.block = block; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + BlockState state = block.defaultBlockState(); if (block.getStateDefinition().getProperty("waterlogged") != null) { boolean waterlogged = !world.getFluidState(pos).isEmpty(); state = state.setValue(BlockStateProperties.WATERLOGGED, waterlogged); } BlocksHelper.setWithoutUpdate(world, pos, state); - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 447138b1..4ec06f76 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -15,41 +13,50 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SmaragdantCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); BlockState crystal = EndBlocks.SMARAGDANT_CRYSTAL.defaultBlockState(); BlockState shard = EndBlocks.SMARAGDANT_CRYSTAL_SHARD.defaultBlockState(); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, - MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(1.5F - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) - + random.nextInt(3); + mut.set(pos) + .move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(1.5F - MHelper.length( + mut.getX() - pos.getX(), + mut.getZ() - pos.getZ() + )) + random.nextInt(3); if (dist > 0) { BlockState state = world.getBlockState(mut); for (int n = 0; n < 10 && state.isAir(); n++) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(TagAPI.GEN_TERRAIN) && !world.getBlockState(mut.above()).is(crystal.getBlock())) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) && !world.getBlockState(mut.above()).is(crystal.getBlock())) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, crystal); mut.setY(mut.getY() + 1); } boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlocksHelper.setWithoutUpdate(world, mut, - shard.setValue(BlockStateProperties.WATERLOGGED, waterlogged)); + BlocksHelper.setWithoutUpdate( + world, + mut, + shard.setValue(BlockStateProperties.WATERLOGGED, waterlogged) + ); } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index bf14a674..04440416 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -1,11 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -13,10 +8,11 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.operator.SDFSmoothUnion; @@ -27,19 +23,29 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; + +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.function.Function; public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); pos = getPosOnSurfaceWG(world, pos); - if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN) - || !world.getBlockState(pos.below(6)).is(TagAPI.GEN_TERRAIN)) { + if (pos.getY() < 10 || !world.getBlockState(pos.below(3)) + .is(TagAPI.BLOCK_GEN_TERRAIN) || !world.getBlockState(pos.below(6)) + .is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); int count = MHelper.randRange(3, 7, random); for (int i = 0; i < count; i++) { @@ -48,8 +54,11 @@ public class SpireFeature extends DefaultFeature { } OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); sdf = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval(vec.x() * 0.1, vec.y() * 0.1, vec.z() * 0.1)) * 3F - + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); + return (float) (Math.abs(noise.eval( + vec.x() * 0.1, + vec.y() * 0.1, + vec.z() * 0.1 + )) * 3F + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F); }).setSource(sdf); final BlockPos center = pos; List support = Lists.newArrayList(); @@ -58,33 +67,39 @@ public class SpireFeature extends DefaultFeature { if (random.nextInt(16) == 0) { support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() - .getUnderMaterial(); + return EndBiome.findTopMaterial(world, info.getPos()); + //return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + } + else if (info.getState(Direction.UP, 3).isAir()) { + return EndBiome.findUnderMaterial(world, info.getPos()); +// return world.getBiome(info.getPos()) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getUnderMaterial(); } return info.getState(); }).fillRecursive(world, center); - + support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature() + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, bpos, null)); } }); - + return true; } - + protected SDF addSegment(SDF sdf, float radius, Random random) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.END_STONE); SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0) - .setSource(sdf); + .setSource(sdf); return new SDFSmoothUnion().setRadius(radius * 0.5F).setSourceA(sphere).setSourceB(offseted); } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; } if (state.getBlock() instanceof LeavesBlock) { diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 06e5bcfb..3065a834 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; @@ -9,65 +7,72 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.StalactiteBlock; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public class StalactiteFeature extends DefaultFeature { private final boolean ceiling; private final Block[] ground; private final Block block; - + public StalactiteFeature(boolean ceiling, Block block, Block... ground) { this.ceiling = ceiling; this.ground = ground; this.block = block; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { return false; } - + MutableBlockPos mut = new MutableBlockPos().set(pos); int height = random.nextInt(16); int dir = ceiling ? -1 : 1; boolean stalagnate = false; - + for (int i = 1; i <= height; i++) { mut.setY(pos.getY() + i * dir); BlockState state = world.getBlockState(mut); if (!state.getMaterial().isReplaceable()) { - stalagnate = state.is(TagAPI.GEN_TERRAIN); + stalagnate = state.is(TagAPI.BLOCK_GEN_TERRAIN); height = i; break; } } - + if (!stalagnate && height > 7) { height = random.nextInt(8); } - + float center = height * 0.5F; for (int i = 0; i < height; i++) { mut.setY(pos.getY() + i * dir); int size = stalagnate ? Mth.clamp((int) (Mth.abs(i - center) + 1), 1, 7) : height - i - 1; boolean waterlogged = !world.getFluidState(mut).isEmpty(); - BlockState base = block.defaultBlockState().setValue(StalactiteBlock.SIZE, size) - .setValue(BlockStateProperties.WATERLOGGED, waterlogged); - BlockState state = stalagnate ? base.setValue(StalactiteBlock.IS_FLOOR, dir > 0 ? i < center : i > center) - : base.setValue(StalactiteBlock.IS_FLOOR, dir > 0); + BlockState base = block.defaultBlockState() + .setValue(StalactiteBlock.SIZE, size) + .setValue(BlockStateProperties.WATERLOGGED, waterlogged); + BlockState state = stalagnate ? base.setValue( + StalactiteBlock.IS_FLOOR, + dir > 0 ? i < center : i > center + ) : base.setValue(StalactiteBlock.IS_FLOOR, dir > 0); BlocksHelper.setWithoutUpdate(world, mut, state); } - + return true; } - + private boolean isGround(Block block) { for (Block b : ground) { if (b == block) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index eefaf3e7..6f331805 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -1,14 +1,12 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -17,15 +15,19 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SulphurHillFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; } - + int count = MHelper.randRange(5, 13, random); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); for (int i = 0; i < count; i++) { @@ -39,7 +41,7 @@ public class SulphurHillFeature extends DefaultFeature { } return true; } - + private void makeCircle(WorldGenLevel world, BlockPos pos, OpenSimplexNoise noise, Random random) { int radius = MHelper.randRange(5, 9, random); int min = -radius - 3; @@ -77,7 +79,8 @@ public class SulphurHillFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, rock); mut.move(Direction.DOWN); } - } else if (d < r1 * r1) { + } + else if (d < r1 * r1) { BlocksHelper.setWithoutUpdate(world, mut, brimstone); mut.move(Direction.DOWN); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index a314095b..00398093 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,8 +8,8 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -26,24 +22,29 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import java.util.Random; +import java.util.Set; + public class SulphuricCaveFeature extends DefaultFeature { private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int radius = MHelper.randRange(10, 30, random); - + int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); - + BlockState state = world.getBlockState(bpos); - while (!state.is(TagAPI.GEN_TERRAIN) && bpos.getY() > 5) { + while (!state.is(TagAPI.BLOCK_GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -51,32 +52,32 @@ public class SulphuricCaveFeature extends DefaultFeature { return false; } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - - while (state.is(TagAPI.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + + while (state.is(TagAPI.BLOCK_GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } int bottom = (int) (bpos.getY() + radius * 1.3F + 5); - + if (top <= bottom) { return false; } - + MutableBlockPos mut = new MutableBlockPos(); pos = new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); - + OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, pos.getX(), pos.getZ())); - + int x1 = pos.getX() - radius - 5; int z1 = pos.getZ() - radius - 5; int x2 = pos.getX() + radius + 5; int z2 = pos.getZ() + radius + 5; int y1 = MHelper.floor(pos.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(pos.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - + Set brimstone = Sets.newHashSet(); BlockState rock = EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState(); int waterLevel = pos.getY() + MHelper.randRange(MHelper.floor(radius * 0.8), radius, random); @@ -101,14 +102,19 @@ public class SulphuricCaveFeature extends DefaultFeature { if (isReplaceable(state)) { BlocksHelper.setWithoutUpdate(world, mut, y < waterLevel ? WATER : CAVE_AIR); } - } else if (dist < r2 * r2) { + } + else if (dist < r2 * r2) { state = world.getBlockState(mut); - if (state.is(TagAPI.GEN_TERRAIN) || state.is(Blocks.AIR)) { - double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) - + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(Blocks.AIR)) { + double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval( + x * 0.03, + y * 0.03, + z * 0.03 + ) * 0.5; if (v > 0.4) { brimstone.add(mut.immutable()); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, mut, rock); } } @@ -119,30 +125,39 @@ public class SulphuricCaveFeature extends DefaultFeature { brimstone.forEach((blockPos) -> { placeBrimstone(world, blockPos, random); }); - + if (random.nextInt(4) == 0) { int count = MHelper.randRange(5, 20, random); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 0, - MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(3 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) - + random.nextInt(2); + mut.set(pos) + .move(MHelper.floor(random.nextGaussian() * 2 + 0.5), + 0, + MHelper.floor(random.nextGaussian() * 2 + 0.5) + ); + int dist = MHelper.floor(3 - MHelper.length( + mut.getX() - pos.getX(), + mut.getZ() - pos.getZ() + )) + random.nextInt(2); if (dist > 0) { state = world.getBlockState(mut); while (!state.getFluidState().isEmpty() || state.getMaterial().equals(Material.WATER_PLANT)) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(TagAPI.GEN_TERRAIN) - && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) && !world.getBlockState(mut.above()) + .is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); MHelper.shuffle(HORIZONTAL, random); for (Direction dir : HORIZONTAL) { BlockPos p = mut.relative(dir); if (random.nextBoolean() && world.getBlockState(p).is(Blocks.WATER)) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TUBE_WORM.defaultBlockState() - .setValue(HorizontalDirectionalBlock.FACING, dir)); + BlocksHelper.setWithoutUpdate( + world, + p, + EndBlocks.TUBE_WORM.defaultBlockState() + .setValue(HorizontalDirectionalBlock.FACING, dir) + ); } } mut.setY(mut.getY() + 1); @@ -152,8 +167,7 @@ public class SulphuricCaveFeature extends DefaultFeature { state = world.getBlockState(mut); while (state.is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); - world.getBlockTicks().scheduleTick(mut, EndBlocks.VENT_BUBBLE_COLUMN, - MHelper.randRange(8, 32, random)); + world.scheduleTick(mut.immutable(), EndBlocks.VENT_BUBBLE_COLUMN, MHelper.randRange(8, 32, random)); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); } @@ -161,19 +175,20 @@ public class SulphuricCaveFeature extends DefaultFeature { } } } - + BlockFixer.fixBlocks(world, new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2)); - + return true; } - + private boolean isReplaceable(BlockState state) { - return state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) - || state.is(EndBlocks.VENT_BUBBLE_COLUMN) || state.is(EndBlocks.SULPHUR_CRYSTAL) - || state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) || state.getMaterial().equals(Material.LEAVES); + return state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.is(EndBlocks.HYDROTHERMAL_VENT) || state.is(EndBlocks.VENT_BUBBLE_COLUMN) || state + .is(EndBlocks.SULPHUR_CRYSTAL) || state.getMaterial().isReplaceable() || state.getMaterial() + .equals(Material.PLANT) || state + .getMaterial() + .equals(Material.WATER_PLANT) || state.getMaterial().equals(Material.LEAVES); } - + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); @@ -181,7 +196,7 @@ public class SulphuricCaveFeature extends DefaultFeature { makeShards(world, pos, random); } } - + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { @@ -190,14 +205,15 @@ public class SulphuricCaveFeature extends DefaultFeature { } return EndBlocks.BRIMSTONE.defaultBlockState(); } - + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) - .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); + .setValue(SulphurCrystalBlock.WATERLOGGED, true) + .setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 07d49e00..0962cc36 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -1,17 +1,13 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; 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.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Fluids; import ru.bclib.api.TagAPI; @@ -23,27 +19,32 @@ import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; +import java.util.Set; + public class SulphuricLakeFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); blockPos = getPosOnSurfaceWG(world, blockPos); - + if (blockPos.getY() < 57) { return false; } - + double radius = MHelper.randRange(10.0, 20.0, random); int dist2 = MHelper.floor(radius * 1.5); - + int minX = blockPos.getX() - dist2; int maxX = blockPos.getX() + dist2; int minZ = blockPos.getZ() - dist2; int maxZ = blockPos.getZ() + dist2; - + Set brimstone = Sets.newHashSet(); for (int x = minX; x <= maxX; x++) { POS.setX(x); @@ -60,7 +61,7 @@ public class SulphuricLakeFeature extends DefaultFeature { int dist = x2 + z2; if (dist <= r) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(POS).is(TagAPI.BLOCK_GEN_TERRAIN)) { if (isBorder(world, POS)) { if (random.nextInt(8) > 0) { brimstone.add(POS.immutable()); @@ -70,10 +71,11 @@ public class SulphuricLakeFeature extends DefaultFeature { brimstone.add(POS.below(2)); } } - } else { + } + else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); - world.getLiquidTicks().scheduleTick(POS, Fluids.WATER, 0); + world.scheduleTick(POS, Fluids.WATER, 0); brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.below(2)); @@ -81,19 +83,21 @@ public class SulphuricLakeFeature extends DefaultFeature { brimstone.add(POS.below(3)); } } - } else { + } + else { brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); } } } - } else { + } + else { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); brimstone.remove(POS); for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos offseted = POS.relative(dir); - if (world.getBlockState(offseted).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(offseted).is(TagAPI.BLOCK_GEN_TERRAIN)) { brimstone.add(offseted); } } @@ -102,7 +106,7 @@ public class SulphuricLakeFeature extends DefaultFeature { brimstone.remove(POS); for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos offseted = POS.relative(dir); - if (world.getBlockState(offseted).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(offseted).is(TagAPI.BLOCK_GEN_TERRAIN)) { brimstone.add(offseted); } } @@ -116,9 +120,10 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } - } else if (dist < r2) { + } + else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); - if (world.getBlockState(POS).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(POS).is(TagAPI.BLOCK_GEN_TERRAIN)) { brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); @@ -130,14 +135,14 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } - + brimstone.forEach((bpos) -> { placeBrimstone(world, bpos, random); }); - + return true; } - + private boolean isBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { @@ -147,7 +152,7 @@ public class SulphuricLakeFeature extends DefaultFeature { } return false; } - + private boolean isAbsoluteBorder(WorldGenLevel world, BlockPos pos) { int y = pos.getY() - 2; for (Direction dir : BlocksHelper.DIRECTIONS) { @@ -157,19 +162,21 @@ public class SulphuricLakeFeature extends DefaultFeature { } return false; } - + private boolean isDeepWater(WorldGenLevel world, BlockPos pos) { int y = pos.getY() + 1; for (Direction dir : BlocksHelper.DIRECTIONS) { - if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y - || getYOnSurface(world, pos.getX() + dir.getStepX() * 2, pos.getZ() + dir.getStepZ() * 2) < y - || getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { + if (getYOnSurface(world, pos.getX() + dir.getStepX(), pos.getZ() + dir.getStepZ()) < y || getYOnSurface( + world, + pos.getX() + dir.getStepX() * 2, + pos.getZ() + dir.getStepZ() * 2 + ) < y || getYOnSurface(world, pos.getX() + dir.getStepX() * 3, pos.getZ() + dir.getStepZ() * 3) < y) { return false; } } return true; } - + private void placeBrimstone(WorldGenLevel world, BlockPos pos, Random random) { BlockState state = getBrimstone(world, pos); BlocksHelper.setWithoutUpdate(world, pos, state); @@ -177,7 +184,7 @@ public class SulphuricLakeFeature extends DefaultFeature { makeShards(world, pos, random); } } - + private BlockState getBrimstone(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getBlockState(pos.relative(dir)).is(Blocks.WATER)) { @@ -186,14 +193,15 @@ public class SulphuricLakeFeature extends DefaultFeature { } return EndBlocks.BRIMSTONE.defaultBlockState(); } - + private void makeShards(WorldGenLevel world, BlockPos pos, Random random) { for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos side; if (random.nextInt(16) == 0 && world.getBlockState((side = pos.relative(dir))).is(Blocks.WATER)) { BlockState state = EndBlocks.SULPHUR_CRYSTAL.defaultBlockState() - .setValue(SulphurCrystalBlock.WATERLOGGED, true).setValue(SulphurCrystalBlock.FACING, dir) - .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); + .setValue(SulphurCrystalBlock.WATERLOGGED, true) + .setValue(SulphurCrystalBlock.FACING, dir) + .setValue(SulphurCrystalBlock.AGE, random.nextInt(3)); BlocksHelper.setWithoutUpdate(world, side, state); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 61bdc174..a7b8133f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -1,12 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -15,30 +13,40 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - pos = getPosOnSurface(world, - new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (!world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN)) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + pos = getPosOnSurface( + world, + new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16)) + ); + if (!world.getBlockState(pos.below(3)).is(TagAPI.BLOCK_GEN_TERRAIN)) { return false; } - + MutableBlockPos mut = new MutableBlockPos(); int count = MHelper.randRange(15, 30, random); - BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState().setValue(HydrothermalVentBlock.WATERLOGGED, false); + BlockState vent = EndBlocks.HYDROTHERMAL_VENT.defaultBlockState() + .setValue(HydrothermalVentBlock.WATERLOGGED, false); for (int i = 0; i < count; i++) { - mut.set(pos).move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, MHelper.floor(random.nextGaussian() * 2 + 0.5)); - int dist = MHelper.floor(2 - MHelper.length(mut.getX() - pos.getX(), mut.getZ() - pos.getZ())) + random.nextInt(2); + mut.set(pos) + .move(MHelper.floor(random.nextGaussian() * 2 + 0.5), 5, MHelper.floor(random.nextGaussian() * 2 + 0.5)); + int dist = MHelper.floor(2 - MHelper.length( + mut.getX() - pos.getX(), + mut.getZ() - pos.getZ() + )) + random.nextInt(2); if (dist > 0) { BlockState state = world.getBlockState(mut); for (int n = 0; n < 10 && state.isAir(); n++) { mut.setY(mut.getY() - 1); state = world.getBlockState(mut); } - if (state.is(TagAPI.GEN_TERRAIN) - && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) && !world.getBlockState(mut.above()).is(EndBlocks.HYDROTHERMAL_VENT)) { for (int j = 0; j <= dist; j++) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.SULPHURIC_ROCK.stone); mut.setY(mut.getY() + 1); @@ -47,7 +55,7 @@ public class SurfaceVentFeature extends DefaultFeature { } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java b/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java new file mode 100644 index 00000000..95bb6edb --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java @@ -0,0 +1,77 @@ +package ru.betterend.world.features.terrain; + +import com.mojang.math.Vector3f; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import ru.bclib.api.TagAPI; +import ru.bclib.sdf.SDF; +import ru.bclib.sdf.operator.SDFCoordModify; +import ru.bclib.sdf.operator.SDFDisplacement; +import ru.bclib.sdf.operator.SDFRotation; +import ru.bclib.sdf.operator.SDFUnion; +import ru.bclib.sdf.primitive.SDFTorus; +import ru.bclib.util.MHelper; +import ru.bclib.world.features.DefaultFeature; +import ru.betterend.noise.OpenSimplexNoise; + +import java.util.Random; + +public class ThinArchFeature extends DefaultFeature { + private Block block; + + public ThinArchFeature(Block block) { + this.block = block; + } + + @Override + public boolean place(FeaturePlaceContext featurePlaceContext) { + final WorldGenLevel world = featurePlaceContext.level(); + BlockPos origin = featurePlaceContext.origin(); + Random random = featurePlaceContext.random(); + + BlockPos pos = getPosOnSurfaceWG(world, new BlockPos((origin.getX() & 0xFFFFFFF0) | 7, 0, (origin.getZ() & 0xFFFFFFF0) | 7)); + if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { + return false; + } + + SDF sdf = null; + float bigRadius = MHelper.randRange(15F, 20F, random); + float variation = bigRadius * 0.3F; + int count = MHelper.randRange(2, 4, random); + + for (int i = 0; i < count; i++) { + float smallRadius = MHelper.randRange(0.6F, 1.3F, random); + SDF arch = new SDFTorus().setBigRadius(bigRadius - random.nextFloat() * variation).setSmallRadius(smallRadius).setBlock(block); + float angle = (i - count * 0.5F) * 0.3F + random.nextFloat() * 0.05F + (float) Math.PI * 0.5F; + arch = new SDFRotation().setRotation(Vector3f.XP, angle).setSource(arch); + sdf = sdf == null ? arch : new SDFUnion().setSourceA(sdf).setSourceB(arch); + } + + sdf = new SDFRotation().setRotation(MHelper.randomHorizontal(random), random.nextFloat() * MHelper.PI2).setSource(sdf); + + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sdf = new SDFCoordModify().setFunction(vec -> { + float dx = (float) noise.eval(vec.y() * 0.02, vec.z() * 0.02); + float dy = (float) noise.eval(vec.x() * 0.02, vec.z() * 0.02); + float dz = (float) noise.eval(vec.x() * 0.02, vec.y() * 0.02); + vec.add(dx * 10, dy * 10, dz * 10); + }).setSource(sdf); + sdf = new SDFDisplacement().setFunction(vec -> { + float offset = vec.y() / bigRadius - 0.5F; + return Mth.clamp(offset * 3, -10F, 0F); + }).setSource(sdf); + + float side = (bigRadius + 2.5F) * 2; + if (side > 47) { + side = 47; + } + sdf.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 00d5f28a..e092dec8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -1,19 +1,14 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Random; -import java.util.Set; -import java.util.function.Supplier; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; 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.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; 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 ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -21,15 +16,23 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.function.Supplier; + public class CaveChunkPopulatorFeature extends DefaultFeature { private Supplier supplier; - + public CaveChunkPopulatorFeature(Supplier biome) { this.supplier = biome; } - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); int sx = (pos.getX() >> 4) << 4; @@ -38,15 +41,14 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { MutableBlockPos max = new MutableBlockPos().set(pos); fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); EndCaveBiome biome = supplier.get(); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlockState surfaceBlock = Blocks.END_STONE.defaultBlockState(); //biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); BlockFixer.fixBlocks(world, min, max); return true; } - - protected void fillSets(int sx, int sz, ChunkAccess chunk, Set floorPositions, - Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { + + protected void fillSets(int sx, int sz, ChunkAccess chunk, Set floorPositions, Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { MutableBlockPos mut = new MutableBlockPos(); MutableBlockPos mut2 = new MutableBlockPos(); MutableBlockPos mut3 = new MutableBlockPos(); @@ -61,13 +63,13 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { mut.setY(y); BlockState top = chunk.getBlockState(mut); BlockState bottom = chunk.getBlockState(mut2); - if (top.isAir() && (bottom.is(TagAPI.GEN_TERRAIN) || bottom.is(Blocks.STONE))) { + if (top.isAir() && (bottom.is(TagAPI.BLOCK_GEN_TERRAIN) || bottom.is(Blocks.STONE))) { mut3.set(mut2).move(sx, 0, sz); floorPositions.add(mut3.immutable()); updateMin(mut3, min); updateMax(mut3, max); } - else if (bottom.isAir() && (top.is(TagAPI.GEN_TERRAIN) || top.is(Blocks.STONE))) { + else if (bottom.isAir() && (top.is(TagAPI.BLOCK_GEN_TERRAIN) || top.is(Blocks.STONE))) { mut3.set(mut).move(sx, 0, sz); ceilPositions.add(mut3.immutable()); updateMin(mut3, min); @@ -78,7 +80,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } } } - + private void updateMin(BlockPos pos, MutableBlockPos min) { if (pos.getX() < min.getX()) { min.setX(pos.getX()); @@ -90,7 +92,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { min.setZ(pos.getZ()); } } - + private void updateMax(BlockPos pos, MutableBlockPos max) { if (pos.getX() > max.getX()) { max.setX(pos.getX()); @@ -102,21 +104,20 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { max.setZ(pos.getZ()); } } - - protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, - BlockState surfaceBlock) { + + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); } - + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { @@ -127,7 +128,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 964fa6b3..c0f202cf 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -1,12 +1,7 @@ package ru.betterend.world.features.terrain.caves; -import java.util.List; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -15,78 +10,85 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; 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 ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.features.DefaultFeature; -import ru.betterend.interfaces.IBiomeArray; import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; + public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); protected static final BlockState WATER = Blocks.WATER.defaultBlockState(); private static final Vec3i[] SPHERE; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } - + if (biomeMissingCaves(world, pos)) { return false; } - + int radius = MHelper.randRange(10, 30, random); BlockPos center = findPos(world, pos, radius, random); - + if (center == null) { return false; } - + EndCaveBiome biome = EndBiomes.getCaveBiome(pos.getX(), pos.getZ()); Set caveBlocks = generate(world, center, radius, random); if (!caveBlocks.isEmpty()) { if (biome != null) { setBiomes(world, biome, caveBlocks); - Set floorPositions = Sets.newHashSet(); - Set ceilPositions = Sets.newHashSet(); - MutableBlockPos mut = new MutableBlockPos(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - floorPositions.add(mut.immutable()); + Set floorPositions = Sets.newConcurrentHashSet(); + Set ceilPositions = Sets.newConcurrentHashSet(); + caveBlocks.parallelStream().forEach((bpos) -> { + if (world.getBlockState(bpos).getMaterial().isReplaceable()) { + BlockPos side = bpos.below(); + if (world.getBlockState(side).is(TagAPI.BLOCK_GEN_TERRAIN)) { + floorPositions.add(side); } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - ceilPositions.add(mut.immutable()); + side = bpos.above(); + if (world.getBlockState(side).is(TagAPI.BLOCK_GEN_TERRAIN)) { + ceilPositions.add(side); } } }); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + + BlockState surfaceBlock = EndBiome.findTopMaterial(biome); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); placeWalls(world, biome, caveBlocks, random); } fixBlocks(world, caveBlocks); } - + return true; } - + protected abstract Set generate(WorldGenLevel world, BlockPos center, int radius, Random random); - + protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { @@ -96,12 +98,12 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); } - + protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity(); ceilPositions.forEach((pos) -> { @@ -112,7 +114,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); @@ -124,9 +126,9 @@ public abstract class EndCaveFeature extends DefaultFeature { if (random.nextInt(4) == 0 && hasOpenSide(pos, positions)) { BlockState wallBlock = biome.getWall(pos); if (wallBlock != null) { - for (Vec3i offset: SPHERE) { + for (Vec3i offset : SPHERE) { BlockPos wallPos = pos.offset(offset); - if (!positions.contains(wallPos) && !placed.contains(wallPos) && world.getBlockState(wallPos).is(TagAPI.GEN_TERRAIN)) { + if (!positions.contains(wallPos) && !placed.contains(wallPos) && world.getBlockState(wallPos).is(TagAPI.BLOCK_GEN_TERRAIN)) { wallBlock = biome.getWall(wallPos); BlocksHelper.setWithoutUpdate(world, wallPos, wallBlock); placed.add(wallPos); @@ -138,35 +140,31 @@ public abstract class EndCaveFeature extends DefaultFeature { } private boolean hasOpenSide(BlockPos pos, Set positions) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (!positions.contains(pos.relative(dir))) { return true; } } return false; } - + protected void setBiomes(WorldGenLevel world, EndCaveBiome biome, Set blocks) { blocks.forEach((pos) -> setBiome(world, pos, biome)); } protected void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { - IBiomeArray array = (IBiomeArray) world.getChunk(pos).getBiomes(); - if (array != null) { - Biome bio = BiomeAPI.getActualBiome(biome); - array.be_setBiome(bio, pos); - } + BiomeAPI.setBiome(world, pos, biome.getActualBiome()); } - + private BlockPos findPos(WorldGenLevel world, BlockPos pos, int radius, Random random) { int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); MutableBlockPos bpos = new MutableBlockPos(); bpos.setX(pos.getX()); bpos.setZ(pos.getZ()); bpos.setY(top - 1); - + BlockState state = world.getBlockState(bpos); - while (!state.is(TagAPI.GEN_TERRAIN) && bpos.getY() > 5) { + while (!state.is(TagAPI.BLOCK_GEN_TERRAIN) && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } @@ -174,20 +172,20 @@ public abstract class EndCaveFeature extends DefaultFeature { return null; } top = (int) (bpos.getY() - (radius * 1.3F + 5)); - - while (state.is(TagAPI.GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { + + while (state.is(TagAPI.BLOCK_GEN_TERRAIN) || !state.getFluidState().isEmpty() && bpos.getY() > 5) { bpos.setY(bpos.getY() - 1); state = world.getBlockState(bpos); } int bottom = (int) (bpos.getY() + radius * 1.3F + 5); - + if (top <= bottom) { return null; } - + return new BlockPos(pos.getX(), MHelper.randRange(bottom, top, random), pos.getZ()); } - + protected void fixBlocks(WorldGenLevel world, Set caveBlocks) { BlockPos pos = caveBlocks.iterator().next(); MutableBlockPos start = new MutableBlockPos().set(pos); @@ -199,14 +197,14 @@ public abstract class EndCaveFeature extends DefaultFeature { if (bpos.getX() > end.getX()) { end.setX(bpos.getX()); } - + if (bpos.getY() < start.getY()) { start.setY(bpos.getY()); } if (bpos.getY() > end.getY()) { end.setY(bpos.getY()); } - + if (bpos.getZ() < start.getZ()) { start.setZ(bpos.getZ()); } @@ -216,7 +214,7 @@ public abstract class EndCaveFeature extends DefaultFeature { }); BlockFixer.fixBlocks(world, start.offset(-2, -2, -2), end.offset(2, 2, 2)); } - + protected boolean isWaterNear(WorldGenLevel world, BlockPos pos) { for (Direction dir : BlocksHelper.DIRECTIONS) { if (!world.getFluidState(pos.relative(dir, 5)).isEmpty()) { @@ -232,7 +230,7 @@ public abstract class EndCaveFeature extends DefaultFeature { Biome biome = world.getBiome(pos.offset(x << 4, 0, z << 4)); BCLBiome endBiome = BiomeAPI.getFromBiome(biome); boolean hasCaves = endBiome.getCustomData("has_caves", true); - if (!hasCaves && EndBiomes.LAND_BIOMES.containsImmutable(endBiome.getID())) { + if (!hasCaves && BiomeAPI.END_LAND_BIOME_PICKER.containsImmutable(endBiome.getID())) { return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java index 58364bd6..07afd22d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -15,6 +11,10 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + public class RoundCaveFeature extends EndCaveFeature { @Override protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { @@ -30,55 +30,53 @@ public class RoundCaveFeature extends EndCaveFeature { double hr = radius * 0.75; double nr = radius * 0.25; - BlockState state; - MutableBlockPos bpos = new MutableBlockPos(); - Set blocks = Sets.newHashSet(); - for (int x = x1; x <= x2; x++) { - int xsq = x - center.getX(); - xsq *= xsq; + int dx = x2 - x1 + 1; + int dz = z2 - z1 + 1; + int count = dx * dz; + Set blocks = Sets.newConcurrentHashSet(); + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos bpos = new MutableBlockPos(); + int x = (index % dx) + x1; + int z = (index / dx) + z1; bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - center.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - center.getY(); - ysq *= 1.6; - ysq *= ysq; + bpos.setZ(z); + int xsq = MHelper.sqr(x - center.getX()); + int zsq = MHelper.sqr(z - center.getZ()); + int dxz = xsq + zsq; + BlockState state; + for (int y = y1; y <= y2; y++) { + int ysq = (int) MHelper.sqr((y - center.getY()) * 1.6); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + double dist = dxz + ysq; + if (dist < r * r) { bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - state = world.getBlockState(bpos); - if (isReplaceable(state) && !isWaterNear(world, bpos)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - blocks.add(bpos.immutable()); - - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() + 1); - state = world.getBlockState(bpos); - } - - bpos.setY(y - 1); - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } + state = world.getBlockState(bpos); + if (isReplaceable(state) && !isWaterNear(world, bpos)) { + blocks.add(bpos.immutable()); + + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() + 1); + state = world.getBlockState(bpos); + } + + bpos.setY(y - 1); + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); } } } } - } + }); + blocks.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); return blocks; } private boolean isReplaceable(BlockState state) { - return state.is(TagAPI.GEN_TERRAIN) - || state.getMaterial().isReplaceable() - || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.LEAVES); + return state.is(TagAPI.BLOCK_GEN_TERRAIN) || + state.getMaterial().isReplaceable() || + state.getMaterial().equals(Material.PLANT) || + state.getMaterial().equals(Material.LEAVES); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index ed518538..7b23abb4 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -1,29 +1,35 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Map; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Maps; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.levelgen.Heightmap.Types; 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 ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; +import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; +import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Map; +import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + public class TunelCaveFeature extends EndCaveFeature { private Set generate(WorldGenLevel world, BlockPos center, Random random) { int cx = center.getX() >> 4; @@ -31,42 +37,59 @@ public class TunelCaveFeature extends EndCaveFeature { if ((long) cx * (long) cx + (long) cz + (long) cz < 256) { return Sets.newHashSet(); } + int x1 = cx << 4; int z1 = cz << 4; int x2 = x1 + 16; int z2 = z1 + 16; - int y2 = world.getHeight(); + Random rand = new Random(world.getSeed()); OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); - Set positions = Sets.newHashSet(); - MutableBlockPos pos = new MutableBlockPos(); - for (int x = x1; x < x2; x++) { - pos.setX(x); - for (int z = z1; z < z2; z++) { - pos.setZ(z); - for (int y = 0; y < y2; y++) { + Set positions = Sets.newConcurrentHashSet(); + + float a = hasCaves(world, new BlockPos(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, new BlockPos(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, new BlockPos(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, new BlockPos(x2, 0, z2)) ? 1F : 0F; + + ChunkAccess chunk = world.getChunk(cx, cz); + IntStream.range(0, 256).parallel().forEach(index -> { + MutableBlockPos pos = new MutableBlockPos(); + int x = index & 15; + int z = index >> 4; + int wheight = chunk.getHeight(Types.WORLD_SURFACE_WG, x, z); + float dx = x / 16F; + float dz = z / 16F; + pos.setX(x + x1); + pos.setZ(z + z1); + float da = Mth.lerp(dx, a, b); + float db = Mth.lerp(dx, c, d); + float density = 1 - Mth.lerp(dz, da, db); + if (density < 0.5) { + for (int y = 0; y < wheight; y++) { pos.setY(y); - float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); - float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; - float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; - vert *= vert; - if (val + vert + dist < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); + if (gradient > 0.5) { + break; + } + float val = Mth.abs((float) noiseH.eval(pos.getX() * 0.02, y * 0.01, pos.getZ() * 0.02)); + float vert = Mth.sin((y + (float) noiseV.eval( + pos.getX() * 0.01, + pos.getZ() * 0.01 + ) * 20) * 0.1F) * 0.9F; + float dist = (float) noiseD.eval(pos.getX() * 0.1, y * 0.1, pos.getZ() * 0.1) * 0.12F; + val = (val + vert * vert + dist) + density + gradient; + if (val < 0.15 && world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN) && noWaterNear(world, pos)) { positions.add(pos.immutable()); - int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (height < pos.getY() + 4) { - while (pos.getY() < height && noWaterNear(world, pos)) { - pos.setY(pos.getY() + 1); - BlocksHelper.setWithoutUpdate(world, pos, AIR); - } - } } } } - } + }); + positions.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); + return positions; } @@ -76,7 +99,7 @@ public class TunelCaveFeature extends EndCaveFeature { if (!world.getFluidState(above1).isEmpty() || !world.getFluidState(above2).isEmpty()) { return false; } - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { if (!world.getFluidState(above1.relative(dir)).isEmpty()) { return false; } @@ -88,11 +111,14 @@ public class TunelCaveFeature extends EndCaveFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } - + if (biomeMissingCaves(world, pos)) { return false; } @@ -115,7 +141,7 @@ public class TunelCaveFeature extends EndCaveFeature { } else if (world.getBlockState(mut).getMaterial().isReplaceable()) { mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(mut).is(TagAPI.BLOCK_GEN_TERRAIN)) { Set floorPositions = floorSets.get(bio); if (floorPositions == null) { floorPositions = Sets.newHashSet(); @@ -124,7 +150,7 @@ public class TunelCaveFeature extends EndCaveFeature { floorPositions.add(mut.immutable()); } mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(mut).is(TagAPI.BLOCK_GEN_TERRAIN)) { Set ceilPositions = ceilSets.get(bio); if (ceilPositions == null) { ceilPositions = Sets.newHashSet(); @@ -142,7 +168,7 @@ public class TunelCaveFeature extends EndCaveFeature { } floorSets.forEach((biome, floorPositions) -> { - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlockState surfaceBlock = EndBiome.findTopMaterial(biome); placeFloor(world, biome, floorPositions, random, surfaceBlock); }); ceilSets.forEach((biome, ceilPositions) -> { @@ -151,10 +177,10 @@ public class TunelCaveFeature extends EndCaveFeature { EndCaveBiome biome = EndBiomes.getCaveBiome(pos.getX(), pos.getZ()); placeWalls(world, biome, caveBlocks, random); fixBlocks(world, caveBlocks); - + return true; } - + @Override protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { return null; @@ -170,12 +196,12 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); } - + @Override protected void placeCeil(WorldGenLevel world, EndCaveBiome biome, Set ceilPositions, Random random) { float density = biome.getCeilDensity() * 0.2F; @@ -187,9 +213,22 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); } + + protected boolean hasCaves(WorldGenLevel world, BlockPos pos) { + return hasCavesInBiome(world, pos.offset(-8, 0, -8)) && hasCavesInBiome( + world, + pos.offset(8, 0, -8) + ) && hasCavesInBiome(world, pos.offset(-8, 0, 8)) && hasCavesInBiome(world, pos.offset(8, 0, 8)); + } + + protected boolean hasCavesInBiome(WorldGenLevel world, BlockPos pos) { + Biome biome = world.getBiome(pos); + BCLBiome endBiome = BiomeAPI.getFromBiome(biome); + return endBiome.getCustomData("has_caves", true); + } } diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index b03576fe..6a46e825 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -1,19 +1,15 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -32,6 +28,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class DragonTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; @@ -40,86 +40,88 @@ public class DragonTreeFeature extends DefaultFeature { private static final List SIDE1; private static final List SIDE2; private static final List ROOT; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + float size = MHelper.randRange(10, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - + Vector3f last = SplineHelper.getPos(spline, 3.5F); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); float radius = size * MHelper.randRange(0.5F, 0.7F, random); makeCap(world, pos.offset(last.x(), last.y(), last.z()), radius, random, noise); - + last = spline.get(0); makeRoots(world, pos.offset(last.x(), last.y(), last.z()), radius, random); - + radius = MHelper.randRange(1.2F, 2.3F, random); SDF function = SplineHelper.buildSDF(spline, radius, 1.2F, (bpos) -> { - return EndBlocks.DRAGON_TREE.bark.defaultBlockState(); + return EndBlocks.DRAGON_TREE.getBark().defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); - + return true; } - + private void makeCap(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { int count = (int) radius; int offset = (int) (BRANCH.get(BRANCH.size() - 1).y() * radius); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(BRANCH); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.getBark().defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE1); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); - + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.getBark().defaultBlockState(), pos, REPLACE); + branch = SplineHelper.copySpline(SIDE2); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.getBark().defaultBlockState(), pos, REPLACE); } leavesBall(world, pos.above(offset), radius * 1.15F + 2, random, noise); } - + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.GEN_TERRAIN)) { - SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.bark.defaultBlockState(), pos, REPLACE); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.BLOCK_GEN_TERRAIN)) { + SplineHelper.fillSpline(branch, world, EndBlocks.DRAGON_TREE.getBark().defaultBlockState(), pos, REPLACE); } } } - + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.DRAGON_TREE_LEAVES.defaultBlockState() + .setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); @@ -139,7 +141,7 @@ public class DragonTreeFeature extends DefaultFeature { return info.getState(); } } - info.setState(EndBlocks.DRAGON_TREE.bark.defaultBlockState()); + info.setState(EndBlocks.DRAGON_TREE.getBark().defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -166,12 +168,15 @@ public class DragonTreeFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, - random.nextGaussian() * 1); + BlockPos p = pos.offset( + random.nextGaussian() * 1, + random.nextGaussian() * 1, + random.nextGaussian() * 1 + ); boolean place = true; for (Direction d : Direction.values()) { BlockState state = world.getBlockState(p.relative(d)); @@ -181,19 +186,19 @@ public class DragonTreeFeature extends DefaultFeature { } } if (place) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.DRAGON_TREE.bark); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.DRAGON_TREE.getBark()); } } } - - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark); + + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.getBark()); } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (state.getBlock() == EndBlocks.DRAGON_TREE_LEAVES) { return true; } @@ -202,36 +207,45 @@ public class DragonTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.DRAGON_TREE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) - && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.DRAGON_TREE.log.defaultBlockState(); + if (EndBlocks.DRAGON_TREE.isTreeLog(info.getStateUp()) && EndBlocks.DRAGON_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.DRAGON_TREE.getLog().defaultBlockState(); } return info.getState(); }; - - BRANCH = Lists.newArrayList(new Vector3f(0, 0, 0), new Vector3f(0.1F, 0.3F, 0), new Vector3f(0.4F, 0.6F, 0), - new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); + + BRANCH = Lists.newArrayList( + new Vector3f(0, 0, 0), + new Vector3f(0.1F, 0.3F, 0), + new Vector3f(0.4F, 0.6F, 0), + new Vector3f(0.8F, 0.8F, 0), + new Vector3f(1, 1, 0) + ); SIDE1 = Lists.newArrayList(new Vector3f(0.4F, 0.6F, 0), new Vector3f(0.8F, 0.8F, 0), new Vector3f(1, 1, 0)); SIDE2 = SplineHelper.copySpline(SIDE1); - + Vector3f offset1 = new Vector3f(-0.4F, -0.6F, 0); Vector3f offset2 = new Vector3f(0.4F, 0.6F, 0); - + SplineHelper.offset(SIDE1, offset1); SplineHelper.offset(SIDE2, offset1); SplineHelper.rotateSpline(SIDE1, 0.5F); SplineHelper.rotateSpline(SIDE2, -0.5F); SplineHelper.offset(SIDE1, offset2); SplineHelper.offset(SIDE2, offset2); - - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), new Vector3f(0.1F, 0.7F, 0), new Vector3f(0.3F, 0.3F, 0), - new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.2F, 0)); + + ROOT = Lists.newArrayList( + new Vector3f(0F, 1F, 0), + new Vector3f(0.1F, 0.7F, 0), + new Vector3f(0.3F, 0.3F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.2F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 849cb05e..040c678b 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -1,23 +1,18 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.sdf.PosInfo; import ru.bclib.sdf.SDF; @@ -27,45 +22,55 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + float size = MHelper.randRange(5, 10, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 5); SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float radius = size * 0.17F;// MHelper.randRange(0.8F, 1.2F, random); - SDF function = SplineHelper.buildSDF(spline, radius, 0.2F, (bpos) -> EndBlocks.AMARANITA_STEM.defaultBlockState()); - + SDF function = SplineHelper.buildSDF( + spline, + radius, + 0.2F, + (bpos) -> EndBlocks.AMARANITA_STEM.defaultBlockState() + ); + Vector3f capPos = spline.get(spline.size() - 1); makeHead(world, pos.offset(capPos.x() + 0.5F, capPos.y() + 1.5F, capPos.z() + 0.5F), Mth.floor(size / 1.6F)); - + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursiveIgnore(world, pos, IGNORE); - + for (int i = 0; i < 3; i++) { List copy = SplineHelper.copySpline(spline); SplineHelper.offsetParts(copy, random, 0.2F, 0, 0.2F); SplineHelper.fillSplineForce(copy, world, EndBlocks.AMARANITA_HYPHAE.defaultBlockState(), pos, REPLACE); } - + return true; } - + private void makeHead(WorldGenLevel world, BlockPos pos, int radius) { MutableBlockPos mut = new MutableBlockPos(); if (radius < 2) { @@ -96,13 +101,17 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_LANTERN); mut.move(Direction.DOWN); if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .setValue(BaseAttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(BaseAttachedBlock.FACING, Direction.DOWN) + ); } } } } - + int h = radius + 1; for (int y = 0; y < h; y++) { mut.setY(pos.getY() + y + 1); @@ -116,7 +125,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + mut.setY(pos.getY() + h + 1); for (int x = -1; x < 2; x++) { mut.setX(pos.getX() + x); @@ -127,7 +136,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } else if (radius < 4) { + } + else if (radius < 4) { pos = pos.offset(-1, 0, -1); for (int i = -2; i < 2; i++) { mut.set(pos).move(Direction.NORTH, 2).move(Direction.WEST, i); @@ -159,21 +169,30 @@ public class GiganticAmaranitaFeature extends DefaultFeature { int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; BlockPos offseted = mut.relative(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { - Direction dir = Direction.fromAxisAndDirection(axis, - distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR - .defaultBlockState().setValue(BaseAttachedBlock.FACING, dir)); + Direction dir = Direction.fromAxisAndDirection( + axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE + ); + BlocksHelper.setWithoutUpdate( + world, + offseted, + EndBlocks.AMARANITA_FUR.defaultBlockState().setValue(BaseAttachedBlock.FACING, dir) + ); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .setValue(BaseAttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(BaseAttachedBlock.FACING, Direction.DOWN) + ); } } } } - + int h = radius - 1; for (int y = 0; y < h; y++) { mut.setY(pos.getY() + y + 1); @@ -187,7 +206,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + mut.setY(pos.getY() + h + 1); for (int x = -1; x < 3; x++) { mut.setX(pos.getX() + x); @@ -198,7 +217,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } else { + } + else { for (int i = -2; i < 3; i++) { mut.set(pos).move(Direction.NORTH, 3).move(Direction.EAST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { @@ -212,7 +232,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.SOUTH, 3).move(Direction.EAST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -225,7 +245,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.EAST, 3).move(Direction.NORTH, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -238,7 +258,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } - + mut.set(pos).move(Direction.WEST, 3).move(Direction.NORTH, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); @@ -252,15 +272,17 @@ public class GiganticAmaranitaFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } } - + for (int i = 0; i < 4; i++) { - mut.set(pos).move(Direction.UP).move(BlocksHelper.HORIZONTAL[i], 3) - .move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); + mut.set(pos) + .move(Direction.UP) + .move(BlocksHelper.HORIZONTAL[i], 3) + .move(BlocksHelper.HORIZONTAL[(i + 1) & 3], 3); if (world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_HYMENOPHORE); } } - + for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { mut.set(pos).move(x, 0, z); @@ -273,21 +295,30 @@ public class GiganticAmaranitaFeature extends DefaultFeature { int distance = axis == Axis.X ? x < 0 ? -1 : 1 : z < 0 ? -1 : 1; BlockPos offseted = mut.relative(axis, distance); if (world.getBlockState(offseted).getMaterial().isReplaceable()) { - Direction dir = Direction.fromAxisAndDirection(axis, - distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - BlocksHelper.setWithoutUpdate(world, offseted, EndBlocks.AMARANITA_FUR - .defaultBlockState().setValue(BaseAttachedBlock.FACING, dir)); + Direction dir = Direction.fromAxisAndDirection( + axis, + distance < 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE + ); + BlocksHelper.setWithoutUpdate( + world, + offseted, + EndBlocks.AMARANITA_FUR.defaultBlockState().setValue(BaseAttachedBlock.FACING, dir) + ); } mut.move(Direction.DOWN); } if (world.getBlockState(mut).getMaterial().isReplaceable()) { - BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_FUR.defaultBlockState() - .setValue(BaseAttachedBlock.FACING, Direction.DOWN)); + BlocksHelper.setWithoutUpdate( + world, + mut, + EndBlocks.AMARANITA_FUR.defaultBlockState() + .setValue(BaseAttachedBlock.FACING, Direction.DOWN) + ); } } } } - + for (int y = 0; y < 3; y++) { mut.setY(pos.getY() + y + 1); for (int x = -2; x < 3; x++) { @@ -300,7 +331,7 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + int h = radius + 1; for (int y = 4; y < h; y++) { mut.setY(pos.getY() + y); @@ -309,13 +340,16 @@ public class GiganticAmaranitaFeature extends DefaultFeature { for (int z = -2; z < 3; z++) { mut.setZ(pos.getZ() + z); if (y < 6) { - if (((x / 2) == 0 || (z / 2) == 0) - && world.getBlockState(mut).getMaterial().isReplaceable()) { + if (((x / 2) == 0 || (z / 2) == 0) && world.getBlockState(mut) + .getMaterial() + .isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); } - } else { - if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) - && world.getBlockState(mut).getMaterial().isReplaceable()) { + } + else { + if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) && world.getBlockState(mut) + .getMaterial() + .isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); } } @@ -324,17 +358,17 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (/*state.is(TagAPI.BLOCK_END_GROUND) || */state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); }; - + IGNORE = EndBlocks.DRAGON_TREE::isTreeLog; - + POST = (info) -> { if (!info.getStateUp().is(EndBlocks.AMARANITA_STEM) || !info.getStateDown().is(EndBlocks.AMARANITA_STEM)) { return EndBlocks.AMARANITA_HYPHAE.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 038ae0fc..50829f04 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -1,21 +1,15 @@ package ru.betterend.world.features.trees; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.AABB; -import ru.bclib.api.TagAPI; import ru.bclib.sdf.PosInfo; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; @@ -30,20 +24,26 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class HelixTreeFeature extends DefaultFeature { private static final Function POST; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float angle = random.nextFloat() * MHelper.PI2; float radiusRange = MHelper.randRange(4.5F, 6F, random); float scale = MHelper.randRange(0.5F, 1F, random); - + float dx; float dz; List spline = new ArrayList(10); @@ -54,39 +54,44 @@ public class HelixTreeFeature extends DefaultFeature { spline.add(new Vector3f(dx, i * 2, dz)); } SDF sdf = SplineHelper.buildSDF(spline, 1.7F, 0.5F, (p) -> { - return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + return EndBlocks.HELIX_TREE.getBark().defaultBlockState(); }); SDF rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(sdf); sdf = new SDFUnion().setSourceA(rotated).setSourceB(sdf); - + Vector3f lastPoint = spline.get(spline.size() - 1); List spline2 = SplineHelper.makeSpline(0, 0, 0, 0, 20, 0, 5); SDF stem = SplineHelper.buildSDF(spline2, 1.0F, 0.5F, (p) -> { - return EndBlocks.HELIX_TREE.bark.defaultBlockState(); + return EndBlocks.HELIX_TREE.getBark().defaultBlockState(); }); stem = new SDFTranslate().setTranslate(lastPoint.x(), lastPoint.y(), lastPoint.z()).setSource(stem); sdf = new SDFSmoothUnion().setRadius(3).setSourceA(sdf).setSourceB(stem); - + sdf = new SDFScale().setScale(scale).setSource(sdf); dx = 30 * scale; float dy1 = -20 * scale; float dy2 = 100 * scale; sdf.addPostProcess(POST).fillArea(world, pos, new AABB(pos.offset(-dx, dy1, -dx), pos.offset(dx, dy2, dx))); SplineHelper.scale(spline, scale); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.getBark().defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.rotateSpline(spline, (float) Math.PI); - SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.bark.defaultBlockState(), pos, (state) -> { + SplineHelper.fillSplineForce(spline, world, EndBlocks.HELIX_TREE.getBark().defaultBlockState(), pos, (state) -> { return state.getMaterial().isReplaceable(); }); SplineHelper.scale(spline2, scale); BlockPos leafStart = pos.offset(lastPoint.x() + 0.5, lastPoint.y() + 0.5, lastPoint.z() + 0.5); - SplineHelper.fillSplineForce(spline2, world, EndBlocks.HELIX_TREE.log.defaultBlockState(), leafStart, - (state) -> { - return state.getMaterial().isReplaceable(); - }); - + SplineHelper.fillSplineForce( + spline2, + world, + EndBlocks.HELIX_TREE.getLog().defaultBlockState(), + leafStart, + (state) -> { + return state.getMaterial().isReplaceable(); + } + ); + spline.clear(); float rad = MHelper.randRange(8F, 11F, random); int count = MHelper.randRange(20, 30, random); @@ -101,7 +106,7 @@ public class HelixTreeFeature extends DefaultFeature { dz = (float) Math.cos(i * 0.45F + angle) * radius; spline.add(new Vector3f(dx, i * scaleM, dz)); } - + Vector3f start = new Vector3f(); Vector3f end = new Vector3f(); lastPoint = spline.get(0); @@ -123,7 +128,8 @@ public class HelixTreeFeature extends DefaultFeature { if (ax > az) { start.set(start.x(), start.y(), start.z() + az > 0 ? 1 : -1); end.set(end.x(), end.y(), end.z() + az > 0 ? 1 : -1); - } else { + } + else { start.set(start.x() + ax > 0 ? 1 : -1, start.y(), start.z()); end.set(end.x() + ax > 0 ? 1 : -1, end.y(), end.z()); } @@ -131,7 +137,7 @@ public class HelixTreeFeature extends DefaultFeature { } lastPoint = point; } - + leaf = leaf.setValue(HelixTreeLeavesBlock.COLOR, 7); leafStart = leafStart.offset(0, lastPoint.y(), 0); if (world.getBlockState(leafStart).isAir()) { @@ -145,12 +151,11 @@ public class HelixTreeFeature extends DefaultFeature { } } } - + return true; } - - private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, - int offset) { + + private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, int offset) { float dx = end.x() - start.x(); float dy = end.y() - start.y(); float dz = end.z() - start.z(); @@ -162,7 +167,7 @@ public class HelixTreeFeature extends DefaultFeature { float x = start.x(); float y = start.y(); float z = start.z(); - + MutableBlockPos bPos = new MutableBlockPos(); for (int i = 0; i < count; i++) { bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ()); @@ -180,12 +185,11 @@ public class HelixTreeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, bPos, state.setValue(HelixTreeLeavesBlock.COLOR, 7)); } } - + static { POST = (info) -> { - if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) - && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.HELIX_TREE.log.defaultBlockState(); + if (EndBlocks.HELIX_TREE.isTreeLog(info.getStateUp()) && EndBlocks.HELIX_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.HELIX_TREE.getLog().defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 3680e707..696bfeda 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -1,17 +1,13 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -28,19 +24,24 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class JellyshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final List ROOT; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - - BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + + BlockState bark = EndBlocks.JELLYSHROOM.getBark().defaultBlockState(); BlockState membrane = EndBlocks.JELLYSHROOM_CAP_PURPLE.defaultBlockState(); - + int height = MHelper.randRange(5, 8, random); float radius = height * MHelper.randRange(0.15F, 0.25F, random); List spline = SplineHelper.makeSpline(0, -1, 0, 0, height, 0, 3); @@ -48,7 +49,7 @@ public class JellyshroomFeature extends DefaultFeature { SDF sdf = SplineHelper.buildSDF(spline, radius, 0.8F, (bpos) -> { return bark; }); - + radius = height * MHelper.randRange(0.7F, 0.9F, random); if (radius < 1.5F) { radius = 1.5F; @@ -60,11 +61,11 @@ public class JellyshroomFeature extends DefaultFeature { sdf = new SDFSmoothUnion().setRadius(3F).setSourceA(sdf).setSourceB(cap); sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.JELLYSHROOM.isTreeLog(info.getState())) { - if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) - && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { - return EndBlocks.JELLYSHROOM.log.defaultBlockState(); + if (EndBlocks.JELLYSHROOM.isTreeLog(info.getStateUp()) && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { + return EndBlocks.JELLYSHROOM.getLog().defaultBlockState(); } - } else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { + } + else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { float dx = info.getPos().getX() - pos.getX() - last.x(); float dz = info.getPos().getZ() - pos.getZ() - last.z(); float distance = MHelper.length(dx, dz) / membraneRadius * 7F; @@ -75,50 +76,54 @@ public class JellyshroomFeature extends DefaultFeature { }).fillRecursive(world, pos); radius = height * 0.5F; makeRoots(world, pos.offset(0, 2, 0), radius, random, bark); - + return true; } - + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 3.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.BLOCK_GEN_TERRAIN)) { SplineHelper.fillSpline(branch, world, wood, pos, REPLACE); } } } - + private SDF makeCap(float radius, Random random, BlockState cap) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); - + float angle = random.nextFloat() * MHelper.PI2; int count = (int) MHelper.randRange(radius * 0.5F, radius, random); if (count < 3) { count = 3; } sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.2F).setSource(sphere); - + return sphere; } - + static { - ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + ROOT = Lists.newArrayList( + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - + REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT)) { + if (/*state.is(TagAPI.BLOCK_END_GROUND) || */state.getMaterial().equals(Material.PLANT)) { return true; } return state.getMaterial().isReplaceable(); diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 9485d5ce..50d72630 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -1,18 +1,14 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -29,44 +25,49 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class LacugroveFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + float size = MHelper.randRange(15, 25, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - + if (!SplineHelper.canGenerate(spline, pos, world, REPLACE)) { return false; } - + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - + float radius = MHelper.randRange(6F, 8F, random); radius *= (size - 15F) / 20F + 1F; Vector3f center = spline.get(4); leavesBall(world, pos.offset(center.x(), center.y(), center.z()), radius, random, noise); - + radius = MHelper.randRange(1.2F, 1.8F, random); SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> { - return EndBlocks.LACUGROVE.bark.defaultBlockState(); + return EndBlocks.LACUGROVE.getBark().defaultBlockState(); }); - + function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursive(world, pos); - + spline = spline.subList(4, 6); - SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.bark.defaultBlockState(), pos, REPLACE); - + SplineHelper.fillSpline(spline, world, EndBlocks.LACUGROVE.getBark().defaultBlockState(), pos, REPLACE); + MutableBlockPos mut = new MutableBlockPos(); int offset = random.nextInt(2); for (int i = 0; i < 100; i++) { @@ -82,7 +83,7 @@ public class LacugroveFeature extends DefaultFeature { boolean generate = false; for (int y = minY; y < maxY; y++) { mut.setY(y); - if (world.getBlockState(mut).is(TagAPI.END_GROUND)) { + if (world.getBlockState(mut).is(TagAPI.BLOCK_END_GROUND)) { generate = true; break; } @@ -92,11 +93,15 @@ public class LacugroveFeature extends DefaultFeature { for (int y = top; y >= minY; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) - || state.is(TagAPI.END_GROUND)) { - BlocksHelper.setWithoutUpdate(world, mut, - y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); - } else { + if (state.getMaterial().isReplaceable() || state.getMaterial() + .equals(Material.PLANT) || state.is(TagAPI.BLOCK_END_GROUND)) { + BlocksHelper.setWithoutUpdate( + world, + mut, + y == top ? EndBlocks.LACUGROVE.getBark() : EndBlocks.LACUGROVE.getLog() + ); + } + else { break; } } @@ -104,13 +109,14 @@ public class LacugroveFeature extends DefaultFeature { } } } - + return true; } - + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.LACUGROVE_LEAVES.defaultBlockState() + .setValue(LeavesBlock.DISTANCE, 6)); sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; }).setSource(sphere); @@ -118,7 +124,7 @@ public class LacugroveFeature extends DefaultFeature { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere) - .setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); + .setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere)); MutableBlockPos mut = new MutableBlockPos(); sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { @@ -128,7 +134,7 @@ public class LacugroveFeature extends DefaultFeature { return info.getState(); } } - info.setState(EndBlocks.LACUGROVE.bark.defaultBlockState()); + info.setState(EndBlocks.LACUGROVE.getBark().defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -155,12 +161,15 @@ public class LacugroveFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - + if (radius > 5) { int count = (int) (radius * 2.5F); for (int i = 0; i < count; i++) { - BlockPos p = pos.offset(random.nextGaussian() * 1, random.nextGaussian() * 1, - random.nextGaussian() * 1); + BlockPos p = pos.offset( + random.nextGaussian() * 1, + random.nextGaussian() * 1, + random.nextGaussian() * 1 + ); boolean place = true; for (Direction d : Direction.values()) { BlockState state = world.getBlockState(p.relative(d)); @@ -170,19 +179,19 @@ public class LacugroveFeature extends DefaultFeature { } } if (place) { - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LACUGROVE.bark); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LACUGROVE.getBark()); } } } - - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LACUGROVE.bark); + + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LACUGROVE.getBark()); } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (EndBlocks.LACUGROVE.isTreeLog(state)) { return true; } @@ -194,15 +203,14 @@ public class LacugroveFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.LACUGROVE.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) - && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { - return EndBlocks.LACUGROVE.log.defaultBlockState(); + if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) { + return EndBlocks.LACUGROVE.getLog().defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index b8a8ffc6..f1145e30 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -1,19 +1,15 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -34,19 +30,25 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class LucerniaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; private static final Function IGNORE; private static final List SPLINE; private static final List ROOT; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + float size = MHelper.randRange(12, 20, random); int count = (int) (size * 0.3F); float var = MHelper.PI2 / (float) (count * 3); @@ -57,48 +59,50 @@ public class LucerniaFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, size * MHelper.randRange(0.5F, 1F, random)); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); + SplineHelper.fillSpline(spline, world, EndBlocks.LUCERNIA.getBark().defaultBlockState(), pos, REPLACE); Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.13F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise, config != null); } - + makeRoots(world, pos.offset(0, MHelper.randRange(3, 5, random), 0), size * 0.35F, random); - + return true; } - - private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, - boolean natural) { + + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, boolean natural) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState() + .setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - MHelper.randRange(-1.5F, 1.5F, random)).setSource(sphere); - + sphere = new SDFDisplacement().setFunction((vec) -> (float) noise.eval( + vec.x() * 0.2, + vec.y() * 0.2, + vec.z() * 0.2 + ) * 2F).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> MHelper.randRange(-1.5F, 1.5F, random)).setSource(sphere); + MutableBlockPos mut = new MutableBlockPos(); for (Direction d1 : BlocksHelper.HORIZONTAL) { BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.getBark().defaultBlockState()); for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.bark.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.LUCERNIA.getBark().defaultBlockState()); } } - + BlockState top = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); - BlockState middle = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.MIDDLE); - BlockState bottom = EndBlocks.FILALUX.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.BOTTOM); + BlockState middle = EndBlocks.FILALUX.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); + BlockState bottom = EndBlocks.FILALUX.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); BlockState outer = EndBlocks.LUCERNIA_OUTER_LEAVES.defaultBlockState(); - + List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { if (natural && random.nextInt(6) == 0 && info.getStateDown().isAir()) { @@ -112,16 +116,16 @@ public class LucerniaFeature extends DefaultFeature { return info.getState(); } } - info.setState(EndBlocks.LUCERNIA.bark.defaultBlockState()); + info.setState(EndBlocks.LUCERNIA.getBark().defaultBlockState()); } - + MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); } } - + if (EndBlocks.LUCERNIA.isTreeLog(info.getState())) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -149,8 +153,8 @@ public class LucerniaFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LUCERNIA.bark); - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.LUCERNIA.getBark()); + support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); if (state.isAir() || state.is(EndBlocks.LUCERNIA_OUTER_LEAVES)) { @@ -162,7 +166,8 @@ public class LucerniaFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } @@ -171,28 +176,28 @@ public class LucerniaFeature extends DefaultFeature { } }); } - + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.GEN_TERRAIN)) { - SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.bark.defaultBlockState(), pos, REPLACE); + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.BLOCK_GEN_TERRAIN)) { + SplineHelper.fillSplineForce(branch, world, EndBlocks.LUCERNIA.getBark().defaultBlockState(), pos, REPLACE); } } } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (state.getBlock() == EndBlocks.LUCERNIA_LEAVES) { return true; } @@ -201,15 +206,24 @@ public class LucerniaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = EndBlocks.LUCERNIA::isTreeLog; - - SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F)); - - ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + + SPLINE = Lists.newArrayList( + new Vector3f(0.00F, 0.00F, 0.00F), + new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), + new Vector3f(0.30F, 0.55F, 0.00F), + new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F) + ); + + ROOT = Lists.newArrayList( + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); } } diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index fd076dbc..cdbc29c3 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -1,19 +1,13 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFBinary; import ru.bclib.sdf.operator.SDFCoordModify; @@ -36,138 +30,150 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class MossyGlowshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final Vector3f CENTER = new Vector3f(); private static final SDFBinary FUNCTION; private static final SDFTranslate HEAD_POS; private static final SDFFlatWave ROOTS_ROT; - + private static final SDFPrimitive CONE1; private static final SDFPrimitive CONE2; private static final SDFPrimitive CONE_GLOW; private static final SDFPrimitive ROOTS; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState down = world.getBlockState(blockPos.below()); - if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) - return false; - + if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) return false; + CONE1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); CONE_GLOW.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); - ROOTS.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + ROOTS.setBlock(EndBlocks.MOSSY_GLOWSHROOM.getBark()); + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); + return EndBlocks.MOSSY_GLOWSHROOM.getLog().defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(0.75F, 1.1F, random); - + if (!SplineHelper.canGenerate(spline, scale, blockPos, world, REPLACE)) { return false; } BlocksHelper.setWithoutUpdate(world, blockPos, AIR); - + CENTER.set(blockPos.getX(), 0, blockPos.getZ()); HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); ROOTS_ROT.setAngle(random.nextFloat() * MHelper.PI2); FUNCTION.setSourceA(sdf); - + new SDFScale().setScale(scale).setSource(FUNCTION).setReplaceFunction(REPLACE).addPostProcess((info) -> { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) - || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); + else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog( + info.getStateDown())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM.getBark().defaultBlockState()); return info.getState(); } } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() - .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); + .setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); return info.getState(); } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { for (Direction dir : BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().relative(dir), - EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); + info.setBlockPos( + info.getPos().relative(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir) + ); } } - + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() - .setValue(FurBlock.FACING, Direction.DOWN)); + info.setBlockPos( + info.getPos().below(), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.DOWN) + ); } } return info.getState(); }).fillRecursive(world, blockPos); - + return true; } - + static { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) + .setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + CONE1 = cone1; CONE2 = cone2; - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); CONE_GLOW = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { float dist = MHelper.length(pos.x(), pos.z()); - float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + CENTER.x(), pos.z() * 0.1 + CENTER.z()) * dist * 0.3F - - dist * 0.15F; + float y = pos.y() + (float) noise.eval( + pos.x() * 0.1 + CENTER.x(), + pos.z() * 0.1 + CENTER.z() + ) * dist * 0.3F - dist * 0.15F; pos.set(pos.x(), y, pos.z()); }).setSource(cones); - - HEAD_POS = (SDFTranslate) new SDFTranslate() - .setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + + HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0) + .setSource(cones)); + SDF roots = new SDFSphere().setRadius(4F); ROOTS = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); ROOTS_ROT = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - + FUNCTION = new SDFSmoothUnion().setRadius(4) - .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); - + .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(ROOTS_ROT)); + REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (state.getMaterial().equals(Material.PLANT)) { return true; } diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index 178bc53c..087a1903 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -1,21 +1,15 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.TagAPI; import ru.bclib.sdf.PosInfo; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; @@ -30,67 +24,91 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) { return false; } BlocksHelper.setWithoutUpdate(world, pos, AIR); - + float size = MHelper.randRange(10, 20, random); List spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 4); SplineHelper.offsetParts(spline, random, 0.7F, 0, 0.7F); Vector3f last = spline.get(spline.size() - 1); - + int depth = MHelper.floor((size - 10F) * 3F / 10F + 1F); float bsize = (10F - (size - 10F)) / 10F + 1.5F; - branch(last.x(), last.y(), last.z(), size * bsize, MHelper.randRange(0, MHelper.PI2, random), random, depth, - world, pos); - + branch( + last.x(), + last.y(), + last.z(), + size * bsize, + MHelper.randRange(0, MHelper.PI2, random), + random, + depth, + world, + pos + ); + SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> { - return EndBlocks.PYTHADENDRON.bark.defaultBlockState(); + return EndBlocks.PYTHADENDRON.getBark().defaultBlockState(); }); function.setReplaceFunction(REPLACE); function.addPostProcess(POST); function.fillRecursive(world, pos); - + return true; } - - private void branch(float x, float y, float z, float size, float angle, Random random, int depth, - WorldGenLevel world, BlockPos pos) { - if (depth == 0) - return; - + + private void branch(float x, float y, float z, float size, float angle, Random random, int depth, WorldGenLevel world, BlockPos pos) { + if (depth == 0) return; + float dx = (float) Math.cos(angle) * size * 0.15F; float dz = (float) Math.sin(angle) * size * 0.15F; - + float x1 = x + dx; float z1 = z + dz; float x2 = x - dx; float z2 = z - dz; - + List spline = SplineHelper.makeSpline(x, y, z, x1, y, z1, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos1 = spline.get(spline.size() - 1); - - boolean s1 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, - REPLACE); - + + boolean s1 = SplineHelper.fillSpline( + spline, + world, + EndBlocks.PYTHADENDRON.getBark().defaultBlockState(), + pos, + REPLACE + ); + spline = SplineHelper.makeSpline(x, y, z, x2, y, z2, 5); SplineHelper.powerOffset(spline, size * MHelper.randRange(1.0F, 2.0F, random), 4); SplineHelper.offsetParts(spline, random, 0.3F, 0, 0.3F); Vector3f pos2 = spline.get(spline.size() - 1); - - boolean s2 = SplineHelper.fillSpline(spline, world, EndBlocks.PYTHADENDRON.bark.defaultBlockState(), pos, - REPLACE); - + + boolean s2 = SplineHelper.fillSpline( + spline, + world, + EndBlocks.PYTHADENDRON.getBark().defaultBlockState(), + pos, + REPLACE + ); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); if (depth < 3) { if (s1) { @@ -100,12 +118,12 @@ public class PythadendronTreeFeature extends DefaultFeature { leavesBall(world, pos.offset(pos2.x(), pos2.y(), pos2.z()), random, noise); } } - + float size1 = size * MHelper.randRange(0.75F, 0.95F, random); float size2 = size * MHelper.randRange(0.75F, 0.95F, random); float angle1 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); float angle2 = angle + (float) Math.PI * 0.5F + MHelper.randRange(-0.1F, 0.1F, random); - + if (s1) { branch(pos1.x(), pos1.y(), pos1.z(), size1, angle1, random, depth - 1, world, pos); } @@ -113,12 +131,13 @@ public class PythadendronTreeFeature extends DefaultFeature { branch(pos2.x(), pos2.y(), pos2.z(), size2, angle2, random, depth - 1, world, pos); } } - + private void leavesBall(WorldGenLevel world, BlockPos pos, Random random, OpenSimplexNoise noise) { float radius = MHelper.randRange(4.5F, 6.5F, random); - + SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.PYTHADENDRON_LEAVES.defaultBlockState() + .setValue(LeavesBlock.DISTANCE, 6)); sphere = new SDFScale3D().setScale(1, 0.6F, 1).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 3; @@ -127,7 +146,7 @@ public class PythadendronTreeFeature extends DefaultFeature { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere) - .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + .setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); MutableBlockPos mut = new MutableBlockPos(); sphere.addPostProcess((info) -> { if (random.nextInt(5) == 0) { @@ -137,7 +156,7 @@ public class PythadendronTreeFeature extends DefaultFeature { return info.getState(); } } - info.setState(EndBlocks.PYTHADENDRON.bark.defaultBlockState()); + info.setState(EndBlocks.PYTHADENDRON.getBark().defaultBlockState()); for (int x = -6; x < 7; x++) { int ax = Math.abs(x); mut.setX(x + info.getPos().getX()); @@ -165,12 +184,12 @@ public class PythadendronTreeFeature extends DefaultFeature { }); sphere.fillRecursiveIgnore(world, pos, IGNORE); } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) { return true; } @@ -179,15 +198,14 @@ public class PythadendronTreeFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = (state) -> { return EndBlocks.PYTHADENDRON.isTreeLog(state); }; - + POST = (info) -> { - if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) - && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { - return EndBlocks.PYTHADENDRON.log.defaultBlockState(); + if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) { + return EndBlocks.PYTHADENDRON.getLog().defaultBlockState(); } return info.getState(); }; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 7f9c7ecb..01aa5d65 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -1,22 +1,17 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; @@ -34,18 +29,23 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class TenaneaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; private static final Function IGNORE; private static final List SPLINE; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + float size = MHelper.randRange(7, 10, random); int count = (int) (size * 0.45F); float var = MHelper.PI2 / (float) (count * 3); @@ -56,46 +56,49 @@ public class TenaneaFeature extends DefaultFeature { SplineHelper.rotateSpline(spline, angle); SplineHelper.scale(spline, size + MHelper.randRange(0, size * 0.5F, random)); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); - SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.bark.defaultBlockState(), pos, REPLACE); + SplineHelper.fillSpline(spline, world, EndBlocks.TENANEA.getBark().defaultBlockState(), pos, REPLACE); Vector3f last = spline.get(spline.size() - 1); float leavesRadius = (size * 0.3F + MHelper.randRange(0.8F, 1.5F, random)) * 1.4F; OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); leavesBall(world, pos.offset(last.x(), last.y(), last.z()), leavesRadius, random, noise); } - + return true; } - + private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) { SDF sphere = new SDFSphere().setRadius(radius) - .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); + .setBlock(EndBlocks.TENANEA_LEAVES.defaultBlockState() + .setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - (float) noise.eval(vec.x() * 0.2, vec.y() * 0.2, vec.z() * 0.2) * 2F).setSource(sphere); - sphere = new SDFDisplacement().setFunction((vec) -> - MHelper.randRange(-1.5F, 1.5F, random)).setSource(sphere); - + sphere = new SDFDisplacement().setFunction((vec) -> (float) noise.eval( + vec.x() * 0.2, + vec.y() * 0.2, + vec.z() * 0.2 + ) * 2F).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> MHelper.randRange(-1.5F, 1.5F, random)).setSource(sphere); + MutableBlockPos mut = new MutableBlockPos(); for (Direction d1 : BlocksHelper.HORIZONTAL) { BlockPos p = mut.set(pos).move(Direction.UP).move(d1).immutable(); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.getBark().defaultBlockState()); for (Direction d2 : BlocksHelper.HORIZONTAL) { mut.set(p).move(Direction.UP).move(d2); - BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.bark.defaultBlockState()); + BlocksHelper.setWithoutUpdate(world, p, EndBlocks.TENANEA.getBark().defaultBlockState()); } } - - BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.TOP); - BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.MIDDLE); - BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, - TripleShape.BOTTOM); + + BlockState top = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); BlockState outer = EndBlocks.TENANEA_OUTER_LEAVES.defaultBlockState(); - + List support = Lists.newArrayList(); sphere.addPostProcess((info) -> { if (random.nextInt(6) == 0 && info.getStateDown().isAir()) { @@ -109,16 +112,16 @@ public class TenaneaFeature extends DefaultFeature { return info.getState(); } } - info.setState(EndBlocks.TENANEA.bark.defaultBlockState()); + info.setState(EndBlocks.TENANEA.getBark().defaultBlockState()); } - + MHelper.shuffle(DIRECTIONS, random); for (Direction d : DIRECTIONS) { if (info.getState(d).isAir()) { info.setBlockPos(info.getPos().relative(d), outer.setValue(FurBlock.FACING, d)); } } - + if (EndBlocks.TENANEA.isTreeLog(info.getState())) { for (int x = -6; x < 7; x++) { int ax = Math.abs(x); @@ -146,8 +149,8 @@ public class TenaneaFeature extends DefaultFeature { return info.getState(); }); sphere.fillRecursiveIgnore(world, pos, IGNORE); - BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.TENANEA.bark); - + BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.TENANEA.getBark()); + support.forEach((bpos) -> { BlockState state = world.getBlockState(bpos); if (state.isAir() || state.is(EndBlocks.TENANEA_OUTER_LEAVES)) { @@ -159,7 +162,8 @@ public class TenaneaFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } @@ -168,12 +172,12 @@ public class TenaneaFeature extends DefaultFeature { } }); } - + static { REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND)) { + /*if (state.is(TagAPI.BLOCK_END_GROUND)) { return true; - } + }*/ if (state.getBlock() == EndBlocks.TENANEA_LEAVES) { return true; } @@ -182,11 +186,16 @@ public class TenaneaFeature extends DefaultFeature { } return state.getMaterial().isReplaceable(); }; - + IGNORE = EndBlocks.TENANEA::isTreeLog; - - SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F)); + + SPLINE = Lists.newArrayList( + new Vector3f(0.00F, 0.00F, 0.00F), + new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), + new Vector3f(0.30F, 0.55F, 0.00F), + new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F) + ); } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index f2f7366e..e37207cd 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -1,19 +1,15 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -34,37 +30,40 @@ import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final List SPLINE; private static final List ROOT; - + @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) - return false; - - BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() - .setValue(UmbrellaTreeMembraneBlock.COLOR, 1); - BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState() - .setValue(UmbrellaTreeMembraneBlock.COLOR, 0); - BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState() - .setValue(UmbrellaTreeClusterBlock.NATURAL, true); - + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(BlockTags.NYLIUM)) return false; + + BlockState wood = EndBlocks.UMBRELLA_TREE.getBark().defaultBlockState(); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().setValue(UmbrellaTreeMembraneBlock.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.defaultBlockState().setValue(UmbrellaTreeMembraneBlock.COLOR, 0); + BlockState fruit = EndBlocks.UMBRELLA_TREE_CLUSTER.defaultBlockState().setValue(UmbrellaTreeClusterBlock.NATURAL, true); + float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; List
centers = Lists.newArrayList(); - + float scale = 1; if (config != null) { scale = MHelper.randRange(1F, 1.7F, random); } - + for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); @@ -73,44 +72,48 @@ public class UmbrellaTreeFeature extends DefaultFeature { // SplineHelper.offset(spline, new Vector3f((20 - size) * 0.2F, 0, 0)); SplineHelper.rotateSpline(spline, angle); SplineHelper.offsetParts(spline, random, 0.5F, 0, 0.5F); - + if (SplineHelper.canGenerate(spline, pos, world, REPLACE)) { float rScale = (scale - 1) * 0.4F + 1; SDF branch = SplineHelper.buildSDF(spline, 1.2F * rScale, 0.8F * rScale, (bpos) -> { return wood; }); - + Vector3f vec = spline.get(spline.size() - 1); float radius = (size + MHelper.randRange(0, size * 0.5F, random)) * 0.4F; - + sdf = (sdf == null) ? branch : new SDFUnion().setSourceA(sdf).setSourceB(branch); SDF mem = makeMembrane(world, radius, random, membrane, center); - + float px = MHelper.floor(vec.x()) + 0.5F; float py = MHelper.floor(vec.y()) + 0.5F; float pz = MHelper.floor(vec.z()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); - centers.add(new Center(pos.getX() + (double) (px * scale), pos.getY() + (double) (py * scale), - pos.getZ() + (double) (pz * scale), radius * scale)); - + centers.add(new Center( + pos.getX() + (double) (px * scale), + pos.getY() + (double) (py * scale), + pos.getZ() + (double) (pz * scale), + radius * scale + )); + vec = spline.get(0); } } - + if (sdf == null) { return false; } - + if (scale > 1) { sdf = new SDFScale().setScale(scale).setSource(sdf); } - + sdf.setReplaceFunction(REPLACE).addPostProcess((info) -> { - if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) - && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.UMBRELLA_TREE.log.defaultBlockState(); - } else if (info.getState().equals(membrane)) { + if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.UMBRELLA_TREE.getLog().defaultBlockState(); + } + else if (info.getState().equals(membrane)) { Center min = centers.get(0); double d = Double.MAX_VALUE; BlockPos bpos = info.getPos(); @@ -128,7 +131,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { return info.getState(); }).fillRecursive(world, pos); makeRoots(world, pos, (size * 0.5F + 3) * scale, random, wood); - + for (Center c : centers) { if (!world.getBlockState(new BlockPos(c.px, c.py, c.pz)).isAir()) { count = MHelper.floor(MHelper.randRange(5F, 10F, random) * scale); @@ -142,46 +145,46 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } } - + return true; } - + private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; float scale = radius * MHelper.randRange(0.85F, 1.15F, random); - + List branch = SplineHelper.copySpline(ROOT); SplineHelper.rotateSpline(branch, angle); SplineHelper.scale(branch, scale); Vector3f last = branch.get(branch.size() - 1); - if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos.offset(last.x(), last.y(), last.z())).is(TagAPI.BLOCK_GEN_TERRAIN)) { SplineHelper.fillSplineForce(branch, world, wood, pos, REPLACE); } } } - + private SDF makeMembrane(WorldGenLevel world, float radius, Random random, BlockState membrane, BlockState center) { SDF sphere = new SDFSphere().setRadius(radius).setBlock(membrane); SDF sub = new SDFTranslate().setTranslate(0, -4, 0).setSource(sphere); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFTranslate().setTranslate(0, 1 - radius * 0.5F, 0).setSource(sphere); - + float angle = random.nextFloat() * MHelper.PI2; int count = (int) MHelper.randRange(radius, radius * 2, random); if (count < 5) { count = 5; } sphere = new SDFFlatWave().setAngle(angle).setRaysCount(count).setIntensity(0.6F).setSource(sphere); - + SDF cent = new SDFSphere().setRadius(2.5F).setBlock(center); sphere = new SDFUnion().setSourceA(sphere).setSourceB(cent); - + return sphere; } - + private void makeFruits(WorldGenLevel world, double px, double py, double pz, BlockState fruit, float scale) { MutableBlockPos mut = new MutableBlockPos().set(px, py, pz); for (int i = 0; i < 8; i++) { @@ -195,38 +198,46 @@ public class UmbrellaTreeFeature extends DefaultFeature { } } } - + static { - SPLINE = Lists.newArrayList(new Vector3f(0.00F, 0.00F, 0.00F), new Vector3f(0.10F, 0.35F, 0.00F), - new Vector3f(0.20F, 0.50F, 0.00F), new Vector3f(0.30F, 0.55F, 0.00F), new Vector3f(0.42F, 0.70F, 0.00F), - new Vector3f(0.50F, 1.00F, 0.00F)); - - ROOT = Lists.newArrayList(new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), - new Vector3f(0.7F, 0.05F, 0), new Vector3f(0.8F, -0.20F, 0)); + SPLINE = Lists.newArrayList( + new Vector3f(0.00F, 0.00F, 0.00F), + new Vector3f(0.10F, 0.35F, 0.00F), + new Vector3f(0.20F, 0.50F, 0.00F), + new Vector3f(0.30F, 0.55F, 0.00F), + new Vector3f(0.42F, 0.70F, 0.00F), + new Vector3f(0.50F, 1.00F, 0.00F) + ); + + ROOT = Lists.newArrayList( + new Vector3f(0.1F, 0.70F, 0), + new Vector3f(0.3F, 0.30F, 0), + new Vector3f(0.7F, 0.05F, 0), + new Vector3f(0.8F, -0.20F, 0) + ); SplineHelper.offset(ROOT, new Vector3f(0, -0.45F, 0)); - + REPLACE = (state) -> { - if (state.is(TagAPI.END_GROUND) || state.getMaterial().equals(Material.PLANT) - || state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { + if (/*state.is(TagAPI.BLOCK_END_GROUND) || */state.getMaterial().equals(Material.PLANT) || state.is(EndBlocks.UMBRELLA_TREE_MEMBRANE)) { return true; } return state.getMaterial().isReplaceable(); }; } - + private class Center { final double px; final double py; final double pz; final float radius; - + Center(double x, double y, double z, float radius) { this.px = x; this.py = y; this.pz = z; this.radius = radius; } - + double distance(float x, float z) { return MHelper.length(px - x, pz - z); } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java deleted file mode 100644 index 602a095b..00000000 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ /dev/null @@ -1,151 +0,0 @@ -package ru.betterend.world.generator; - -import java.util.List; - -import com.google.common.collect.Lists; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.core.Registry; -import net.minecraft.resources.RegistryLookupCodec; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.Biomes; -import net.minecraft.world.level.biome.TheEndBiomeSource; -import net.minecraft.world.level.levelgen.WorldgenRandom; -import net.minecraft.world.level.levelgen.synth.SimplexNoise; -import ru.bclib.api.BiomeAPI; -import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.generator.BiomeMap; -import ru.betterend.BetterEnd; -import ru.betterend.noise.OpenSimplexNoise; -import ru.betterend.registry.EndBiomes; -import ru.betterend.registry.EndTags; -import ru.betterend.util.FeaturesHelper; -import ru.betterend.world.biome.EndBiome; - -public class BetterEndBiomeSource extends BiomeSource { - public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { - return instance.group(RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter((theEndBiomeSource) -> { - return theEndBiomeSource.biomeRegistry; - }), Codec.LONG.fieldOf("seed").stable().forGetter((theEndBiomeSource) -> { - return theEndBiomeSource.seed; - })).apply(instance, instance.stable(BetterEndBiomeSource::new)); - }); - private static final OpenSimplexNoise SMALL_NOISE = new OpenSimplexNoise(8324); - private final Registry biomeRegistry; - private final SimplexNoise noise; - private final Biome centerBiome; - private final Biome barrens; - private BiomeMap mapLand; - private BiomeMap mapVoid; - private final long seed; - - public BetterEndBiomeSource(Registry biomeRegistry, long seed) { - super(getBiomes(biomeRegistry)); - - this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); - this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); - this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); - this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); - this.biomeRegistry = biomeRegistry; - this.seed = seed; - - WorldgenRandom chunkRandom = new WorldgenRandom(seed); - chunkRandom.consumeCount(17292); - this.noise = new SimplexNoise(chunkRandom); - - EndBiomes.mutateRegistry(biomeRegistry); - EndTags.addTerrainTags(biomeRegistry); - FeaturesHelper.addFeatures(biomeRegistry); - } - - private static List getBiomes(Registry biomeRegistry) { - List list = Lists.newArrayList(); - biomeRegistry.forEach((biome) -> { - if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { - list.add(biome); - } - }); - return list; - } - - @Override - public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { - boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); - long i = (long) biomeX * (long) biomeX; - long j = (long) biomeZ * (long) biomeZ; - - long dist = i + j; - if (hasVoid) { - if (dist <= 65536L) return this.centerBiome; - } - else if (dist <= 625L) { - dist += noise.getValue(i * 0.2, j * 0.2) * 10; - if (dist <= 625L) { - return this.centerBiome; - } - } - - if (biomeX == 0 && biomeZ == 0) { - mapLand.clearCache(); - mapVoid.clearCache(); - } - - BCLBiome endBiome = null; - if (GeneratorOptions.useNewGenerator()) { - if (TerrainGenerator.isLand(biomeX, biomeZ)) { - endBiome = (EndBiome) mapLand.getBiome(biomeX << 2, biomeZ << 2); - } - else { - if (!GeneratorOptions.noRingVoid() && dist <= 65536L) { - return barrens; - } - endBiome = mapVoid.getBiome(biomeX << 2, biomeZ << 2); - } - } - else { - float height = TheEndBiomeSource.getHeightValue(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - - if (height > -20F && height < -5F) { - return barrens; - } - - endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); - } - - return BiomeAPI.getActualBiome(endBiome); - } - - public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { - boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); - long i = (long) biomeX * (long) biomeX; - long j = (long) biomeZ * (long) biomeZ; - - long dist = i + j; - if (hasVoid) { - if (dist <= 65536L) return this.centerBiome; - } - else if (dist <= 625L) { - dist += noise.getValue(i * 0.2, j * 0.2) * 10; - if (dist <= 625L) { - return this.centerBiome; - } - } - return BiomeAPI.getActualBiome(mapLand.getBiome(biomeX << 2, biomeZ << 2)); - } - - @Override - public BiomeSource withSeed(long seed) { - return new BetterEndBiomeSource(biomeRegistry, seed); - } - - @Override - protected Codec codec() { - return CODEC; - } - - public static void register() { - Registry.register(Registry.BIOME_SOURCE, BetterEnd.makeID("better_end_biome_source"), CODEC); - } -} diff --git a/src/main/java/ru/betterend/world/generator/BiomeType.java b/src/main/java/ru/betterend/world/generator/BiomeType.java index d259cf03..d0dc037a 100644 --- a/src/main/java/ru/betterend/world/generator/BiomeType.java +++ b/src/main/java/ru/betterend/world/generator/BiomeType.java @@ -1,6 +1,5 @@ package ru.betterend.world.generator; public enum BiomeType { - LAND, - VOID; + LAND, VOID; } diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 346dd2a7..35f2a85f 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -5,17 +5,12 @@ import net.minecraft.util.Mth; import ru.betterend.config.Configs; public class GeneratorOptions { - private static int biomeSizeLand; - private static int biomeSizeVoid; private static int biomeSizeCaves; private static boolean hasPortal; private static boolean hasPillars; private static boolean hasDragonFights; - private static boolean swapOverworldToEnd; private static boolean changeChorusPlant; - private static boolean removeChorusFromVanillaBiomes; private static boolean newGenerator; - private static boolean noRingVoid; private static boolean generateCentralIsland; private static boolean generateObsidianPlatform; private static int endCityFailChance; @@ -24,31 +19,50 @@ public class GeneratorOptions { public static LayerOptions smallOptions; private static boolean changeSpawn; private static BlockPos spawn; - private static BlockPos portal = BlockPos.ZERO; private static boolean replacePortal; private static boolean replacePillars; - private static long islandDistBlock; private static int islandDistChunk; private static boolean directSpikeHeight; + private static int circleRadius = 1000; + private static int circleRadiusSqr; public static void init() { - biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); - biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); biomeSizeCaves = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeCaves", 32); hasPortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "hasPortal", true); hasPillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "hasSpikes", true); hasDragonFights = Configs.GENERATOR_CONFIG.getBooleanRoot("hasDragonFights", true); - swapOverworldToEnd = Configs.GENERATOR_CONFIG.getBooleanRoot("swapOverworldToEnd", false); changeChorusPlant = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "changeChorusPlant", true); - removeChorusFromVanillaBiomes = Configs.GENERATOR_CONFIG.getBoolean("chorusPlant", "removeChorusFromVanillaBiomes", true); newGenerator = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "useNewGenerator", true); - noRingVoid = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "noRingVoid", false); generateCentralIsland = Configs.GENERATOR_CONFIG.getBoolean("customGenerator", "generateCentralIsland", true); endCityFailChance = Configs.GENERATOR_CONFIG.getInt("customGenerator", "endCityFailChance", 5); generateObsidianPlatform = Configs.GENERATOR_CONFIG.getBooleanRoot("generateObsidianPlatform", true); - bigOptions = new LayerOptions("customGenerator.layers.bigIslands", Configs.GENERATOR_CONFIG, 300, 200, 70, 10, false); - mediumOptions = new LayerOptions("customGenerator.layers.mediumIslands", Configs.GENERATOR_CONFIG, 150, 100, 70, 20, true); - smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); + bigOptions = new LayerOptions( + "customGenerator.layers.bigIslands", + Configs.GENERATOR_CONFIG, + 300, + 200, + 70, + 10, + false + ); + mediumOptions = new LayerOptions( + "customGenerator.layers.mediumIslands", + Configs.GENERATOR_CONFIG, + 150, + 100, + 70, + 20, + true + ); + smallOptions = new LayerOptions( + "customGenerator.layers.smallIslands", + Configs.GENERATOR_CONFIG, + 60, + 50, + 70, + 30, + false + ); changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); spawn = new BlockPos( Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), @@ -57,23 +71,15 @@ public class GeneratorOptions { ); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); - int circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); - islandDistBlock = (long) circleRadius * (long) circleRadius; + circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); + circleRadiusSqr = circleRadius * circleRadius; islandDistChunk = (circleRadius >> 3); // Twice bigger than normal } - - public static int getBiomeSizeLand() { - return Mth.clamp(biomeSizeLand, 1, 8192); - } - - public static int getBiomeSizeVoid() { - return Mth.clamp(biomeSizeVoid, 1, 8192); - } public static int getBiomeSizeCaves() { return Mth.clamp(biomeSizeCaves, 1, 8192); } - + public static boolean hasPortal() { return hasPortal; } @@ -86,21 +92,9 @@ public class GeneratorOptions { return hasDragonFights; } - public static boolean swapOverworldToEnd() { - return swapOverworldToEnd; - } - public static boolean changeChorusPlant() { return changeChorusPlant; } - - public static boolean removeChorusFromVanillaBiomes() { - return removeChorusFromVanillaBiomes; - } - - public static boolean noRingVoid() { - return noRingVoid; - } public static boolean useNewGenerator() { return newGenerator; @@ -117,22 +111,14 @@ public class GeneratorOptions { public static int getEndCityFailChance() { return endCityFailChance; } - + public static boolean changeSpawn() { return changeSpawn; } - + public static BlockPos getSpawn() { return spawn; } - - public static BlockPos getPortalPos() { - return portal; - } - - public static void setPortalPos(BlockPos portal) { - GeneratorOptions.portal = portal; - } public static boolean replacePortal() { return replacePortal; @@ -141,11 +127,15 @@ public class GeneratorOptions { public static boolean replacePillars() { return replacePillars; } - - public static long getIslandDistBlock() { - return islandDistBlock; + + public static int getIslandDistBlock() { + return circleRadius; } - + + public static int getIslandDistBlockSqr() { + return circleRadiusSqr; + } + public static int getIslandDistChunk() { return islandDistChunk; } diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index d7858317..94e7fcb1 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -1,12 +1,6 @@ package ru.betterend.world.generator; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRadialNoiseMap; @@ -17,6 +11,11 @@ import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + public class IslandLayer { private static final Random RANDOM = new Random(); private final SDFRadialNoiseMap noise; @@ -66,7 +65,7 @@ public class IslandLayer { for (int poz = -1; poz < 2; poz++) { int pz = poz + iz; long pz2 = pz; - if (GeneratorOptions.noRingVoid() || px2 * px2 + pz2 * pz2 > options.centerDist) { + if (px2 * px2 + pz2 * pz2 > options.centerDist) { RANDOM.setSeed(getSeed(px, pz)); double posX = (px + RANDOM.nextFloat()) * options.distance; double posY = MHelper.randRange(options.minY, options.maxY, RANDOM); @@ -79,12 +78,13 @@ public class IslandLayer { } } - if (GeneratorOptions.hasCentralIsland() && Math.abs(ix) < GeneratorOptions.getIslandDistChunk() && Math.abs(iz) < GeneratorOptions.getIslandDistChunk()) { + if (GeneratorOptions.hasCentralIsland() && Math.abs(ix) < GeneratorOptions.getIslandDistChunk() && Math.abs(iz) < GeneratorOptions + .getIslandDistChunk()) { int count = positions.size(); for (int n = 0; n < count; n++) { BlockPos pos = positions.get(n); long d = (long) pos.getX() * (long) pos.getX() + (long) pos.getZ() * (long) pos.getZ(); - if (d < GeneratorOptions.getIslandDistBlock()) { + if (d < GeneratorOptions.getIslandDistBlockSqr()) { positions.remove(n); count--; n--; @@ -121,7 +121,7 @@ public class IslandLayer { private float calculateSDF(double x, double y, double z) { float distance = 10; - for (BlockPos pos: positions) { + for (BlockPos pos : positions) { SDF island = getIsland(pos); float dist = getRelativeDistance(island, pos, x, y, z); distance = MHelper.min(distance, dist); diff --git a/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java b/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java new file mode 100644 index 00000000..1d3f9362 --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java @@ -0,0 +1,21 @@ +package ru.betterend.world.generator; + +public class TerrainBoolCache { + private byte[] data = new byte[16384]; + + public static int scaleCoordinate(int value) { + return value >> 7; + } + + private int getIndex(int x, int z) { + return x << 7 | z; + } + + public void setData(int x, int z, byte value) { + data[getIndex(x & 127, z & 127)] = value; + } + + public byte getData(int x, int z) { + return data[getIndex(x & 127, z & 127)]; + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 1214b56b..afe82b9c 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,20 +1,25 @@ package ru.betterend.world.generator; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.util.MHelper; +import ru.bclib.world.biomes.BCLBiome; +import ru.betterend.noise.OpenSimplexNoise; + import java.awt.Point; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; -import com.google.common.collect.Lists; - -import net.minecraft.util.Mth; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import ru.bclib.util.MHelper; -import ru.betterend.noise.OpenSimplexNoise; - public class TerrainGenerator { + private static final Map TERRAIN_BOOL_CACHE_MAP = Maps.newHashMap(); private static final ReentrantLock LOCKER = new ReentrantLock(); + private static final Point POS = new Point(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; private static final float[] COEF; @@ -25,40 +30,49 @@ public class TerrainGenerator { private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; + private static BiomeSource biomeSource; + private static Sampler sampler; - /*public static boolean canGenerate(int x, int z) { - return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; - }*/ - - public static void initNoise(long seed) { + public static void initNoise(long seed, BiomeSource biomeSource, Sampler sampler) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions); smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); + TERRAIN_BOOL_CACHE_MAP.clear(); + TerrainGenerator.biomeSource = biomeSource; + TerrainGenerator.sampler = sampler; } - public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { + public static void fillTerrainDensity(double[] buffer, int posX, int posZ, int scaleXZ, int scaleY) { LOCKER.lock(); largeIslands.clearCache(); mediumIslands.clearCache(); smallIslands.clearCache(); - double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; - double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; - double px = (double) x * SCALE_XZ + distortion1; - double pz = (double) z * SCALE_XZ + distortion2; + int x = Mth.floor(posX / scaleXZ); + int z = Mth.floor(posZ / scaleXZ); + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval( + x * 0.2, + z * 0.2 + ) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; + double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval( + x * 0.2, + z * 0.2 + ) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; + double px = (double) x * scaleXZ + distortion1; + double pz = (double) z * scaleXZ + distortion2; largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; + float height = getAverageDepth(x << 1, z << 1) * 0.5F; for (int y = 0; y < buffer.length; y++) { - double py = (double) y * SCALE_Y; + double py = (double) y * scaleY; float dist = largeIslands.getDensity(px, py, pz, height); dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height)); @@ -67,110 +81,33 @@ public class TerrainGenerator { dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } + if (py > 100) { + dist = (float) Mth.lerp((py - 100) / 27F, dist, -1); + } buffer[y] = dist; } LOCKER.unlock(); } - private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { - if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { + private static float getAverageDepth(int x, int z) { + if (biomeSource == null) { + return 0; + } + if (getBiome(biomeSource, x, z).getTerrainHeight() < 0.1F) { return 0F; } float depth = 0F; for (int i = 0; i < OFFS.length; i++) { int px = x + OFFS[i].x; int pz = z + OFFS[i].y; - depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i]; + depth += getBiome(biomeSource, px, pz).getTerrainHeight() * COEF[i]; } return depth; } - private static Biome getBiome(BiomeSource biomeSource, int x, int z) { - if (biomeSource instanceof BetterEndBiomeSource) { - return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); - } - return biomeSource.getNoiseBiome(x, 0, z); - } - - /** - * Check if this is land - * @param x - biome pos x - * @param z - biome pos z - */ - public static boolean isLand(int x, int z) { - LOCKER.lock(); - - double px = (x >> 1) + 0.5; - double pz = (z >> 1) + 0.5; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; - px = px * SCALE_XZ + distortion1; - pz = pz * SCALE_XZ + distortion2; - - largeIslands.updatePositions(px, pz); - mediumIslands.updatePositions(px, pz); - smallIslands.updatePositions(px, pz); - - for (int y = 0; y < 32; y++) { - double py = (double) y * SCALE_Y; - float dist = largeIslands.getDensity(px, py, pz); - dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); - dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); - if (dist > -0.5F) { - dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; - dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; - dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; - } - if (dist > -0.01) { - LOCKER.unlock(); - return true; - } - } - - LOCKER.unlock(); - return false; - } - - /** - * Get something like height - * @param x - block pos x - * @param z - block pos z - */ - public static int getHeight(int x, int z) { - LOCKER.lock(); - - double px = (double) x / 8.0; - double pz = (double) z / 8.0; - - double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; - double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; - px = (double) x * SCALE_XZ + distortion1; - pz = (double) z * SCALE_XZ + distortion2; - - largeIslands.updatePositions(px, pz); - mediumIslands.updatePositions(px, pz); - smallIslands.updatePositions(px, pz); - - for (int y = 32; y >= 0; y--) { - double py = (double) y * SCALE_Y; - float dist = largeIslands.getDensity(px, py, pz); - dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); - dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); - if (dist > -0.5F) { - dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; - dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; - dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; - } - if (dist > 0) { - LOCKER.unlock(); - return Mth.floor(Mth.clamp(y + dist, y, y + 1) * SCALE_Y); - } - } - - LOCKER.unlock(); - return 0; + private static BCLBiome getBiome(BiomeSource biomeSource, int x, int z) { + return BiomeAPI.getBiome(biomeSource.getNoiseBiome(x, 0, z, sampler)); } static { @@ -193,4 +130,66 @@ public class TerrainGenerator { COEF[i] = coef.get(i) / sum; } } + + public static Boolean isLand(int x, int z) { + int sectionX = TerrainBoolCache.scaleCoordinate(x); + int sectionZ = TerrainBoolCache.scaleCoordinate(z); + + LOCKER.lock(); + POS.setLocation(sectionX, sectionZ); + + TerrainBoolCache section = TERRAIN_BOOL_CACHE_MAP.get(POS); + if (section == null) { + if (TERRAIN_BOOL_CACHE_MAP.size() > 64) { + TERRAIN_BOOL_CACHE_MAP.clear(); + } + section = new TerrainBoolCache(); + TERRAIN_BOOL_CACHE_MAP.put(new Point(POS.x, POS.y), section); + } + byte value = section.getData(x, z); + if (value > 0) { + LOCKER.unlock(); + return value > 1; + } + + double px = (x >> 1) + 0.5; + double pz = (z >> 1) + 0.5; + + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval( + px * 0.4, + pz * 0.4 + ) * 5; + double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval( + px * 0.4, + pz * 0.4 + ) * 5; + px = px * SCALE_XZ + distortion1; + pz = pz * SCALE_XZ + distortion2; + + largeIslands.updatePositions(px, pz); + mediumIslands.updatePositions(px, pz); + smallIslands.updatePositions(px, pz); + + boolean result = false; + for (int y = 0; y < 32; y++) { + double py = (double) y * SCALE_Y; + float dist = largeIslands.getDensity(px, py, pz); + dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz)); + dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz)); + if (dist > -0.5F) { + dist += noise1.eval(px * 0.01, py * 0.01, pz * 0.01) * 0.02 + 0.02; + dist += noise2.eval(px * 0.05, py * 0.05, pz * 0.05) * 0.01 + 0.01; + dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; + } + if (dist > -0.01) { + result = true; + break; + } + } + + section.setData(x, z, (byte) (result ? 2 : 1)); + LOCKER.unlock(); + + return result; + } } diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java deleted file mode 100644 index 396fc2a1..00000000 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.betterend.world.structures; - -import java.util.Random; - -import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.betterend.BetterEnd; - -public class EndStructureFeature { - private static final Random RANDOM = new Random(354); - private final StructureFeature structure; - private final ConfiguredStructureFeature featureConfigured; - private final GenerationStep.Decoration featureStep; - - public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { - ResourceLocation id = BetterEnd.makeID(name); - - this.featureStep = step; - this.structure = FabricStructureBuilder.create(id, structure) - .step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .register(); - - this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); - - BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); - } - - public StructureFeature getStructure() { - return structure; - } - - public ConfiguredStructureFeature getFeatureConfigured() { - return featureConfigured; - } - - public GenerationStep.Decoration getFeatureStep() { - return featureStep; - } -} diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index f67a71d4..54cf4d2e 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -1,62 +1,73 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.WorldgenRandom; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; +import ru.bclib.world.structures.BCLStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.piece.NBTPiece; +import java.util.Random; + public class EternalPortalStructure extends FeatureBaseStructure { private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - - @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { + + public EternalPortalStructure() { + super(PieceGeneratorSupplier.simple( + EternalPortalStructure::checkLocation, + EternalPortalStructure::generatePieces) + ); + } + + protected static boolean checkLocation(PieceGeneratorSupplier.Context context) { + if (!BCLStructureFeature.isValidBiome(context)) return false; + + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + long x = (long) chunkPos.x * (long) chunkPos.x; long z = (long) chunkPos.z * (long) chunkPos.z; if (x + z < 1024L) { return false; } - if (chunkGenerator.getBaseHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Types.WORLD_SURFACE_WG) < 10) { + if (chunkGenerator.getBaseHeight( + chunkPos.getBlockX(8), + chunkPos.getBlockZ(8), + Heightmap.Types.WORLD_SURFACE_WG, + levelHeightAccessor + ) < 5) { return false; } - return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); + return FeatureBaseStructure.checkLocation(context); } - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return PortalStructureStart::new; - } - - public static class PortalStructureStart extends StructureStart { - public PortalStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); - if (y > 4) { - this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); - } - this.calculateBoundingBox(); - } + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + int x = chunkPos.getBlockX(8); + int z = chunkPos.getBlockZ(8); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + structurePiecesBuilder.addPiece(new NBTPiece( + STRUCTURE_ID, + STRUCTURE, + new BlockPos(x, y - 4, z), + random.nextInt(5), + true, + random + )); } } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 219ec6f5..e40adc52 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -1,51 +1,57 @@ package ru.betterend.world.structures.features; -import java.util.Random; - import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import ru.bclib.world.structures.BCLStructureFeature; + +import java.util.Random; public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); - public FeatureBaseStructure() { - super(NoneFeatureConfiguration.CODEC); - } - - @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { - return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 20; + public FeatureBaseStructure(PieceGeneratorSupplier pieceGeneratorSupplier) { + super(NoneFeatureConfiguration.CODEC, pieceGeneratorSupplier); } - private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { - Random random = new Random((long) (chunkX + chunkZ * 10387313)); + protected static boolean checkLocation(PieceGeneratorSupplier.Context context) { + return getGenerationHeight(context.chunkPos(), context.chunkGenerator(), context.heightAccessor()) >= 20 && BCLStructureFeature.isValidBiome(context); + } + + private static int getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { + Random random = new Random((long) (chunkPos.x + chunkPos.z * 10387313)); Rotation blockRotation = Rotation.getRandom(random); int i = 5; int j = 5; if (blockRotation == Rotation.CLOCKWISE_90) { i = -5; - } else if (blockRotation == Rotation.CLOCKWISE_180) { + } + else if (blockRotation == Rotation.CLOCKWISE_180) { i = -5; j = -5; - } else if (blockRotation == Rotation.COUNTERCLOCKWISE_90) { + } + else if (blockRotation == Rotation.COUNTERCLOCKWISE_90) { j = -5; } - - int k = (chunkX << 4) + 7; - int l = (chunkZ << 4) + 7; - int m = chunkGenerator.getFirstOccupiedHeight(k, l, Heightmap.Types.WORLD_SURFACE_WG); - int n = chunkGenerator.getFirstOccupiedHeight(k, l + j, Heightmap.Types.WORLD_SURFACE_WG); - int o = chunkGenerator.getFirstOccupiedHeight(k + i, l, Heightmap.Types.WORLD_SURFACE_WG); - int p = chunkGenerator.getFirstOccupiedHeight(k + i, l + j, Heightmap.Types.WORLD_SURFACE_WG); + + int k = chunkPos.getBlockX(7); + int l = chunkPos.getBlockZ(7); + int m = chunkGenerator.getFirstOccupiedHeight(k, l, Heightmap.Types.WORLD_SURFACE_WG, levelHeightAccessor); + int n = chunkGenerator.getFirstOccupiedHeight(k, l + j, Heightmap.Types.WORLD_SURFACE_WG, levelHeightAccessor); + int o = chunkGenerator.getFirstOccupiedHeight(k + i, l, Heightmap.Types.WORLD_SURFACE_WG, levelHeightAccessor); + int p = chunkGenerator.getFirstOccupiedHeight( + k + i, + l + j, + Heightmap.Types.WORLD_SURFACE_WG, + levelHeightAccessor + ); return Math.min(Math.min(m, n), Math.min(o, p)); } } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index b60dac4a..737ec6f4 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -1,21 +1,14 @@ package ru.betterend.world.structures.features; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; import ru.bclib.sdf.operator.SDFTranslate; @@ -25,21 +18,31 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.world.structures.piece.VoxelPiece; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class GiantIceStarStructure extends SDFStructureFeature { - private final float minSize = 20; - private final float maxSize = 35; - private final int minCount = 25; - private final int maxCount = 40; - - @Override - protected SDF getSDF(BlockPos pos, Random random) { + private static final float minSize = 20; + private static final float maxSize = 35; + private static final int minCount = 25; + private static final int maxCount = 40; + + public GiantIceStarStructure() { + super(GiantIceStarStructure::generatePieces); + } + + protected static SDF getSDF(BlockPos pos, Random random) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); SDF sdf = null; - SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F).setRadius2(0).setHeight(size).setBlock(EndBlocks.DENSE_SNOW); + SDF spike = new SDFCappedCone().setRadius1(3 + (size - 5) * 0.2F) + .setRadius2(0) + .setHeight(size) + .setBlock(EndBlocks.DENSE_SNOW); spike = new SDFTranslate().setTranslate(0, size - 0.5F, 0).setSource(spike); - for (Vector3f point: points) { + for (Vector3f point : points) { SDF rotated = spike; point = MHelper.normalize(point); float angle = MHelper.angle(Vector3f.YP, point); @@ -69,7 +72,11 @@ public class GiantIceStarStructure extends SDFStructureFeature { float px = bpos.getX() - center.getX(); float py = bpos.getY() - center.getY(); float pz = bpos.getZ() - center.getZ(); - float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance(px, py, pz) * 0.4F + random.nextFloat() * randScale; + float distance = MHelper.length(px, py, pz) + sdfCopy.getDistance( + px, + py, + pz + ) * 0.4F + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; } @@ -83,7 +90,7 @@ public class GiantIceStarStructure extends SDFStructureFeature { }); } - private List getFibonacciPoints(int count) { + private static List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); for (int i = 0; i < count; i++) { @@ -96,25 +103,21 @@ public class GiantIceStarStructure extends SDFStructureFeature { } return result; } - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return StarStructureStart::new; - } - - public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } + + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); - this.pieces.add(piece); - this.calculateBoundingBox(); - } + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); + VoxelPiece piece = new VoxelPiece((world) -> { + getSDF(start, random).fillRecursive(world, start); + }, random.nextInt()); + structurePiecesBuilder.addPiece(piece); + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index e24626db..691558b1 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -1,12 +1,11 @@ package ru.betterend.world.structures.features; -import java.util.List; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFBinary; import ru.bclib.sdf.operator.SDFCoordModify; @@ -29,13 +28,24 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; + public class GiantMossyGlowshroomStructure extends SDFStructureFeature { - @Override - protected SDF getSDF(BlockPos center, Random random) { + public GiantMossyGlowshroomStructure() { + super(GiantMossyGlowshroomStructure::generatePieces); + } + + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + SDFStructureFeature.generatePieces(structurePiecesBuilder, context, GiantMossyGlowshroomStructure::getSDF); + } + + protected static SDF getSDF(BlockPos center, Random random) { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); - SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0).setSource(new SDFScale().setScale(2).setSource(cone2)); + SDF posedCone3 = new SDFTranslate().setTranslate(0, 12F, 0) + .setSource(new SDFScale().setScale(2).setSource(cone2)); SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); @@ -54,30 +64,35 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { float dist = MHelper.length(pos.x(), pos.z()); - float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + center.getX(), pos.z() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; + float y = pos.y() + (float) noise.eval( + pos.x() * 0.1 + center.getX(), + pos.z() * 0.1 + center.getZ() + ) * dist * 0.3F - dist * 0.15F; pos.set(pos.x(), y, pos.z()); }).setSource(cones); - SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); + SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0) + .setSource(cones)); SDF roots = new SDFSphere().setRadius(4F); SDFPrimitive primRoots = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); SDFFlatWave rotRoots = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - SDFBinary function = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); + SDFBinary function = new SDFSmoothUnion().setRadius(4) + .setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); cone1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); cone2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); priGlowCone.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); - primRoots.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); + primRoots.setBlock(EndBlocks.MOSSY_GLOWSHROOM.getBark()); float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); SplineHelper.offsetParts(spline, random, 1F, 0, 1F); SDF sdf = SplineHelper.buildSDF(spline, 2.1F, 1.5F, (pos) -> { - return EndBlocks.MOSSY_GLOWSHROOM.log.defaultBlockState(); + return EndBlocks.MOSSY_GLOWSHROOM.getLog().defaultBlockState(); }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(2F, 3.5F, random); @@ -86,41 +101,58 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { rotRoots.setAngle(random.nextFloat() * MHelper.PI2); function.setSourceA(sdf); - return new SDFRound().setRadius(1.5F).setSource(new SDFScale() - .setScale(scale) - .setSource(function)) - .addPostProcess((info) -> { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { - if (random.nextBoolean() && info.getStateUp().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); - return info.getState(); - } - else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM.bark.defaultBlockState()); - return info.getState(); - } - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { - if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); - return info.getState(); - } - - info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); - return info.getState(); - } - else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir: BlocksHelper.HORIZONTAL) { - if (info.getState(dir) == AIR) { - info.setBlockPos(info.getPos().relative(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); - } - } - - if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.DOWN)); - } - } - return info.getState(); - }); + return new SDFRound().setRadius(1.5F) + .setSource(new SDFScale().setScale(scale).setSource(function)) + .addPostProcess((info) -> { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getState())) { + if (random.nextBoolean() && info.getStateUp() + .getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .setValue( + MossyGlowshroomCapBlock.TRANSITION, + true + )); + return info.getState(); + } + else if (!EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateUp()) || !EndBlocks.MOSSY_GLOWSHROOM + .isTreeLog(info.getStateDown())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM.getBark().defaultBlockState()); + return info.getState(); + } + } + else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_CAP) { + if (EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(info.getStateDown().getBlock())) { + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState() + .setValue( + MossyGlowshroomCapBlock.TRANSITION, + true + )); + return info.getState(); + } + + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); + return info.getState(); + } + else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (info.getState(dir) == AIR) { + info.setBlockPos( + info.getPos().relative(dir), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() + .setValue(FurBlock.FACING, dir) + ); + } + } + + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { + info.setBlockPos( + info.getPos().below(), + EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState() + .setValue(FurBlock.FACING, Direction.DOWN) + ); + } + } + return info.getState(); + }); } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index d4397767..5db2baca 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -1,41 +1,47 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; +import java.util.Random; + public class MegaLakeSmallStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + public MegaLakeSmallStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MegaLakeSmallStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); + if (y > 5) { + float radius = MHelper.randRange(20, 40, random); + float depth = MHelper.randRange(5, 10, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + structurePiecesBuilder.addPiece(piece); } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); - if (y > 5) { - float radius = MHelper.randRange(20, 40, random); - float depth = MHelper.randRange(5, 10, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.pieces.add(piece); - } - this.calculateBoundingBox(); - } + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index 2d554d4c..c26342a3 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -1,41 +1,50 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; +import java.util.Random; + public class MegaLakeStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + + + public MegaLakeStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MegaLakeStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + + if (y > 5) { + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); + + float radius = MHelper.randRange(32, 64, random); + float depth = MHelper.randRange(7, 15, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + structurePiecesBuilder.addPiece(piece); } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); - if (y > 5) { - float radius = MHelper.randRange(32, 64, random); - float depth = MHelper.randRange(7, 15, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.pieces.add(piece); - } - this.calculateBoundingBox(); - } + //this.calculateBoundingBox(); } + } diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index a968c7d1..34359e0f 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -1,41 +1,53 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.CrystalMountainPiece; +import java.util.Random; + public class MountainStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + + public MountainStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MountainStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + if (y > 5) { + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); + float radius = MHelper.randRange(50, 100, random); + float height = radius * MHelper.randRange(0.8F, 1.2F, random); + CrystalMountainPiece piece = new CrystalMountainPiece( + new BlockPos(x, y, z), + radius, + height, + random, + biome + ); + structurePiecesBuilder.addPiece(piece); } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); - if (y > 5) { - float radius = MHelper.randRange(50, 100, random); - float height = radius * MHelper.randRange(0.8F, 1.2F, random); - CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); - this.pieces.add(piece); - } - this.calculateBoundingBox(); - } + //this.calculateBoundingBox(); } } + diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index cbb6735a..3b58fbb9 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -1,40 +1,44 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.world.structures.piece.PaintedMountainPiece; +import java.util.Random; + public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; - } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); - } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public PaintedMountainStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + PaintedMountainStructure::generatePieces + )); + } + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 50) { + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random); int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1); @@ -42,17 +46,18 @@ public class PaintedMountainStructure extends FeatureBaseStructure { for (int i = 0; i < count; i++) { slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; } - this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); + structurePiecesBuilder.addPiece(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } - } + static { VARIANTS = new BlockState[] { - Blocks.END_STONE.defaultBlockState(), - EndBlocks.FLAVOLITE.stone.defaultBlockState(), - EndBlocks.VIOLECITE.stone.defaultBlockState(), + Blocks.END_STONE.defaultBlockState(), + EndBlocks.FLAVOLITE.stone.defaultBlockState(), + EndBlocks.VIOLECITE.stone.defaultBlockState(), }; } } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 40e28a3c..81af3526 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -1,46 +1,46 @@ package ru.betterend.world.structures.features; -import java.util.Random; - import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.VoxelPiece; +import java.util.Random; +import java.util.function.BiFunction; + public abstract class SDFStructureFeature extends FeatureBaseStructure { - - protected abstract SDF getSDF(BlockPos pos, Random random); - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + public SDFStructureFeature(PieceGenerator generator) { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + generator + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context, BiFunction sdf) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + if (y > 5) { + BlockPos start = new BlockPos(x, y, z); + VoxelPiece piece = new VoxelPiece((world) -> { + sdf.apply(start, random).fillRecursive(world, start); + }, random.nextInt()); + + structurePiecesBuilder.addPiece(piece); } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); - if (y > 5) { - BlockPos start = new BlockPos(x, y, z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); - this.pieces.add(piece); - } - this.calculateBoundingBox(); - } + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index b5ce64f8..9122c8fa 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -2,17 +2,26 @@ package ru.betterend.world.structures.piece; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; public abstract class BasePiece extends StructurePiece { - protected BasePiece(StructurePieceType type, int i) { - super(type, i); + protected BasePiece(StructurePieceType type, int i, BoundingBox boundingBox) { + super(type, i, boundingBox); } - + protected BasePiece(StructurePieceType type, CompoundTag tag) { super(type, tag); fromNbt(tag); } protected abstract void fromNbt(CompoundTag tag); + + protected void addAdditionalSaveData(CompoundTag tag) {} + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext structurePieceSerializationContext, CompoundTag compoundTag) { + addAdditionalSaveData(compoundTag); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index a964e0e7..bd9ecbbf 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -12,39 +10,42 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class CavePiece extends BasePiece { private OpenSimplexNoise noise; private BlockPos center; private float radius; public CavePiece(BlockPos center, float radius, int id) { - super(EndStructures.CAVE_PIECE, id); + super(EndStructures.CAVE_PIECE, id, null); this.center = center; this.radius = radius; this.noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); makeBoundingBox(); } - - public CavePiece(StructureManager manager, CompoundTag tag) { + + public CavePiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } - + + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int x1 = MHelper.max(this.boundingBox.x0, blockBox.x0); - int z1 = MHelper.max(this.boundingBox.z0, blockBox.z0); - int x2 = MHelper.min(this.boundingBox.x1, blockBox.x1); - int z2 = MHelper.min(this.boundingBox.z1, blockBox.z1); - int y1 = this.boundingBox.y0; - int y2 = this.boundingBox.y1; + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int x1 = MHelper.max(this.boundingBox.minX(), blockBox.minX()); + int z1 = MHelper.max(this.boundingBox.minZ(), blockBox.minZ()); + int x2 = MHelper.min(this.boundingBox.maxX(), blockBox.maxX()); + int z2 = MHelper.min(this.boundingBox.maxZ(), blockBox.maxZ()); + int y1 = this.boundingBox.minY(); + int y2 = this.boundingBox.maxY(); double hr = radius * 0.75; double nr = radius * 0.25; @@ -66,7 +67,7 @@ public class CavePiece extends BasePiece { double r2 = r - 4.5; double dist = xsq + ysq + zsq; if (dist < r2 * r2) { - if (world.getBlockState(pos).is(TagAPI.END_GROUND)) { + if (world.getBlockState(pos).is(TagAPI.BLOCK_END_GROUND)) { BlocksHelper.setWithoutUpdate(world, pos, CAVE_AIR); } } @@ -79,15 +80,15 @@ public class CavePiece extends BasePiece { } } - return true; + return; } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } - + @Override protected void fromNbt(CompoundTag tag) { center = NbtUtils.readBlockPos(tag.getCompound("center")); diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index e7a77628..60acae3b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -17,33 +15,36 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; -import ru.bclib.api.BiomeAPI; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; public class CrystalMountainPiece extends MountainPiece { private BlockState top; public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); - top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + top = EndBiome.findTopMaterial(biome); //biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - - public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, manager, tag); + + public CrystalMountainPiece(StructurePieceSerializationContext type, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, tag); } - + @Override protected void fromNbt(CompoundTag tag) { super.fromNbt(tag); - top = BiomeAPI.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + top = EndBiome.findTopMaterial(BiomeAPI.getBiome(biomeID)); //BiomeAPI.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getMinBlockX(); int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); @@ -68,7 +69,8 @@ public class CrystalMountainPiece extends MountainPiece { continue; } pos.setY(minY); - while (!chunk.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState(pos.below()).is(Blocks.CAVE_AIR)) { + while (!chunk.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN) && pos.getY() > 56 && !chunk.getBlockState( + pos.below()).is(Blocks.CAVE_AIR)) { pos.setY(pos.getY() - 1); } minY = pos.getY(); @@ -81,10 +83,18 @@ public class CrystalMountainPiece extends MountainPiece { maxY += center.getY(); int maxYI = (int) (maxY); int cover = maxYI - 1; - boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange(-0.4, 0.4, random) - (center.getY() + 14) * 0.1) > 0; + boolean needCover = (noise1.eval(px * 0.1, pz * 0.1) + MHelper.randRange( + -0.4, + 0.4, + random + ) - (center.getY() + 14) * 0.1) > 0; for (int y = minY - 1; y < maxYI; y++) { pos.setY(y); - chunk.setBlockState(pos, needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), false); + chunk.setBlockState( + pos, + needCover && y == cover ? top : Blocks.END_STONE.defaultBlockState(), + false + ); } } } @@ -129,8 +139,6 @@ public class CrystalMountainPiece extends MountainPiece { } } } - - return true; } private void crystal(ChunkAccess chunk, BlockPos pos, int radius, int height, float fill, Random random) { diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index b304d42e..4a582e27 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -1,13 +1,10 @@ package ru.betterend.world.structures.piece; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; @@ -22,15 +19,19 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.level.material.FluidState; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; + +import java.util.Map; +import java.util.Random; public class LakePiece extends BasePiece { private static final BlockState ENDSTONE = Blocks.END_STONE.defaultBlockState(); @@ -46,7 +47,7 @@ public class LakePiece extends BasePiece { private ResourceLocation biomeID; public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { - super(EndStructures.LAKE_PIECE, random.nextInt()); + super(EndStructures.LAKE_PIECE, random.nextInt(), null); this.center = center; this.radius = radius; this.depth = depth; @@ -56,12 +57,12 @@ public class LakePiece extends BasePiece { this.biomeID = BiomeAPI.getBiomeID(biome); makeBoundingBox(); } - - public LakePiece(StructureManager manager, CompoundTag tag) { + + public LakePiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.LAKE_PIECE, tag); makeBoundingBox(); } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); @@ -70,7 +71,7 @@ public class LakePiece extends BasePiece { tag.putInt("seed", seed); tag.putString("biome", biomeID.toString()); } - + @Override protected void fromNbt(CompoundTag tag) { center = NbtUtils.readBlockPos(tag.getCompound("center")); @@ -81,13 +82,13 @@ public class LakePiece extends BasePiece { aspect = radius / depth; biomeID = new ResourceLocation(tag.getString("biome")); } - + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; - int sx = chunkPos.x << 4; - int sz = chunkPos.z << 4; + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); + int sx = SectionPos.sectionToBlockCoord(chunkPos.x); + int sz = SectionPos.sectionToBlockCoord(chunkPos.z); MutableBlockPos mut = new MutableBlockPos(); ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { @@ -107,7 +108,7 @@ public class LakePiece extends BasePiece { double x3 = MHelper.sqr(x2 + noise.eval(nx, nz, 100) * 10); double z3 = MHelper.sqr(z2 + noise.eval(nx, nz, -100) * 10); - for (int y = minY; y <= maxY; y++) { + for (int y = maxY; y >= minY; y--) { mut.setY((int) (y + n)); double y2 = MHelper.sqr((y - center.getY()) * aspect); double r2 = radius * clamp; @@ -117,7 +118,7 @@ public class LakePiece extends BasePiece { double dist = x3 + y2 + z3; if (dist < r2) { BlockState state = chunk.getBlockState(mut); - if (state.is(TagAPI.GEN_TERRAIN) || state.isAir()) { + if (state.is(TagAPI.BLOCK_GEN_TERRAIN) || state.isAir()) { state = mut.getY() < center.getY() ? WATER : CAVE_AIR; chunk.setBlockState(mut, state, false); } @@ -125,10 +126,13 @@ public class LakePiece extends BasePiece { else if (dist <= r3 && mut.getY() < center.getY()) { BlockState state = chunk.getBlockState(mut); BlockPos worldPos = mut.offset(sx, 0, sz); - if (!state.isCollisionShapeFullBlock(world, worldPos) && !state.isRedstoneConductor(world, worldPos)) { + if (!state.isCollisionShapeFullBlock(world, worldPos) && !state.isRedstoneConductor( + world, + worldPos + )) { state = chunk.getBlockState(mut.above()); if (state.isAir()) { - state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + state = random.nextBoolean() ? ENDSTONE : EndBiome.findTopMaterial(world, worldPos); } else { state = state.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); @@ -140,12 +144,11 @@ public class LakePiece extends BasePiece { } } fixWater(world, chunk, mut, random, sx, sz); - return true; } private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); for (int x = 0; x < 16; x++) { mut.setX(x); for (int z = 0; z < 16; z++) { @@ -160,7 +163,7 @@ public class LakePiece extends BasePiece { BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + bState = random.nextBoolean() ? ENDSTONE : EndBiome.findTopMaterial(world, mut.offset(sx, 0, sz)); } else { bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); @@ -172,13 +175,13 @@ public class LakePiece extends BasePiece { } else if (x > 1 && x < 15 && z > 1 && z < 15) { mut.setY(y); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos wPos = mut.offset(dir.getStepX(), 0, dir.getStepZ()); if (chunk.getBlockState(wPos).isAir()) { mut.setY(y + 1); BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + bState = random.nextBoolean() ? ENDSTONE : EndBiome.findTopMaterial(world, mut.offset(sx, 0, sz)); } else { bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); @@ -190,9 +193,12 @@ public class LakePiece extends BasePiece { } } else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { - chunk.getLiquidTicks().scheduleTick(mut.move(Direction.DOWN), state.getType(), 0); + chunk.markPosForPostprocessing(mut.move(Direction.DOWN).immutable()); } } + else if (chunk.getBlockState(mut).isRandomlyTicking()) { + chunk.markPosForPostprocessing(mut.immutable()); + } } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index bc2ef668..896f7099 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -1,10 +1,6 @@ package ru.betterend.world.structures.piece; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -16,11 +12,13 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructurePieceType; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Map; +import java.util.Random; + public abstract class MountainPiece extends BasePiece { protected Map heightmap = Maps.newHashMap(); protected OpenSimplexNoise noise1; @@ -34,7 +32,7 @@ public abstract class MountainPiece extends BasePiece { protected int seed2; public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { - super(type, random.nextInt()); + super(type, random.nextInt(), null); this.center = center; this.radius = radius; this.height = height; @@ -46,12 +44,12 @@ public abstract class MountainPiece extends BasePiece { this.biomeID = BiomeAPI.getBiomeID(biome); makeBoundingBox(); } - - public MountainPiece(StructurePieceType type, StructureManager manager, CompoundTag tag) { + + public MountainPiece(StructurePieceType type, CompoundTag tag) { super(type, tag); makeBoundingBox(); } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); @@ -61,7 +59,7 @@ public abstract class MountainPiece extends BasePiece { tag.putInt("seed1", seed1); tag.putInt("seed2", seed2); } - + @Override protected void fromNbt(CompoundTag tag) { center = NbtUtils.readBlockPos(tag.getCompound("center")); @@ -94,7 +92,10 @@ public abstract class MountainPiece extends BasePiece { return h; } - h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval( + pos.getX() * 0.002, + pos.getZ() * 0.002 + ) * 8 + 8); if (h < 0) { heightmap.put(p, 0); @@ -129,9 +130,11 @@ public abstract class MountainPiece extends BasePiece { private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); + int minY = MHelper.floor(center.getY() - radius); int minZ = MHelper.floor(center.getZ() - radius); int maxX = MHelper.floor(center.getX() + radius + 1); + int maxY = MHelper.floor(center.getY() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BoundingBox(minX, minZ, maxX, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index bc5388f3..9242bb5d 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -1,8 +1,7 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; @@ -13,12 +12,16 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; import ru.betterend.registry.EndStructures; +import ru.betterend.util.StructureErode; +import ru.betterend.world.biome.EndBiome; + +import java.util.Random; public class NBTPiece extends BasePiece { private ResourceLocation structureID; @@ -30,7 +33,7 @@ public class NBTPiece extends BasePiece { private boolean cover; public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { - super(EndStructures.NBT_PIECE, random.nextInt()); + super(EndStructures.NBT_PIECE, random.nextInt(), null); this.structureID = structureID; this.structure = structure; this.rotation = Rotation.getRandom(random); @@ -40,14 +43,15 @@ public class NBTPiece extends BasePiece { this.cover = cover; makeBoundingBox(); } - - public NBTPiece(StructureManager manager, CompoundTag tag) { + + public NBTPiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.NBT_PIECE, tag); makeBoundingBox(); } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); tag.putString("structureID", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); @@ -55,7 +59,7 @@ public class NBTPiece extends BasePiece { tag.put("pos", NbtUtils.writeBlockPos(pos)); tag.putBoolean("cover", cover); } - + @Override protected void fromNbt(CompoundTag tag) { structureID = new ResourceLocation(tag.getString("structureID")); @@ -66,25 +70,27 @@ public class NBTPiece extends BasePiece { cover = tag.getBoolean("cover"); structure = StructureHelper.readStructure(structureID); } - + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - BoundingBox bounds = new BoundingBox(blockBox); - bounds.y1 = this.boundingBox.y1; - bounds.y0 = this.boundingBox.y0; + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + BoundingBox bounds = BoundingBox.fromCorners(new Vec3i( + blockBox.minX(), + this.boundingBox.minY(), + blockBox.minZ() + ), new Vec3i(blockBox.maxX(), this.boundingBox.maxX(), blockBox.maxZ())); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - structure.placeInWorldChunk(world, pos, placementData, random); + structure.placeInWorld(world, pos, pos, placementData, random, 2); if (erosion > 0) { - bounds.x1 = MHelper.min(bounds.x1, boundingBox.x1); - bounds.x0 = MHelper.max(bounds.x0, boundingBox.x0); - bounds.z1 = MHelper.min(bounds.z1, boundingBox.z1); - bounds.z0 = MHelper.max(bounds.z0, boundingBox.z0); - StructureHelper.erode(world, bounds, erosion, random); + int x1 = MHelper.min(bounds.maxX(), boundingBox.maxX()); + int x0 = MHelper.max(bounds.minX(), boundingBox.minX()); + int z1 = MHelper.min(bounds.maxZ(), boundingBox.maxZ()); + int z0 = MHelper.max(bounds.minZ(), boundingBox.minZ()); + bounds = BoundingBox.fromCorners(new Vec3i(x0, bounds.minY(), z0), new Vec3i(x1, bounds.maxY(), z1)); + StructureErode.erode(world, bounds, erosion, random); } if (cover) { - StructureHelper.cover(world, bounds, random); + StructureErode.cover(world, bounds, random, EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); } - return true; } private void makeBoundingBox() { diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index cbbaa91d..4c37167c 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -17,31 +15,34 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.util.MHelper; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; + public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; } - - public PaintedMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, manager, tag); + + public PaintedMountainPiece(StructurePieceSerializationContext type, CompoundTag tag) { + super(EndStructures.PAINTED_MOUNTAIN_PIECE, tag); } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); ListTag slise = new ListTag(); - for (BlockState state: slises) { + for (BlockState state : slises) { slise.add(NbtUtils.writeBlockState(state)); } tag.put("slises", slise); } - + @Override protected void fromNbt(CompoundTag tag) { super.fromNbt(tag); @@ -51,9 +52,9 @@ public class PaintedMountainPiece extends MountainPiece { slises[i] = NbtUtils.readBlockState(slise.getCompound(i)); } } - + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getMinBlockX(); int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); @@ -76,7 +77,7 @@ public class PaintedMountainPiece extends MountainPiece { int minY = map.getFirstAvailable(x, z); pos.setY(minY - 1); while (chunk.getBlockState(pos).isAir() && pos.getY() > 50) { - pos.setY(minY --); + pos.setY(minY--); } minY = pos.getY(); minY = Math.max(minY, map2.getFirstAvailable(x, z)); @@ -86,7 +87,10 @@ public class PaintedMountainPiece extends MountainPiece { maxY *= (float) noise1.eval(px * 0.05, pz * 0.05) * 0.3F + 0.7F; maxY *= (float) noise1.eval(px * 0.1, pz * 0.1) * 0.1F + 0.9F; maxY += center.getY(); - float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval(px * 0.2, pz * 0.2) * 2 + 7); + float offset = (float) (noise1.eval(px * 0.07, pz * 0.07) * 5 + noise1.eval( + px * 0.2, + pz * 0.2 + ) * 2 + 7); for (int y = minY - 1; y < maxY; y++) { pos.setY(y); int index = MHelper.floor((y + offset) * 0.65F) % slises.length; @@ -97,7 +101,5 @@ public class PaintedMountainPiece extends MountainPiece { } } } - - return true; } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 08a4a100..ae7853c0 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -1,8 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; -import java.util.function.Consumer; - import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.ChunkPos; @@ -10,38 +7,40 @@ import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.world.structures.StructureWorld; import ru.betterend.registry.EndStructures; +import java.util.Random; +import java.util.function.Consumer; + public class VoxelPiece extends BasePiece { private StructureWorld world; public VoxelPiece(Consumer function, int id) { - super(EndStructures.VOXEL_PIECE, id); + super(EndStructures.VOXEL_PIECE, id, null); world = new StructureWorld(); function.accept(world); this.boundingBox = world.getBounds(); } - - public VoxelPiece(StructureManager manager, CompoundTag tag) { + + public VoxelPiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.VOXEL_PIECE, tag); this.boundingBox = world.getBounds(); } - + @Override protected void addAdditionalSaveData(CompoundTag tag) { tag.put("world", world.toBNT()); } - + @Override protected void fromNbt(CompoundTag tag) { world = new StructureWorld(tag.getCompound("world")); } - + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); - return true; } } diff --git a/src/main/java/ru/betterend/world/surface/SplitNoiseCondition.java b/src/main/java/ru/betterend/world/surface/SplitNoiseCondition.java new file mode 100644 index 00000000..d3e6aa4e --- /dev/null +++ b/src/main/java/ru/betterend/world/surface/SplitNoiseCondition.java @@ -0,0 +1,21 @@ +package ru.betterend.world.surface; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; +import ru.betterend.noise.OpenSimplexNoise; + +/** + * Noise source that returns a value in [0, 1] + */ +public class SplitNoiseCondition implements NumericProvider { + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(4141); + + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + final int x = context.getBlockX(); + final int z = context.getBlockZ(); + float noise = (float) NOISE.eval(x * 0.1, z * 0.1) + MHelper.randRange(-0.4F, 0.4F, MHelper.RANDOM); + return noise > 0 ? 1 : 0; + } +} diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java deleted file mode 100644 index 90841b95..00000000 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.world.surface; - -import java.util.Random; - -import net.minecraft.core.Registry; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import ru.bclib.util.MHelper; -import ru.betterend.noise.OpenSimplexNoise; - -public class SulphuricSurfaceBuilder extends SurfaceBuilder { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); - - public SulphuricSurfaceBuilder() { - super(SurfaceBuilderBaseConfiguration.CODEC); - } - - @Override - public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderBaseConfiguration surfaceBlocks) { - double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); - if (value < -0.6) { - SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.DEFAULT_END_CONFIG); - } - else if (value < -0.3) { - SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.FLAVOLITE_CONFIG); - } - else if (value < 0.5) { - SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.SULFURIC_ROCK_CONFIG); - } - else { - SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilders.BRIMSTONE_CONFIG); - } - } - - public static SulphuricSurfaceBuilder register(String name) { - return Registry.register(Registry.SURFACE_BUILDER, name, new SulphuricSurfaceBuilder()); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java new file mode 100644 index 00000000..1ad16c08 --- /dev/null +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java @@ -0,0 +1,24 @@ +package ru.betterend.world.surface; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; +import ru.betterend.noise.OpenSimplexNoise; + +/** + * Noise source that returns a value in [0, 3] + */ +public class SulphuricSurfaceNoiseCondition implements NumericProvider { + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); + + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + final int x = context.getBlockX(); + final int z = context.getBlockZ(); + final double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); + if (value < -0.6) return 0; + if (value < -0.3) return 1; + if (value < 0.5) return 2; + return 3; + } +} diff --git a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java deleted file mode 100644 index b00b12ca..00000000 --- a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.betterend.world.surface; - -import net.minecraft.core.Registry; -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.surfacebuilders.SurfaceBuilder; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import ru.betterend.registry.EndBlocks; - -public class SurfaceBuilders { - public static final SurfaceBuilderBaseConfiguration DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); - public static final SurfaceBuilderBaseConfiguration FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); - public static final SurfaceBuilderBaseConfiguration BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); - public static final SurfaceBuilderBaseConfiguration SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); - - public static final SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); - - private static SurfaceBuilder register(String name, SurfaceBuilder builder) { - return Registry.register(Registry.SURFACE_BUILDER, name, builder); - } - - private static SurfaceBuilderBaseConfiguration makeSimpleConfig(Block block) { - BlockState state = block.defaultBlockState(); - return new SurfaceBuilderBaseConfiguration(state, state, state); - } - - public static void register() {} -} diff --git a/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java b/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java new file mode 100644 index 00000000..83fea882 --- /dev/null +++ b/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java @@ -0,0 +1,29 @@ +package ru.betterend.world.surface; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; +import ru.betterend.noise.OpenSimplexNoise; + +/** + * Noise source that returns a value in [0, 4] + */ +public class UmbraSurfaceNoiseCondition implements NumericProvider { + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(1512); + + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + final int x = context.getBlockX(); + final int z = context.getBlockZ(); + return getDepth(x, z); + } + + public static int getDepth(int x, int z) { + final double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); + if (value > 0.4) return 0; + if (value > 0.15) return 1; + if (value > -0.15) return 2; + if (value > -0.4) return 3; + return 4; + } +} diff --git a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java new file mode 100644 index 00000000..fa1783e6 --- /dev/null +++ b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * 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 + * + * http://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. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.api.client.rendering.v1; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import shadow.fabric.impl.client.rendering.ArmorRenderingRegistryImpl; + +import java.util.Arrays; + +/** + * A class for registering custom armor models and textures for {@link Item}, to be provided by a {@link ModelProvider} or {@link TextureProvider}. + * + *

This can be used to replace existing vanilla armor models and textures conditionally, however each {@link Item} + * instance can only allow one {@link ModelProvider} or {@link TextureProvider} respectively, causing potential conflicts + * with other mods if you replace the model or texture for vanilla items. Consider using a separate item instead.

+ * + *

A custom model would probably also require a custom texture to go along it, the model will use the vanilla texture if it is undefined.

+ * + *

Since armor textures identifier in vanilla is hardcoded to be in the {@code minecraft} namespace, this registry can also be + * used to use a custom namespace if desired.

+ */ +@Environment(EnvType.CLIENT) +public final class ArmorRenderingRegistry { + private ArmorRenderingRegistry() { + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Item... items) { + registerModel(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerModel(provider, items); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Item... items) { + registerTexture(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerTexture(provider, items); + } + + /** + * Register simple armor items to use the vanilla armor file name under the mods namespace. + * + * @param identifier The namespace + path to use for the armor texture location. + * @param items the items to be registered + */ + public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { + registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { + return new ResourceLocation( + identifier.getNamespace(), + "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer ? 2 : 1) + (suffix == null ? "" : "_" + suffix) + ".png" + ); + }, items); + } + + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default model that vanilla provides + * @return The model of the armor piece. + */ + @NotNull + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); + } + + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param secondLayer True if using the second texture layer + * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. + */ + @NotNull + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface ModelProvider { + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default vanilla armor model + * @return The model of the armor piece. Should never be null. + */ + @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface TextureProvider { + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier. Should never be null. + */ + @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture); + } +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java new file mode 100644 index 00000000..ccb6a838 --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * 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 + * + * http://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. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import org.jetbrains.annotations.Nullable; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; + +public interface ArmorProviderExtensions { + @Nullable ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); + + @Nullable ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); + + void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); + + void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java new file mode 100644 index 00000000..5e23e5c4 --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * 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 + * + * http://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. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; + +import java.util.Objects; + +public final class ArmorRenderingRegistryImpl { + private ArmorRenderingRegistryImpl() { + } + + public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); + } + } + + public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); + } + } + + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); + + if (provider != null) { + return provider.getArmorModel(entity, stack, slot, defaultModel); + } + } + + return defaultModel; + } + + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); + + if (provider != null) { + return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + } + + return defaultTexture; + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java new file mode 100644 index 00000000..7a26ae46 --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * 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 + * + * http://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. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.mixin.client.rendering; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; + +import java.util.Map; +import java.util.Objects; + +@Mixin(HumanoidArmorLayer.class) +@Environment(EnvType.CLIENT) +public abstract class MixinArmorFeatureRenderer extends RenderLayer { + @Shadow + @Final + private static Map ARMOR_LOCATION_CACHE; + + public MixinArmorFeatureRenderer(RenderLayerParent context) { + super(context); + + } + + @Unique + private LivingEntity storedEntity; + @Unique + private EquipmentSlot storedSlot; + + @Inject(method = "render", at = @At("HEAD")) + private void storeEntity(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We store the living entity wearing the armor before we render + this.storedEntity = livingEntity; + } + + @Inject(method = "renderArmorPiece", at = @At("HEAD")) + private void storeSlot(PoseStack matrices, MultiBufferSource vertexConsumers, LivingEntity livingEntity, EquipmentSlot slot, int i, HumanoidModel bipedEntityModel, CallbackInfo ci) { + // We store the current armor slot that is rendering before we render each armor piece + this.storedSlot = slot; + } + + @Inject(method = "render", at = @At("RETURN")) + private void removeStored(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We remove the stored data after we render + this.storedEntity = null; + this.storedSlot = null; + } + + @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) + private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { + ItemStack stack = storedEntity.getItemBySlot(slot); + + HumanoidModel defaultModel = cir.getReturnValue(); + HumanoidModel model = ArmorRenderingRegistry.getArmorModel( + storedEntity, + stack, + slot, + defaultModel + ); + + if (model != defaultModel) { + cir.setReturnValue(model); + } + } + + @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void getArmorTexture(ArmorItem armorItem, boolean secondLayer, /* @Nullable */ String suffix, CallbackInfoReturnable cir, String vanillaIdentifier) { + String texture = ArmorRenderingRegistry.getArmorTexture( + storedEntity, + storedEntity.getItemBySlot(storedSlot), + storedSlot, + secondLayer, + suffix, + new ResourceLocation(vanillaIdentifier) + ).toString(); + + if (!Objects.equals(texture, vanillaIdentifier)) { + cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); + } + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java new file mode 100644 index 00000000..32ed410e --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * 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 + * + * http://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. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + +package shadow.fabric.mixin.client.rendering; + + +import net.minecraft.world.item.Item; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; + + +@Mixin(Item.class) +public class MixinItem implements ArmorProviderExtensions { + @Unique + private ArmorRenderingRegistry.ModelProvider armorModelProvider; + @Unique + private ArmorRenderingRegistry.TextureProvider armorTextureProvider; + + @Override + public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { + return armorModelProvider; + } + + @Override + public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { + return armorTextureProvider; + } + + @Override + public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { + armorModelProvider = provider; + } + + @Override + public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { + armorTextureProvider = provider; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json b/src/main/resources/assets/betterend/blockstates/custom_chorus_flower.json similarity index 95% rename from src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json rename to src/main/resources/assets/betterend/blockstates/custom_chorus_flower.json index fed5be0f..45269fb3 100644 --- a/src/main/resources/assets/minecraft/blockstates/custom_chorus_flower.json +++ b/src/main/resources/assets/betterend/blockstates/custom_chorus_flower.json @@ -1,22 +1,22 @@ -{ - "variants": { - "age=0": { - "model": "betterend:block/chorus_plant_flower" - }, - "age=1": { - "model": "betterend:block/chorus_plant_flower" - }, - "age=2": { - "model": "betterend:block/chorus_plant_flower" - }, - "age=3": { - "model": "betterend:block/chorus_plant_flower" - }, - "age=4": { - "model": "betterend:block/chorus_plant_flower" - }, - "age=5": { - "model": "betterend:block/chorus_plant_flower_open" - } - } +{ + "variants": { + "age=0": { + "model": "betterend:block/chorus_plant_flower" + }, + "age=1": { + "model": "betterend:block/chorus_plant_flower" + }, + "age=2": { + "model": "betterend:block/chorus_plant_flower" + }, + "age=3": { + "model": "betterend:block/chorus_plant_flower" + }, + "age=4": { + "model": "betterend:block/chorus_plant_flower" + }, + "age=5": { + "model": "betterend:block/chorus_plant_flower_open" + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json b/src/main/resources/assets/betterend/blockstates/custom_chorus_plant.json similarity index 92% rename from src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json rename to src/main/resources/assets/betterend/blockstates/custom_chorus_plant.json index 52268ebc..4db5e7db 100644 --- a/src/main/resources/assets/minecraft/blockstates/custom_chorus_plant.json +++ b/src/main/resources/assets/betterend/blockstates/custom_chorus_plant.json @@ -1,69 +1,65 @@ -{ - "multipart": [ - { - "when": { "OR": [ - {"up": "false"}, - {"down": "false"} - ]}, - "apply": { "model": "betterend:block/chorus_plant_center" } - }, - { - "when": {"roots": "true"}, - "apply": { "model": "betterend:block/chorus_plant_roots" } - }, - { - "when": {"north": "true"}, - "apply": [ - { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 180 }, - { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 180 }, - { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 180 }, - { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 180 } - ] - }, - { - "when": { "east": "true" }, - "apply": [ - { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 270 }, - { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 270 }, - { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 270 }, - { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 270 } - ] - }, - { - "when": { "south": "true" }, - "apply": [ - { "model": "betterend:block/chorus_plant_stem", "x": 90 }, - { "model": "betterend:block/chorus_plant_stem_2", "x": 90 }, - { "model": "betterend:block/chorus_plant_stem_3", "x": 90 }, - { "model": "betterend:block/chorus_plant_stem_4", "x": 90 } - ] - }, - { - "when": { "west": "true" }, - "apply": [ - { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 90 }, - { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 90 }, - { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 90 }, - { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 90 } - ] - }, - { - "when": { "up": "true" }, - "apply": [ - { "model": "betterend:block/chorus_plant_stem", "x": 180 }, - { "model": "betterend:block/chorus_plant_stem_2", "x": 180 }, - { "model": "betterend:block/chorus_plant_stem_3", "x": 180 }, - { "model": "betterend:block/chorus_plant_stem_4", "x": 180 } - ] - }, - { - "when": { "down": "true" }, - "apply": [ - { "model": "betterend:block/chorus_plant_stem" }, - { "model": "betterend:block/chorus_plant_stem_2" }, - { "model": "betterend:block/chorus_plant_stem_3" }, - { "model": "betterend:block/chorus_plant_stem_4" } - ] - } - ] +{ + "multipart": [ + { + "when": { "OR": [ + {"up": "false"}, + {"down": "false"} + ]}, + "apply": { "model": "betterend:block/chorus_plant_center" } + }, + { + "when": {"north": "true"}, + "apply": [ + { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 180 }, + { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 180 }, + { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 180 }, + { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 180 } + ] + }, + { + "when": { "east": "true" }, + "apply": [ + { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 270 }, + { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 270 }, + { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 270 }, + { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 270 } + ] + }, + { + "when": { "south": "true" }, + "apply": [ + { "model": "betterend:block/chorus_plant_stem", "x": 90 }, + { "model": "betterend:block/chorus_plant_stem_2", "x": 90 }, + { "model": "betterend:block/chorus_plant_stem_3", "x": 90 }, + { "model": "betterend:block/chorus_plant_stem_4", "x": 90 } + ] + }, + { + "when": { "west": "true" }, + "apply": [ + { "model": "betterend:block/chorus_plant_stem", "x": 90, "y": 90 }, + { "model": "betterend:block/chorus_plant_stem_2", "x": 90, "y": 90 }, + { "model": "betterend:block/chorus_plant_stem_3", "x": 90, "y": 90 }, + { "model": "betterend:block/chorus_plant_stem_4", "x": 90, "y": 90 } + ] + }, + { + "when": { "up": "true" }, + "apply": [ + { "model": "betterend:block/chorus_plant_stem", "x": 180 }, + { "model": "betterend:block/chorus_plant_stem_2", "x": 180 }, + { "model": "betterend:block/chorus_plant_stem_3", "x": 180 }, + { "model": "betterend:block/chorus_plant_stem_4", "x": 180 } + ] + }, + { + "when": { "down": "true" }, + "apply": [ + { "model": "betterend:block/chorus_plant_stem" }, + { "model": "betterend:block/chorus_plant_stem_2" }, + { "model": "betterend:block/chorus_plant_stem_3" }, + { "model": "betterend:block/chorus_plant_stem_4" } + ] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/flammalix.json b/src/main/resources/assets/betterend/blockstates/flammalix.json new file mode 100644 index 00000000..9e6c8183 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/flammalix.json @@ -0,0 +1,22 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/flammalix_1" }, + { "model": "betterend:block/flammalix_1", "y": 90 }, + { "model": "betterend:block/flammalix_1", "y": 180 }, + { "model": "betterend:block/flammalix_1", "y": 270 }, + { "model": "betterend:block/flammalix_2" }, + { "model": "betterend:block/flammalix_2", "y": 90 }, + { "model": "betterend:block/flammalix_2", "y": 180 }, + { "model": "betterend:block/flammalix_2", "y": 270 }, + { "model": "betterend:block/flammalix_3" }, + { "model": "betterend:block/flammalix_3", "y": 90 }, + { "model": "betterend:block/flammalix_3", "y": 180 }, + { "model": "betterend:block/flammalix_3", "y": 270 }, + { "model": "betterend:block/flammalix_4" }, + { "model": "betterend:block/flammalix_4", "y": 90 }, + { "model": "betterend:block/flammalix_4", "y": 180 }, + { "model": "betterend:block/flammalix_4", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json deleted file mode 100644 index 2d3e15ba..00000000 --- a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "axis=x": { "model": "betterend:block/smaragdant_crystal", "x": 90, "y": 90 }, - "axis=y": { "model": "betterend:block/smaragdant_crystal" }, - "axis=z": { "model": "betterend:block/smaragdant_crystal", "x": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..61ea29d6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..b68ce3e7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..f199dcf1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json @@ -0,0 +1,22 @@ +{ + "variants": { + "state=default": { + "model": "betterend:block/smaragdant_pedestal_default" + }, + "state=column": { + "model": "betterend:block/smaragdant_pedestal_column" + }, + "state=column_top": { + "model": "betterend:block/smaragdant_pedestal_column_top" + }, + "state=pedestal_top": { + "model": "betterend:block/smaragdant_pedestal_top" + }, + "state=bottom": { + "model": "betterend:block/smaragdant_pedestal_bottom" + }, + "state=pillar": { + "model": "betterend:block/smaragdant_pedestal_pillar" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json new file mode 100644 index 00000000..e944b672 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json @@ -0,0 +1,15 @@ +{ + "variants": { + "type=bottom": { + "model": "betterend:block/smaragdant_slab" + }, + "type=top": { + "model": "betterend:block/smaragdant_slab", + "x": 180, + "uvlock": true + }, + "type=double": { + "model": "betterend:block/smaragdant_crystal" + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..2d3fc25c --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json new file mode 100644 index 00000000..3232369d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} diff --git a/src/main/resources/assets/betterend/blockstates/umbralith.json b/src/main/resources/assets/betterend/blockstates/umbralith.json new file mode 100644 index 00000000..98e6b27a --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbralith.json @@ -0,0 +1,13 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/umbralith_1", "weight": 10 }, + { "model": "betterend:block/umbralith_2", "weight": 10 }, + { "model": "betterend:block/umbralith_6", "weight": 10 }, + { "model": "betterend:block/umbralith_7", "weight": 10 }, + { "model": "betterend:block/umbralith_3", "weight": 1 }, + { "model": "betterend:block/umbralith_4", "weight": 1 }, + { "model": "betterend:block/umbralith_5", "weight": 1 } + ] + } +} diff --git a/src/main/resources/assets/betterend/icon.png b/src/main/resources/assets/betterend/icon.png index 95bc2e64..408be2ca 100644 Binary files a/src/main/resources/assets/betterend/icon.png and b/src/main/resources/assets/betterend/icon.png differ diff --git a/src/main/resources/assets/betterend/lang/de_de.json b/src/main/resources/assets/betterend/lang/de_de.json index 7341d5c0..b3392c2c 100644 --- a/src/main/resources/assets/betterend/lang/de_de.json +++ b/src/main/resources/assets/betterend/lang/de_de.json @@ -188,7 +188,7 @@ "block.betterend.granite_pedestal": "Granitsockel", "block.betterend.purpur_pedestal": "Purpursockel", "block.betterend.quartz_pedestal": "Quarzsockel", - "block.betterend.infusion_pedestal": "Infusionssockel", + "block.betterend.infusion_pedestal": "Elementarsockel", "block.betterend.end_lotus_seed": "Endlotussamen", "block.betterend.end_lotus_stem": "Endlotusstamm", @@ -227,7 +227,7 @@ "block.betterend.flavolite_runed": "Flavolitrune", "block.betterend.end_portal_block": "Endportal", - "block.betterend.eternal_pedestal": "Ewiges Sockel", + "block.betterend.eternal_pedestal": "Ewiger Sockel", "block.betterend.flavolite_runed_eternal": "Ewige Flavolitrune", "item.betterend.eternal_crystal": "Ewiger Kristall", diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 32e011b0..7002e595 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -125,7 +125,7 @@ "block.betterend.dense_vine": "Dense Vine", "block.betterend.bubble_coral": "Bubble Coral", "block.betterend.aurora_crystal": "Aurora Crystal", - "item.betterend.crystal_shards": "Crystal Shards", + "item.betterend.crystal_shards": "Aurora Crystal Shards", "block.betterend.pythadendron_sapling": "Pythadendron Sapling", "block.betterend.pythadendron_bark": "Pythadendron Bark", @@ -598,6 +598,7 @@ "item.betterend.silk_fiber": "Silk Fiber", "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg", + "item.betterend.thallasium_raw": "Raw Thallasium", "block.betterend.thallasium_ore": "Thallasium Ore", "item.betterend.thallasium_axe": "Thallasium Axe", "item.betterend.thallasium_hoe": "Thallasium Hoe", @@ -873,5 +874,40 @@ "tooltip.armor.crystalite_set": "Set bonus: Regeneration I", "tooltip.armor.crystalite_chest": "Effect: Dig Speed I", - "tooltip.armor.crystalite_boots": "Effect: Swiftness I" + "tooltip.armor.crystalite_boots": "Effect: Swiftness I", + + "block.betterend.azure_jadestone_flower_pot": "Azure Jadestone Flower Pot", + "block.betterend.endstone_flower_pot": "Endstone Flower Pot", + "block.betterend.flavolite_flower_pot": "Flavolite Flower Pot", + "block.betterend.sandy_jadestone_flower_pot": "Sandy Jadestone Flower Pot", + "block.betterend.sulphuric_rock_flower_pot": "Sulphuric Rock Flower Pot", + "block.betterend.violecite_flower_pot": "Violecite Flower Pot", + "block.betterend.virid_jadestone_flower_pot": "Virid Jadestone Flower Pot", + "block.betterend.virid_jadestone_flower_pot": "Virid Jadestone Flower Pot", + + "block.betterend.umbralith": "Umbralith", + "block.betterend.umbralith_bricks": "Umbralith Bricks", + "block.betterend.umbralith_bricks_slab": "Umbralith Bricks Slab", + "block.betterend.umbralith_bricks_stairs": "Umbralith Bricks Stairs", + "block.betterend.umbralith_bricks_wall": "Umbralith Bricks Wall", + "block.betterend.umbralith_button": "Umbralith Button", + "block.betterend.umbralith_flower_pot": "Umbralith Flower Pot", + "block.betterend.umbralith_furnace": "Umbralith Furnace", + "block.betterend.umbralith_lantern": "Umbralith Lantern", + "block.betterend.umbralith_pedestal": "Umbralith Pedestal", + "block.betterend.umbralith_pillar": "Umbralith Pillar", + "block.betterend.umbralith_plate": "Umbralith Pressure Plate", + "block.betterend.umbralith_polished": "Umbralith Polished", + "block.betterend.umbralith_slab": "Umbralith Slab", + "block.betterend.umbralith_stairs": "Umbralith Stairs", + "block.betterend.umbralith_tiles": "Umbralith Tiles", + "block.betterend.umbralith_wall": "Umbralith Wall", + + "biome.betterend.umbra_valley": "Umbra Valley", + "block.betterend.inflexia": "Inflexia", + "block.betterend.pallidium_full": "Pallidium (Full Cover)", + "block.betterend.pallidium_heavy": "Pallidium (Heavy Cover)", + "block.betterend.pallidium_thin": "Pallidium (Thin Cover)", + "block.betterend.pallidium_tiny": "Pallidium (Tiny Cover)", + "block.betterend.flammalix": "Flammalix" } diff --git a/src/main/resources/assets/betterend/lang/es_es.json b/src/main/resources/assets/betterend/lang/es_es.json new file mode 100644 index 00000000..efae5e35 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/es_es.json @@ -0,0 +1,877 @@ +{ + "itemGroup.betterend.end_items": "Better End: Objetos", + "itemGroup.betterend.end_blocks": "Better End: Bloques", + + "item.betterend.guidebook": "El End para Bobos", + "book.betterend.landing": "Una pequeña guía para sobrevivir en las condiciones exstremas del End.", + "book.betterend.subtitle": "Sobrevivir en el End", + + "category.rei.damage.amount&dmg": "Daño de la herramienta: %s", + "category.rei.infusion.time&val": "Tiempo: %s", + + "biome.betterend.foggy_mushroomland": "Tierra de Setas Nublada", + "biome.betterend.dust_wastelands": "Tierras de Desecho de Polvo", + "biome.betterend.chorus_forest": "Bosque Coral", + "biome.betterend.megalake": "Megalago", + "biome.betterend.crystal_mountains": "Montañas de Cristal", + + "entity.betterend.dragonfly": "Libélula", + "item.betterend.spawn_egg_dragonfly": "Huevo de Generación de Libélula", + + "entity.betterend.end_slime": "Slime del End", + "item.betterend.spawn_egg_end_slime": "Huevo de Generación de Slime del End", + + "block.betterend.end_mycelium": "Micelio del End", + "block.betterend.end_moss": "Musgo del End", + "block.betterend.endstone_dust": "Polvo de Piedra del End", + + "block.betterend.end_mycelium_path": "Camino de Micelio del End", + "block.betterend.end_moss_path": "Camino de Musgo del End", + + "block.betterend.ender_ore": "Mena de Ender", + "block.betterend.terminite_block": "Bloque de Terminita", + "block.betterend.aeternium_block": "Bloque de Aeternio", + "block.betterend.ender_block": "Bloque de Ender", + "block.betterend.end_stone_smelter": "Fundidor de Piedra del End", + + "item.betterend.ender_dust": "Polvo de Ender", + "item.betterend.ender_shard": "Fragmento de Ender", + "item.betterend.terminite_ingot": "Lingote de Terminita", + "item.betterend.aeternium_ingot": "Lingote de Aeternio", + "item.betterend.terminite_helmet": "Casco de Terminita", + "item.betterend.terminite_chestplate": "Pechera de Terminita", + "item.betterend.terminite_leggings": "Grebas de Terminita", + "item.betterend.terminite_boots": "Botas de Terminita", + "item.betterend.terminite_shovel": "Pala de Terminita", + "item.betterend.terminite_sword": "Espada de Terminita", + "item.betterend.terminite_pickaxe": "Pico de Terminita", + "item.betterend.terminite_axe": "Hacha de Terminita", + "item.betterend.terminite_hoe": "Azada de Terminita", + "item.betterend.terminite_hammer": "Maryillo Herrero de Terminita", + "item.betterend.aeternium_helmet": "Casco de Aeternio", + "item.betterend.aeternium_chestplate": "Pechera de Aeternio", + "item.betterend.aeternium_leggings": "Grebas de Aeternio", + "item.betterend.aeternium_boots": "Botas de Aeternio", + "item.betterend.aeternium_shovel": "Pala de Aeternio", + "item.betterend.aeternium_sword": "Espada de Aeternio", + "item.betterend.aeternium_pickaxe": "Pico de Aeternio", + "item.betterend.aeternium_axe": "Hacha de Aeternio", + "item.betterend.aeternium_hoe": "Azada de Aeternio", + "item.betterend.aeternium_hammer": "Martillo Herrero de Aeternio", + "item.betterend.iron_hammer": "Martillo Herrero de Hierro", + "item.betterend.golden_hammer": "Martillo Herrero de Oro", + "item.betterend.diamond_hammer": "Martillo Herrero de Diamante", + "item.betterend.netherite_hammer": "Martillo Herrero de Netherite", + "item.betterend.crystalite_boots": "Botas de Cristalita", + "item.betterend.crystalite_chestplate": "Pechera de Cristalita", + "item.betterend.crystalite_helmet": "Casco de Cristalita", + "item.betterend.crystalite_leggings": "Grebas de Cristalita", + "item.betterend.aeternium_axe_head": "Aeternium Axe Head", + "item.betterend.aeternium_hammer_head": "Aeternium Hammer Head", + "item.betterend.aeternium_hoe_head": "Cabeza de Azada de Aeternio", + "item.betterend.aeternium_pickaxe_head": "Cabeza de Pico de Aeternio", + "item.betterend.aeternium_shovel_head": "Cabeza de Pala de Aeternio", + "item.betterend.aeternium_sword_blade": "Hoja de Espada de Aeternio", + "item.betterend.aeternium_sword_handle": "Mango de Espada de Aeternio", + "item.betterend.leather_stripe": "Raya de Cuero", + "item.betterend.leather_wrapped_stick": "Palo Envuelto con Cuero", + "item.betterend.elytra_armored": "Elytra Blindada", + "item.betterend.elytra_crystalite": "Elytra de Cristalite", + "item.betterend.enchanted_membrane": "Membrana Encantada", + + "effect.betterend.end_veil": "Velo del End", + "enchantment.betterend.end_veil": "Velo del End", + "item.minecraft.potion.effect.end_veil": "Poción de Velo del End", + "item.minecraft.potion.effect.long_end_veil": "Poción de Velo del End", + "item.minecraft.splash_potion.effect.end_veil": "Poción Arrojadiza de Velo del End", + "item.minecraft.splash_potion.effect.long_end_veil": "Poción Arrojadiza de Velo del End", + "item.minecraft.lingering_potion.effect.end_veil": "Poción de Efecto Duradero de Velo del End", + "item.minecraft.lingering_potion.effect.long_end_veil": "Poción de Efecto Duradero de Velo del End", + "item.minecraft.tipped_arrow.effect.end_veil": "Flecha de Velo del End", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Flecha de Velo del End", + + "block.betterend.mossy_glowshroom_sapling": "Sapling de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_cap": "Gorra de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_fur": "Pelo de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_hymenophore": "Himenóforo de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_bark": "Corteza de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_barrel": "Barril de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_button": "Botón de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_chest": "Cofre de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_crafting_table": "Mesa de Crafteo de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_door": "Puerta de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_fence": "Valla de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_gate": "Puerta de Valla de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_ladder": "Escalera de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_log": "Tronco de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_planks": "Tablones de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_plate": "Placa de Presión de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_sign": "Cartel de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_slab": "Losa de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_stairs": "Escaleras de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_stripped_bark": "Corteza Despojada de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_stripped_log": "Tronco Despojado de Seta Luminosa Musgosa", + "block.betterend.mossy_glowshroom_trapdoor": "Trampilla de Seta Luminosa Musgosa", + + "block.betterend.umbrella_moss": "Paraguas de Musgo", + "block.betterend.umbrella_moss_tall": "Paraguas de Musgo Alto", + "block.betterend.creeping_moss": "Musgo Reptante", + + "block.betterend.blue_vine_seed": "Semilla de Vid Azul", + "block.betterend.blue_vine": "Vid Azul", + "block.betterend.blue_vine_lantern": "Linterna de Vid Azul", + "block.betterend.blue_vine_fur": "Pelo de Vid Azul", + + "block.betterend.dense_vine": "Vid Densa", + "block.betterend.bubble_coral": "Burbuja Coral", + "block.betterend.aurora_crystal": "Cristal Aurora", + "item.betterend.crystal_shards": "Fragmentos de Cristal", + + "block.betterend.pythadendron_sapling": "Sapling de Fitadendrón", + "block.betterend.pythadendron_bark": "Corteza de Fitadendrón", + "block.betterend.pythadendron_barrel": "Barril de Fitadendrón", + "block.betterend.pythadendron_button": "Botón de Fitadendrón", + "block.betterend.pythadendron_chest": "Cofre de Fitadendrón", + "block.betterend.pythadendron_crafting_table": "Mesa de Crafteo de Fitadendrón", + "block.betterend.pythadendron_door": "Puerta de Fitadendrón", + "block.betterend.pythadendron_fence": "Valla de Fitadendrón", + "block.betterend.pythadendron_gate": "Puerta de Valla de Fitadendrón", + "block.betterend.pythadendron_ladder": "Escalera de Fitadendrón", + "block.betterend.pythadendron_log": "Tronco de Fitadendrón", + "block.betterend.pythadendron_planks": "Tablones de Fitadendrón", + "block.betterend.pythadendron_plate": "Placa de Presión de Fitadendrón", + "block.betterend.pythadendron_sign": "Cartel de Fitadendrón", + "block.betterend.pythadendron_slab": "Losa de Fitadendrón", + "block.betterend.pythadendron_stairs": "Escaleras de Fitadendrón", + "block.betterend.pythadendron_stripped_bark": "Corteza Despojada de Fitadendrón", + "block.betterend.pythadendron_stripped_log": "Tronco Despojado de Fitadendrón", + "block.betterend.pythadendron_trapdoor": "Trampilla de Fitadendrón", + + "block.betterend.chorus_nylium": "Nilio Coral", + "block.betterend.chorus_nylium_path": "Camino de Nilio Coras", + "block.betterend.chorus_grass": "Hierba Coral", + + "block.betterend.end_lily": "Nenúfar del End", + "block.betterend.end_lily_seed": "Semilla de Nenúfar del End", + "item.betterend.end_lily_leaf": "Hoja de Nenúfar del End", + "item.betterend.end_lily_leaf_dried": "Hoja Seca de Nenúfar del End", + + "block.betterend.violecite": "Violecita", + "block.betterend.violecite_bricks": "Ladrillos de Violecita", + "block.betterend.violecite_bricks_slab": "Losa de Ladrillos de Violecita", + "block.betterend.violecite_bricks_stairs": "Escaleras de Ladrillos de Violecita", + "block.betterend.violecite_bricks_wall": "Muro de Ladrillos de Violecita", + "block.betterend.violecite_button": "Botón de Violecita", + "block.betterend.violecite_pillar": "Pilar de Violecita", + "block.betterend.violecite_plate": "Placa de Presión de Violecita", + "block.betterend.violecite_slab": "Losa de Violecita", + "block.betterend.violecite_tiles": "Casilla de Violecita", + "block.betterend.violecite_stairs": "Escaleras de Violecita", + "block.betterend.violecite_polished": "Violecita Pulida", + "block.betterend.violecite_wall": "Muro de Violecita", + "block.betterend.violecite_pedestal": "Pedestal de Violecita", + + "block.betterend.flavolite": "Flavolita", + "block.betterend.flavolite_bricks": "Ladrillos de Flavolita", + "block.betterend.flavolite_bricks_slab": "Losa de Ladrillos de Flavolita", + "block.betterend.flavolite_bricks_stairs": "Escaleras de Ladrillos de Flavolita", + "block.betterend.flavolite_bricks_wall": "Muro de Ladrillos de Flavolita", + "block.betterend.flavolite_button": "Botón de Flavolita", + "block.betterend.flavolite_pillar": "Pilar de Flavolita", + "block.betterend.flavolite_plate": "Placa de Presión de Flavolita", + "block.betterend.flavolite_slab": "Losa de Flavolita", + "block.betterend.flavolite_tiles": "Casilla de Flavolita", + "block.betterend.flavolite_stairs": "Escaleras de Flavolita", + "block.betterend.flavolite_polished": "Flavolita Pulida", + "block.betterend.flavolite_wall": "Muro de Flavolita", + "block.betterend.flavolite_pedestal": "Pedestal de Flavolita", + + "block.betterend.andesite_pedestal": "Pedestal de Andesita", + "block.betterend.diorite_pedestal": "Pdestal de Diorita", + "block.betterend.granite_pedestal": "Pedestal de Granito", + "block.betterend.purpur_pedestal": "Pedestal de Purpur", + "block.betterend.quartz_pedestal": "Pedestal de Cuarzo", + "block.betterend.infusion_pedestal": "Pedestal de Infusión", + + "block.betterend.end_lotus_seed": "Semilla de Loto del End", + "block.betterend.end_lotus_stem": "Tallo de Loto del End", + "block.betterend.end_lotus_leaf": "Hoja de Loto del End", + "block.betterend.end_lotus_flower": "Flor de Loto el End", + + "block.betterend.end_lotus_bark": "Corteza de Loto del End", + "block.betterend.end_lotus_barrel": "Barril de Loto del End", + "block.betterend.end_lotus_button": "Botón de Loto del End", + "block.betterend.end_lotus_chest": "Cofre de Loto del End", + "block.betterend.end_lotus_crafting_table": "Mesa de Crafteo de Loto del End", + "block.betterend.end_lotus_door": "Puerta de Loto del End", + "block.betterend.end_lotus_fence": "Valla de Loto del End", + "block.betterend.end_lotus_gate": "Puerta de Valla de Loto del End", + "block.betterend.end_lotus_ladder": "Escalera de Loto del End", + "block.betterend.end_lotus_log": "Tronco de Loto del End", + "block.betterend.end_lotus_planks": "Tablones de Loto del End", + "block.betterend.end_lotus_plate": "Placa de Presión de Loto del End", + "block.betterend.end_lotus_sign": "Cartel de Loto del End", + "block.betterend.end_lotus_slab": "Losa de Loto del End", + "block.betterend.end_lotus_stairs": "Escaleras de Loto del End", + "block.betterend.end_lotus_stripped_bark": "Corteza Despojada de Loto del End", + "block.betterend.end_lotus_stripped_log": "Tronco Despojado de Loto del End", + "block.betterend.end_lotus_trapdoor": "Trampilla de Loto del End", + + "block.betterend.cave_moss": "Musgo de Cueva", + "block.betterend.cave_grass": "Hierba de Cueva", + "block.betterend.cave_bush": "Arbusto de Cueva", + + "block.betterend.cave_moss_path": "Camino de Musgo de Cueva", + "block.betterend.crystal_moss": "Musgo de Cristal", + "block.betterend.crystal_moss_path": "Camino de Musgo de Cristal", + "block.betterend.pythadendron_leaves": "Hojas de Fitadendrón", + "item.betterend.spawn_egg_end_fish": "Huevo de Generación de Pez del End", + "block.betterend.crystal_grass": "Hierba de Cristal", + + "block.betterend.flavolite_runed": "Flavolita de Runa", + "block.betterend.end_portal_block": "Portal del End", + "block.betterend.eternal_pedestal": "Pedestal Eterno", + "block.betterend.flavolite_runed_eternal": "Flavolita de Runa Eterna", + "item.betterend.eternal_crystal": "Cristal Eterno", + + "block.betterend.lacugrove_bark": "Corteza de Lacugrove", + "block.betterend.lacugrove_barrel": "Barril de Lacugrove", + "block.betterend.lacugrove_button": "Botón de Lacugrove", + "block.betterend.lacugrove_chest": "Cofre de Lacugrove", + "block.betterend.lacugrove_crafting_table": "Mesa de Crafteo de Lacugrove", + "block.betterend.lacugrove_door": "Puerta de Lacugrove", + "block.betterend.lacugrove_fence": "Valla de Lacugrove", + "block.betterend.lacugrove_gate": "Puerta de Valla de Lacugrove", + "block.betterend.lacugrove_ladder": "Escalera de Lacugrove", + "block.betterend.lacugrove_log": "Tronco de Lacugrove", + "block.betterend.lacugrove_planks": "Tablones de Lacugrove", + "block.betterend.lacugrove_plate": "Placa de Presión de Lacugrove", + "block.betterend.lacugrove_sign": "Cartel de Lacugrove", + "block.betterend.lacugrove_slab": "Losa de Lacugrove", + "block.betterend.lacugrove_stairs": "Escaleras de Lacugrove", + "block.betterend.lacugrove_stripped_bark": "Corteza Despojada de Lacugrove", + "block.betterend.lacugrove_stripped_log": "Tronco Despojado de Lacugrove", + "block.betterend.lacugrove_trapdoor": "Trampilla de Lacugrove", + + "block.betterend.lacugrove_leaves": "Hojas de Lacugrove", + "block.betterend.lacugrove_sapling": "Sapling de Lacugrove", + + "biome.betterend.megalake_grove": "Arboleda del Megalago", + "biome.betterend.painted_mountains": "Montañas Pintadas", + + "block.betterend.dragon_tree_bark": "Corteza de Árbol de Dragón", + "block.betterend.dragon_tree_barrel": "Barril de Árbol de Dragón", + "block.betterend.dragon_tree_button": "Botón de Árbol de Dragón", + "block.betterend.dragon_tree_chest": "Cofre de Árbol de Dragón", + "block.betterend.dragon_tree_crafting_table": "Mesa de Crafteo de Árbol de Dragón", + "block.betterend.dragon_tree_door": "Puerta de Árbol de Dragón", + "block.betterend.dragon_tree_fence": "Valla de Árbol de Dragón", + "block.betterend.dragon_tree_gate": "Puerta de Valla de Árbol de Dragón", + "block.betterend.dragon_tree_ladder": "Escalera de Árbol de Dragón", + "block.betterend.dragon_tree_log": "Tronco de Árbol de Dragón", + "block.betterend.dragon_tree_planks": "Tablones de Árbol de Dragón", + "block.betterend.dragon_tree_plate": "Placa de Presión de Árbol de Dragón", + "block.betterend.dragon_tree_sign": "Cartel de Árbol de Dragón", + "block.betterend.dragon_tree_slab": "Losa de Árbol de Dragón", + "block.betterend.dragon_tree_stairs": "Escaleras de Árbol de Dragón", + "block.betterend.dragon_tree_stripped_bark": "Corteza Despojada de Árbol de Dragón", + "block.betterend.dragon_tree_stripped_log": "Tronco Despojado de Árbol de Dragón", + "block.betterend.dragon_tree_trapdoor": "Trampilla de Árbol de Dragón", + + "biome.betterend.shadow_forest": "Bosque Sombrío", + "block.betterend.dragon_tree_leaves": "Hojas de Árbol de Dragón", + "block.betterend.dragon_tree_sapling": "Sapling de Árbol de Dragón", + "block.betterend.shadow_grass": "Hierba Sombría", + "block.betterend.shadow_grass_path": "Camino de Hierba Sombría", + "block.betterend.shadow_plant": "Planta Sombría", + + "block.betterend.dragon_tree_bookshelf": "Librería de Árbol de Dragón", + "block.betterend.end_lotus_bookshelf": "Librería de Loto del End", + "block.betterend.lacugrove_bookshelf": "Librería de Lacugrove", + "block.betterend.mossy_glowshroom_bookshelf": "Librería de Seta Luminosa Musgosa", + "block.betterend.pythadendron_bookshelf": "Librería de Fitadendrón", + + "block.betterend.murkweed": "Hierba Oscura", + "block.betterend.needlegrass": "Hierba Punzante", + "block.betterend.twisted_vine": "Vid Retorcida", + + "block.betterend.shadow_berry": "Semillas de Balla Sombría", + "item.betterend.shadow_berry_cooked": "Balla Sombría Cocinada", + "item.betterend.shadow_berry_raw": "Balla Sombría", + "block.betterend.purple_polypore": "Políporo Morado", + + "block.betterend.cyan_moss": "Musgo Cyan", + "block.betterend.tail_moss": "Musgo Cola", + + "block.betterend.flavolite_lantern": "Linterna de Flavolita", + "block.betterend.end_stone_lantern": "Linterna de Piedra del End", + "block.betterend.violecite_lantern": "Linterna de Violecita", + + "entity.betterend.end_fish": "Pez del End", + "entity.betterend.shadow_walker": "Caminador Sombrío", + "item.betterend.spawn_egg_shadow_walker": "Huevo de Generación de Caminador Sombrío", + + "block.betterend.andesite_lantern": "Linterna de Andesita", + "block.betterend.blackstone_lantern": "Linterna de Piedra Negra", + "block.betterend.diorite_lantern": "Linterna de Diorita", + "block.betterend.granite_lantern": "Linterna de Granito", + "block.betterend.purpur_lantern": "Linterna de Purpur", + "block.betterend.quartz_lantern": "Linterna de Cuarzo", + + "item.betterend.bucket_end_fish": "Cubo de Pez del End", + "item.betterend.bucket_cubozoa": "Cubo de Cubozoa", + "item.betterend.end_fish_cooked": "Pez del End Cocinado", + "item.betterend.end_fish_raw": "Pez del End", + + "biome.betterend.amber_land": "Tierra de Ámbar", + "biome.betterend.blossoming_spires": "Agujas Florecientes", + "block.betterend.amber_grass": "Hierba de Ámber", + "block.betterend.amber_grass_path": "Camino de Hierba de Ámber", + "block.betterend.tenanea_bark": "Corteza de Tenanea", + "block.betterend.tenanea_barrel": "Barril de Tenanea", + "block.betterend.tenanea_bookshelf": "Librería de Tenanea", + "block.betterend.tenanea_button": "Botón de Tenanea", + "block.betterend.tenanea_chest": "Cofre de Tenanea", + "block.betterend.tenanea_crafting_table": "Mesa de Crafteo de Tenanea", + "block.betterend.tenanea_door": "Puerta de Tenanea", + "block.betterend.tenanea_fence": "Valla de Tenanea", + "block.betterend.tenanea_gate": "Puerta de Valla de Tenanea", + "block.betterend.tenanea_ladder": "Escalera de Tenanea", + "block.betterend.tenanea_leaves": "Hojas de Tenanea", + "block.betterend.tenanea_log": "Tronco de Tenanea", + "block.betterend.tenanea_planks": "Tablones de Tenanea", + "block.betterend.tenanea_plate": "Placa de Presión de Tenanea", + "block.betterend.tenanea_sapling": "Sapling de Tenanea", + "block.betterend.tenanea_sign": "Cartel de Tenanea", + "block.betterend.tenanea_slab": "Losa de Tenanea", + "block.betterend.tenanea_stairs": "Escaleras de Tenanea", + "block.betterend.tenanea_stripped_bark": "Corteza Despojada de Tenanea", + "block.betterend.tenanea_stripped_log": "Tronco Despojado de Tenanea", + "block.betterend.tenanea_trapdoor": "Trampilla de Tenanea", + + "block.betterend.amber_block": "Bloque de Ámbar", + "block.betterend.amber_ore": "Mena de Ámbar", + "item.betterend.amber_gem": "Gema de Ámbar", + "item.betterend.raw_amber": "Ámbar Crudo", + "block.betterend.tenanea_flowers": "Flores de Tenanea", + "block.betterend.tenanea_outer_leaves": "Hojas Exteriores de Tenanea", + + "block.betterend.pink_moss": "Musgo Rosa", + "block.betterend.pink_moss_path": "Camino de Musgo Rosa", + + "block.betterend.twisted_moss": "Musgo Retorcido", + + "block.betterend.bulb_vine": "Vid de Bulbo", + "block.betterend.bulb_vine_seed": "Semilla de Vid de Bulbo", + "item.betterend.glowing_bulb": "Bulbo Brillante", + + "block.betterend.iron_bulb_lantern": "Linterna de Bulbo de Hierro", + "block.betterend.iron_bulb_lantern_black": "Linterna de Bulbo de Hierro Negra", + "block.betterend.iron_bulb_lantern_blue": "Linterna de Bulbo de Hierro Azul", + "block.betterend.iron_bulb_lantern_brown": "Linterna de Bulbo de Hierro Marrón", + "block.betterend.iron_bulb_lantern_cyan": "Linterna de Bulbo de Hierro Cyan", + "block.betterend.iron_bulb_lantern_gray": "Linterna de Bulbo de Hierro Gris", + "block.betterend.iron_bulb_lantern_green": "Linterna de Bulbo de Hierro Verde", + "block.betterend.iron_bulb_lantern_light_blue": "Linterna de Bulbo de Hierro Azul Claro", + "block.betterend.iron_bulb_lantern_light_gray": "Linterna de Bulbo de Hierro Gris Claro", + "block.betterend.iron_bulb_lantern_lime": "Linterna de Bulbo de Hierro Lima", + "block.betterend.iron_bulb_lantern_magenta": "Linterna de Bulbo de Hierro Magenta", + "block.betterend.iron_bulb_lantern_orange": "Linterna de Bulbo de Hierro Naranja", + "block.betterend.iron_bulb_lantern_pink": "Linterna de Bulbo de Hierro Rosa", + "block.betterend.iron_bulb_lantern_purple": "Linterna de Bulbo de Hierro Morada", + "block.betterend.iron_bulb_lantern_red": "Linterna de Bulbo de Hierro Roja", + "block.betterend.iron_bulb_lantern_white": "Linterna de Bulbo de Hierro Blanca", + "block.betterend.iron_bulb_lantern_yellow": "Linterna de Bulbo de Hierro Amarilla", + + "block.betterend.thallasium_bulb_lantern": "Linterna de Bulbo de Talismanio", + "block.betterend.thallasium_bulb_lantern_black": "Linterna de Bulbo de Talismanio Negra", + "block.betterend.thallasium_bulb_lantern_blue": "Linterna de Bulbo de Talismanio Azul", + "block.betterend.thallasium_bulb_lantern_brown": "Linterna de Bulbo de Talismanio Marrón", + "block.betterend.thallasium_bulb_lantern_cyan": "Linterna de Bulbo de Talismanio Cyan", + "block.betterend.thallasium_bulb_lantern_gray": "Linterna de Bulbo de Talismanio Gris", + "block.betterend.thallasium_bulb_lantern_green": "Linterna de Bulbo de Talismanio Verde", + "block.betterend.thallasium_bulb_lantern_light_blue": "Linterna de Bulbo de Talismanio Azul Claro", + "block.betterend.thallasium_bulb_lantern_light_gray": "Linterna de Bulbo de Talismanio Gris Claro", + "block.betterend.thallasium_bulb_lantern_lime": "Linterna de Bulbo de Talismanio Lima", + "block.betterend.thallasium_bulb_lantern_magenta": "Linterna de Bulbo de Talismanio Magenta", + "block.betterend.thallasium_bulb_lantern_orange": "Linterna de Bulbo de Talismanio Naranja", + "block.betterend.thallasium_bulb_lantern_pink": "Linterna de Bulbo de Talismanio Rosa", + "block.betterend.thallasium_bulb_lantern_purple": "Linterna de Bulbo de Talismanio Morada", + "block.betterend.thallasium_bulb_lantern_red": "Linterna de Bulbo de Talismanio Roja", + "block.betterend.thallasium_bulb_lantern_white": "Linterna de Bulbo de Talismanio Blanca", + "block.betterend.thallasium_bulb_lantern_yellow": "Linterna de Bulbo de Talismanio Amarilla", + + "block.betterend.bushy_grass": "Hierba Tupida", + + "block.betterend.brimstone": "Azufre", + "block.betterend.sulphuric_rock": "Roca Sulfúrica", + "block.betterend.sulphuric_rock_bricks": "Ladrillos de Roca Sulfúrica", + "block.betterend.sulphuric_rock_bricks_slab": "Losa de Ladrillos de Roca Sulfúrica", + "block.betterend.sulphuric_rock_bricks_stairs": "Escaleras de Ladrillos de Roca Sulfúrica", + "block.betterend.sulphuric_rock_bricks_wall": "Muro de Ladrillos de Roca Sulfúrica", + "block.betterend.sulphuric_rock_button": "Botón de Roca Sulfúrica", + "block.betterend.sulphuric_rock_lantern": "Linterna de Roca Sulfúrica", + "block.betterend.sulphuric_rock_pedestal": "Pedestal de Roca Sulfúrica", + "block.betterend.sulphuric_rock_pillar": "Pilar de Roca Sulfúrica", + "block.betterend.sulphuric_rock_plate": "Placa de Presión de Roca Sulfúrica", + "block.betterend.sulphuric_rock_polished": "Roca Sulfúrica Pulida", + "block.betterend.sulphuric_rock_slab": "Losa de Roca Sulfúrica", + "block.betterend.sulphuric_rock_stairs": "Escaleras de Roca Sulfúrica", + "block.betterend.sulphuric_rock_tiles": "Casillas de Roca Sulfúrica", + "block.betterend.sulphuric_rock_wall": "Muro de Roca Sulfúrica", + "block.betterend.sulphur_crystal": "Cristal de Sulfuro", + "item.betterend.crystalline_sulphur": "Sulfuro", + + "biome.betterend.sulphur_springs": "Manantiales de Sulfuro", + "block.betterend.hydralux_petal_block": "Bloque de Pétalos de Hidrálux", + "block.betterend.hydralux_petal_block_black": "Bloque de Pétalos Negro", + "block.betterend.hydralux_petal_block_blue": "Bloque de Pétalos Azul", + "block.betterend.hydralux_petal_block_brown": "Bloque de Pétalos Marrón", + "block.betterend.hydralux_petal_block_cyan": "Bloque de Pétalos Cyan", + "block.betterend.hydralux_petal_block_gray": "Bloque de Pétalos Gris", + "block.betterend.hydralux_petal_block_green": "Bloque de Pétalos Verde", + "block.betterend.hydralux_petal_block_light_blue": "Bloque de Pétalos Azul Claro", + "block.betterend.hydralux_petal_block_light_gray": "Bloque de Pétalos Gris Claro", + "block.betterend.hydralux_petal_block_lime": "Bloque de Pétalos Lima", + "block.betterend.hydralux_petal_block_magenta": "Bloque de Pétalos Magenta", + "block.betterend.hydralux_petal_block_orange": "Bloque de Pétalos Naranja", + "block.betterend.hydralux_petal_block_pink": "Bloque de Pétalos Rosa", + "block.betterend.hydralux_petal_block_purple": "Bloque de Pétalos Morado", + "block.betterend.hydralux_petal_block_red": "Bloque de Pétalos Rojo", + "block.betterend.hydralux_petal_block_white": "Bloque de Pétalos Blanco", + "block.betterend.hydralux_petal_block_yellow": "Bloque de Pétalos Amarillo", + "block.betterend.hydralux_sapling": "Sapling de Hidrálux", + "block.betterend.hydrothermal_vent": "Ventilación Hidrotermal", + "item.betterend.hydralux_petal": "Pétalo de Hidrálux", + "item.betterend.enchanted_petal": "Pétalo Encantado", + + "block.betterend.menger_sponge": "Esponja Menguer", + "block.betterend.menger_sponge_wet": "Esponja Menguer Mojadar", + "block.betterend.tube_worm": "Tubo de Gusano", + + "block.betterend.charnia_cyan": "Charnia Cyan", + "block.betterend.charnia_light_blue": "Charnia Azul Claro", + "block.betterend.charnia_orange": "Charnia Naranja", + "block.betterend.charnia_purple": "Charnia Morado", + "block.betterend.charnia_red": "Charnia Rojo", + + "entity.betterend.cubozoa": "Cubozoa", + "item.betterend.spawn_egg_cubozoa": "Huevo de Generación de Cubozoa", + + "item.betterend.gelatine": "Gelatina", + "item.betterend.sweet_berry_jelly": "Gelatina de Balla Dulce", + "item.betterend.shadow_berry_jelly": "Gelatina de Balla Sombría", + + "block.betterend.amber_moss": "Musgo de Ámbar", + "block.betterend.amber_moss_path": "Camino de Musgo de Ámbar", + "block.betterend.helix_tree_bark": "Corteza de Árbol Helix", + "block.betterend.helix_tree_barrel": "Barril de Árbol Helix", + "block.betterend.helix_tree_bookshelf": "Librería de Árbol Helix", + "block.betterend.helix_tree_button": "Botón de Árbol Helix", + "block.betterend.helix_tree_chest": "Cofre de Helix Tree Chest", + "block.betterend.helix_tree_crafting_table": "Mesa de Crafteo de Árbol Helix", + "block.betterend.helix_tree_door": "Puerta de Árbol Helix", + "block.betterend.helix_tree_fence": "Valla de Árbol Helix", + "block.betterend.helix_tree_gate": "Puerta de Valla de Árbol Helix", + "block.betterend.helix_tree_ladder": "Escalera de Árbol Helix", + "block.betterend.helix_tree_leaves": "Hojas de Árbol Helix", + "block.betterend.helix_tree_log": "Tronco de Árbol Helix", + "block.betterend.helix_tree_planks": "Tablones de Árbol Helix", + "block.betterend.helix_tree_plate": "Placa de Presión de Árbol Helix", + "block.betterend.helix_tree_sapling": "Sapling de Árbol Helix", + "block.betterend.helix_tree_sign": "Cartel de Árbol Helix", + "block.betterend.helix_tree_slab": "Losa de Árbol Helix", + "block.betterend.helix_tree_stairs": "Escaleras de Árbol Helix", + "block.betterend.helix_tree_stripped_bark": "Corteza Despojada de Árbol Helix", + "block.betterend.helix_tree_stripped_log": "Tronco Despojado de Árbol Helix", + "block.betterend.helix_tree_trapdoor": "Trampilla de Árbol Helix", + "block.betterend.lanceleaf": "Hoja Lanza", + "block.betterend.lanceleaf_seed": "Semilla de Hoja Lanza", + "block.betterend.hydralux": "Hidrálux", + "block.betterend.helix_tree_luminophor": "Luminóforo de Lanceleaf", + + "block.betterend.glowing_pillar_leaves": "Hojas de Pilar Brillante", + "block.betterend.glowing_pillar_luminophor": "Luminóforo de Pilar Brillante", + "block.betterend.glowing_pillar_roots": "Raíces de Pilar Brillante", + "block.betterend.glowing_pillar_seed": "Semilla de Pilar Brillante", + + "biome.betterend.ice_starfield": "Campo Estelar de Hielo", + + "block.betterend.ancient_emerald_ice": "Hielo de Esmeralda Antiguo", + "block.betterend.dense_emerald_ice": "Hielo de Esmeralda Denso", + "block.betterend.dense_snow": "Nieve Densa", + "block.betterend.emerald_ice": "Hielo de Esmeralda", + + "block.betterend.bulb_moss": "Musgo de Bulbo", + + "block.betterend.charnia_green": "Charnia Verde", + "block.betterend.vent_bubble_column": "Ventilación de Columna Burbuja", + "block.betterend.respawn_obelisk": "Obelisco de Reaparición", + "message.betterend.set_spawn": "\u00A7b\u00A7lTu punto de reaparición se ha configurado aquí", + "message.betterend.fail_spawn": "\u00A7c\u00A7lNecesitas sostener 6 Gemas de Ámbar para configurar tu punto de reaparición", + + "block.betterend.dragon_tree_composter": "Compostador de Árbol de Dragón", + "block.betterend.end_lotus_composter": "Compostador de Loto del End", + "block.betterend.helix_tree_composter": "Compostador de Árbol Helix", + "block.betterend.lacugrove_composter": "Compostador de Lacugrove", + "block.betterend.mossy_glowshroom_composter": "Compostador de Seta Luminosa Musgosa", + "block.betterend.pythadendron_composter": "Compostador de Fitadendrón", + "block.betterend.tenanea_composter": "Compostador de Tenanea", + + "biome.betterend.old_bulbis_gardens": "Jardín de Bulbis Viejos", + "block.betterend.ivis_moss": "Musgo Ivis", + "block.betterend.ivis_vine": "Vid Ivis", + "block.betterend.silk_moth_nest": "Nido de Polilla de Seda", + + "block.betterend.umbrella_tree_bark": "Corteza de Árbol Paraguas", + "block.betterend.umbrella_tree_barrel": "Barril de Árbol Paraguas", + "block.betterend.umbrella_tree_bookshelf": "Librería de Árbol Paraguas", + "block.betterend.umbrella_tree_button": "Botón de Árbol Paraguas", + "block.betterend.umbrella_tree_chest": "Cofre de Árbol Paraguas", + "block.betterend.umbrella_tree_composter": "Compostador de Árbol Paraguas", + "block.betterend.umbrella_tree_crafting_table": "Mesa de Crafteo de Árbol Paraguas", + "block.betterend.umbrella_tree_door": "Puerta de Árbol Paraguas", + "block.betterend.umbrella_tree_fence": "Valla de Árbol Paraguas", + "block.betterend.umbrella_tree_gate": "Puerta de Valla de Árbol Paraguas", + "block.betterend.umbrella_tree_ladder": "Escalera de Árbol Paraguas", + "block.betterend.umbrella_tree_log": "Tronco de Árbol Paraguas", + "block.betterend.umbrella_tree_planks": "Tablones de Árbol Paraguas", + "block.betterend.umbrella_tree_plate": "Placa de Presión de Árbol Paraguas", + "block.betterend.umbrella_tree_sign": "Cartel de Árbol Paraguas", + "block.betterend.umbrella_tree_slab": "Losa de Árbol Paraguas", + "block.betterend.umbrella_tree_stairs": "Escaleras de Árbol Paraguas", + "block.betterend.umbrella_tree_stripped_bark": "Corteza Despojada de Árbol Paraguas", + "block.betterend.umbrella_tree_stripped_log": "Tronco Despojado de Árbol Paraguas", + "block.betterend.umbrella_tree_trapdoor": "Trampilla de Árbol Paraguas", + "block.betterend.umbrella_tree_membrane": "Membrana de Árbol Paraguas", + + "biome.betterend.umbrella_jungle": "Jungla Paraguas", + "block.betterend.jungle_grass": "Hierba de Jungla", + "block.betterend.jungle_moss": "Musgo de Jungla", + "block.betterend.jungle_moss_path": "Camino de Musgo de Jungla", + "block.betterend.small_jellyshroom": "Seta Gelatinosa Pequeña", + "block.betterend.twisted_umbrella_moss": "Musgo de Paraguas Retorcido", + "block.betterend.twisted_umbrella_moss_tall": "Musgo de Paraguas Retorcido Alto", + "block.betterend.umbrella_tree_cluster": "Racimo de Árbol Paraguas", + "block.betterend.umbrella_tree_cluster_empty": "Racimo de Árbol Paraguas Vacío", + "block.betterend.jungle_vine": "Vid de Jungla", + "block.betterend.jungle_fern": "Helecho de Jungla", + + "block.betterend.jellyshroom_bark": "Corteza de Seta Gelatinosa", + "block.betterend.jellyshroom_barrel": "Barril de Seta Gelatinosa", + "block.betterend.jellyshroom_bookshelf": "Librería de Seta Gelatinosa", + "block.betterend.jellyshroom_button": "Botón de Seta Gelatinosa", + "block.betterend.jellyshroom_cap_purple": "Copa de Seta Gelatinosa", + "block.betterend.jellyshroom_chest": "Cofre de Seta Gelatinosa", + "block.betterend.jellyshroom_composter": "Compostador de Seta Gelatinosa", + "block.betterend.jellyshroom_crafting_table": "Mesa de Crafteo de Seta Gelatinosa", + "block.betterend.jellyshroom_door": "Puerta de Seta Gelatinosa", + "block.betterend.jellyshroom_fence": "Valla de Seta Gelatinosa", + "block.betterend.jellyshroom_gate": "Puerta de Valla de Seta Gelatinosa", + "block.betterend.jellyshroom_ladder": "Escalera de Seta Gelatinosa", + "block.betterend.jellyshroom_log": "Tronco de Seta Gelatinosa", + "block.betterend.jellyshroom_planks": "Tablones de Seta Gelatinosa", + "block.betterend.jellyshroom_plate": "Placa de Presión de Seta Gelatinosa", + "block.betterend.jellyshroom_sign": "Cartel de Seta Gelatinosa", + "block.betterend.jellyshroom_slab": "Losa de Seta Gelatinosa", + "block.betterend.jellyshroom_stairs": "Escaleras de Seta Gelatinosa", + "block.betterend.jellyshroom_stripped_bark": "Corteza Despojada de Seta Gelatinosa", + "block.betterend.jellyshroom_stripped_log": "Tronco Despojado de Seta Gelatinosa", + "block.betterend.jellyshroom_trapdoor": "Trampilla de Seta Gelatinosa", + + "biome.betterend.eterial_grove": "Arboleda Eterial", + "block.betterend.umbrella_tree_sapling": "Sapling de Árbol Sombrilla", + "item.betterend.umbrella_cluster_juice": "Zumo de Racimo de Paraguas", + "block.betterend.blossom_berry_seed": "Semilla de Balla Floreciente", + "item.betterend.blossom_berry": "Balla Floreciente", + + "biome.betterend.nightshade_redwoods": "Secuoyas Nocturnas", + "block.betterend.nightshade_moss": "Musgo Nocturno", + + "biome.betterend.glowing_grasslands": "Tierras de Hierba Brillante", + "block.betterend.blooming_cooksonia": "Cooksonia Floreciente", + "block.betterend.fracturn": "Fracturno", + "block.betterend.lumecorn": "Lumecornia", + "block.betterend.salteago": "Salteago", + "block.betterend.vaiolush_fern": "Helecho Exhuberante", + "entity.betterend.silk_moth": "Polilla de eda", + "item.betterend.silk_fiber": "Fibra de Seda", + "item.betterend.spawn_egg_silk_moth": "Huevo de Generación de Polilla de Seda", + + "block.betterend.thallasium_ore": "Mena de Talismanio", + "item.betterend.thallasium_axe": "Hacha de Talismanio", + "item.betterend.thallasium_hoe": "Azada de Talismanio", + "item.betterend.thallasium_ingot": "Lingote de Talismanio", + "item.betterend.thallasium_pickaxe": "Pico de Talismanio", + "item.betterend.thallasium_shovel": "Pala de Talismanio", + "item.betterend.thallasium_sword": "Espada de Talismanio", + "block.betterend.thallasium_block": "Bloque de Talismanio", + + "block.betterend.thallasium_bars": "Barras de Talismanio", + "block.betterend.thallasium_door": "Puerta de Talismanio", + "block.betterend.thallasium_plate": "Placa de Presión de Talismanio", + "block.betterend.thallasium_tile": "Casilla de Talismanio", + "block.betterend.thallasium_trapdoor": "Trampilla de Talismanio", + + "block.betterend.lumecorn_seed": "Semilla de Lumecornia", + "item.betterend.lumecorn_rod": "Vara de Lumecornia", + "block.betterend.thallasium_chandelier": "Candelabro de Talismanio", + + "block.betterend.thallasium_anvil": "Yunque de Talismanio", + "block.betterend.thallasium_chain": "Cadena de Talismanio", + "block.betterend.thallasium_slab": "Losa de Talismanio", + "block.betterend.thallasium_stairs": "Escaleras de Talismanio", + + "block.betterend.gold_chandelier": "Candelabro de Oro", + "block.betterend.iron_chandelier": "Candelabro de Hierro", + "item.betterend.thallasium_nugget": "Pepita de Talismanio", + + "block.betterend.terminite_anvil": "Yunque de Terminita", + "block.betterend.terminite_bars": "Barras de Terminita", + + "block.betterend.terminite_bulb_lantern": "Linterna de Bulbo de Terminita", + "block.betterend.terminite_bulb_lantern_black": "Linterna de Bulbo de Terminita Negra", + "block.betterend.terminite_bulb_lantern_blue": "Linterna de Bulbo de Terminita Azul", + "block.betterend.terminite_bulb_lantern_brown": "Linterna de Bulbo de Terminita Marrón", + "block.betterend.terminite_bulb_lantern_cyan": "Linterna de Bulbo de Terminita Cyan", + "block.betterend.terminite_bulb_lantern_gray": "Linterna de Bulbo de Terminita Gris", + "block.betterend.terminite_bulb_lantern_green": "Linterna de Bulbo de Terminita Verde", + "block.betterend.terminite_bulb_lantern_light_blue": "Linterna de Bulbo de Terminita Azul Claro", + "block.betterend.terminite_bulb_lantern_light_gray": "Linterna de Bulbo de Terminita Gris Claro", + "block.betterend.terminite_bulb_lantern_lime": "Linterna de Bulbo de Terminita Lima", + "block.betterend.terminite_bulb_lantern_magenta": "Linterna de Bulbo de Terminita Magenta", + "block.betterend.terminite_bulb_lantern_orange": "Linterna de Bulbo de Terminita Naranja", + "block.betterend.terminite_bulb_lantern_pink": "Linterna de Bulbo de Terminita Rosa", + "block.betterend.terminite_bulb_lantern_purple": "Linterna de Bulbo de Terminita Morada", + "block.betterend.terminite_bulb_lantern_red": "Linterna de Bulbo de Terminita Roja", + "block.betterend.terminite_bulb_lantern_white": "Linterna de Bulbo de Terminita Blanca", + "block.betterend.terminite_bulb_lantern_yellow": "Linterna de Bulbo de Terminita Amarilla", + + "block.betterend.terminite_chain": "adena de Terminita", + "block.betterend.terminite_chandelier": "Candelabro de Terminita", + "block.betterend.terminite_door": "Puerta de Terminita", + "block.betterend.terminite_plate": "Placa de Presión de Terminita", + "block.betterend.terminite_slab": "Losa de Terminita", + "block.betterend.terminite_stairs": "Escaleras de Terminita", + "block.betterend.terminite_tile": "Casilla de Terminita", + "block.betterend.terminite_trapdoor": "Trampilla de Terminita", + "item.betterend.terminite_nugget": "Pepita de Terminita", + "item.betterend.thallasium_boots": "Botas de Talismanio", + "item.betterend.thallasium_chestplate": "Pechera de Talismanio", + "item.betterend.thallasium_hammer": "Martillo de Talismanio", + "item.betterend.thallasium_helmet": "Casco de Talismanio", + "item.betterend.thallasium_leggings": "Grebas de Talismanio", + "block.betterend.missing_tile": "Casilla Faltante", + "block.betterend.charcoal_block": "Bloque de Carbón Vegetal", + "block.betterend.end_stone_furnace": "Horno de Piedra del End", + "block.betterend.flavolite_furnace": "Horno de Flavolita", + "block.betterend.sulphuric_rock_furnace": "Horno de Roca Sulfúrica", + "block.betterend.violecite_furnace": "Horno de Violecita", + + "item.betterend.terminite_axe_head": "Cabeza de Hacha de Terminita", + "item.betterend.terminite_hoe_head": "Cabeza de Azada de Terminita", + "item.betterend.terminite_pickaxe_head": "Cabeza de Pico de Terminita", + "item.betterend.terminite_shovel_head": "Cabeza de Pala de Terminita", + "item.betterend.terminite_sword_blade": "Hoja de Espada de Terminita", + "item.betterend.terminite_sword_handle": "Mango de Espada de Terminita", + "item.betterend.thallasium_axe_head": "Cabeza de Hacha de Talismanio", + "item.betterend.thallasium_hoe_head": "Cabeza de Azada de Talismanio", + "item.betterend.thallasium_pickaxe_head": "Cabeza de Pico de Talismanio", + "item.betterend.thallasium_shovel_head": "Cabeza de Pala de Talismanio", + "item.betterend.thallasium_sword_blade": "Hoja de Espada de Talismanio", + "item.betterend.thallasium_sword_handle": "Mango de Espada de Talismanio", + "block.betterend.aeternium_anvil": "Yunque de Aeternio", + + "biome.betterend.dragon_graveyards": "Cementerios de Dragones", + "biome.betterend.dry_shrubland": "Matorral Seco", + "block.betterend.aeridium": "Aeridio", + "block.betterend.amaranita_cap": "Copa de Amaranita", + "block.betterend.amaranita_fur": "Pelo de Amaranita", + "block.betterend.amaranita_hymenophore": "Himenóforo de Amarinita", + "block.betterend.amaranita_hyphae": "Hifas de Amaranita", + "block.betterend.amaranita_lantern": "Linterna de Amaranita", + "block.betterend.amaranita_stem": "Tallo de Amaranita", + "block.betterend.clawfern": "Helecho de Garra", + "block.betterend.globulagus": "Globulagus", + "block.betterend.lamellarium": "Lamelario", + "block.betterend.large_amaranita_mushroom": "Seta de Amaranita Grande", + "block.betterend.lutebus": "Lutebús", + "block.betterend.mossy_bone": "Hueso Musgoso", + "block.betterend.mossy_obsidian": "Obsidiana Musgosa", + "block.betterend.orango": "Orango", + "block.betterend.rutiscus": "Rútiscus", + "block.betterend.rutiscus_path": "Camino de Rústicus", + "block.betterend.sangnum": "Sángnum", + "block.betterend.sangnum_path": "Camino de Sángnum", + "block.betterend.small_amaranita_mushroom": "Seta de Amarita Pequeña", + + "block.betterend.amber_root_seed": "Semilla de Raíz de Ámbar", + "block.betterend.azure_jadestone": "Piedra Jade Azur", + "block.betterend.azure_jadestone_bricks": "Ladrillos de Piedra Jade Azur", + "block.betterend.azure_jadestone_bricks_slab": "Losa de Ladrillos de Piedra Jade Azur", + "block.betterend.azure_jadestone_bricks_stairs": "Escaleras de Ladrillos de Piedra Jade Azur", + "block.betterend.azure_jadestone_bricks_wall": "Muro de Ladrillos de Piedra Jade Azur", + "block.betterend.azure_jadestone_button": "Botón de Piedra Jade Azur", + "block.betterend.azure_jadestone_furnace": "Horno de Piedra Jade Azur", + "block.betterend.azure_jadestone_lantern": "Linterna de Piedra Jade Azur", + "block.betterend.azure_jadestone_pedestal": "Pedestal de Piedra Jade Azur", + "block.betterend.azure_jadestone_pillar": "Pilar de Piedra Jade Azur", + "block.betterend.azure_jadestone_plate": "Placa de Presión de Piedra Jade Azur", + "block.betterend.azure_jadestone_polished": "Piedra Jade Azur Pulida", + "block.betterend.azure_jadestone_slab": "Losa de Piedra Jade Azur", + "block.betterend.azure_jadestone_stairs": "Escaleras de Piedra Jade Azur", + "block.betterend.azure_jadestone_tiles": "Casillas de Piedra Jade Azur", + "block.betterend.azure_jadestone_wall": "Muro de Piedra Jade Azur", + "block.betterend.chorus_mushroom_seed": "Semilla de Seta Coral", + "block.betterend.end_stone_stalactite": "Estalactita de Piedra del End", + "block.betterend.end_stone_stalactite_cavemoss": "Estalactita de Piedrad el End con Musgo de Cueva", + "block.betterend.pearlberry_seed": "Semilla de Balla Perla", + "block.betterend.rubinea": "Rubinea", + "block.betterend.sandy_jadestone": "Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_bricks": "Ladrillos de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_slab": "Losa de Ladrillos de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_stairs": "Escaleras de Ladrillos de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_wall": "Muro de Ladrillos de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_button": "Botón de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_furnace": "Horno de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_lantern": "Linterna de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_pedestal": "Pedestal de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_pillar": "Pilar de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_plate": "Placa de Presión de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_polished": "Piedra Jade Arenosa Pulida", + "block.betterend.sandy_jadestone_slab": "Losa de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_stairs": "Escaleras de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_tiles": "Casillas de Piedra Jade Arenosa", + "block.betterend.sandy_jadestone_wall": "Muro de Piedra Jade Arenosa", + "block.betterend.smaragdant_crystal": "Cristal de Smaragdant", + "block.betterend.smaragdant_crystal_shard": "Fragemnto de Cristal de Smaragdant", + "block.betterend.virid_jadestone": "Piedra Jade Virida", + "block.betterend.virid_jadestone_bricks": "Ladrillos de Piedra Jade Virida", + "block.betterend.virid_jadestone_bricks_slab": "Losa de Ladrillos de Piedra Jade Virida", + "block.betterend.virid_jadestone_bricks_stairs": "Escaleras de Ladrillos de Piedra Jade Virida", + "block.betterend.virid_jadestone_bricks_wall": "Muro de Ladrillos de Piedra Jade Virida", + "block.betterend.virid_jadestone_button": "Botón de Piedra Jade Virida", + "block.betterend.virid_jadestone_furnace": "Horno de Piedra Jade Virida", + "block.betterend.virid_jadestone_lantern": "Linterna de Piedra Jade Virida", + "block.betterend.virid_jadestone_pedestal": "Pedestal de Piedra Jade Virida", + "block.betterend.virid_jadestone_pillar": "Pilar de Piedra Jade Virida", + "block.betterend.virid_jadestone_plate": "Placa de Presión de Piedra Jade Virida", + "block.betterend.virid_jadestone_polished": "Piedra Jade Virida Pulida", + "block.betterend.virid_jadestone_slab": "Losa de Piedra Jade Virida", + "block.betterend.virid_jadestone_stairs": "Escaleras de Piedra Jade Virida", + "block.betterend.virid_jadestone_tiles": "Casillas de Piedra Jade Virida", + "block.betterend.virid_jadestone_wall": "Muro de Piedra Jade Virida", + "item.betterend.amber_root_raw": "Raíz de Ámbar Cruda", + "item.betterend.chorus_mushroom_cooked": "Seta Coral Cocinada", + "item.betterend.chorus_mushroom_raw": "Seta Coral Cruda", + + "biome.betterend.empty_aurora_cave": "Cuava Aurora Vacía", + "biome.betterend.empty_end_cave": "Cueva del End Vacía", + "biome.betterend.empty_smaragdant_cave": "Cueva de Smagrdant Vacía", + "biome.betterend.lush_aurora_cave": "Cueva Aurora Exhuberante", + "biome.betterend.lush_smaragdant_cave": "Cueva Smagrdant Exhuberante", + + "block.betterend.dragon_bone_block": "Bloque de Hueso de Dragó", + "block.betterend.dragon_bone_slab": "Losa de Hueso de Dragón", + "block.betterend.dragon_bone_stairs": "Escaleras de Hueso de Dragón", + "block.betterend.mossy_dragon_bone": "Hueso de Dragón Musgoso", + + "biome.betterend.lantern_woods": "Bosque Linterna", + "block.betterend.filalux": "Filálux", + "block.betterend.filalux_lantern": "Linterna de Filálux", + "block.betterend.filalux_wings": "Alas de Filálux", + "block.betterend.lucernia_bark": "Corteza de Lucernia", + "block.betterend.lucernia_barrel": "Barril de Lucernia", + "block.betterend.lucernia_bookshelf": "Librería de Lucernia", + "block.betterend.lucernia_button": "Botón de Lucernia", + "block.betterend.lucernia_chest": "Cofre de Lucernia", + "block.betterend.lucernia_composter": "Compostador de Lucernia", + "block.betterend.lucernia_crafting_table": "Mesa de Crafteo e Lucernia", + "block.betterend.lucernia_door": "Puerta de Lucernia", + "block.betterend.lucernia_fence": "Valla de Lucernia", + "block.betterend.lucernia_gate": "Puerta de Valla de Lucernia", + "block.betterend.lucernia_ladder": "Escalera de Lucernia", + "block.betterend.lucernia_leaves": "Hojas de Lucernia", + "block.betterend.lucernia_log": "Tronco de Lucernia", + "block.betterend.lucernia_outer_leaves": "Hojas Exteriores de Lucernia", + "block.betterend.lucernia_planks": "Tablones de Lucernia", + "block.betterend.lucernia_plate": "Placa de Presión de Lucernia", + "block.betterend.lucernia_sapling": "Sapling de Lucernia", + "block.betterend.lucernia_sign": "Cartel de Lucernia", + "block.betterend.lucernia_slab": "Losa de Lucernia", + "block.betterend.lucernia_stairs": "Escaleras de Lucernia", + "block.betterend.lucernia_stripped_bark": "Corteza Despojada de Lucernia", + "block.betterend.lucernia_stripped_log": "Tronco Despojado de Lucernia", + "block.betterend.lucernia_trapdoor": "Trampilla de Lucernia", + + "block.betterend.aurant_polypore": "Políporo Aurante", + "block.betterend.bolux_mushroom": "Seta Bólux", + "block.betterend.flamaea": "Flamaea", + "block.betterend.pond_anemone": "Anémona de Pantano", + "block.betterend.ruscus": "Ruscus", + "item.betterend.bolux_mushroom_cooked": "Seta Bólux Cocinada", + + "block.betterend.silk_moth_hive": "Colmena de Polilla de Seda", + "item.betterend.silk_moth_matrix": "Matrix de Polilla de Seda", + + "biome.betterend.neon_oasis": "Oasis Neón", + "block.betterend.cave_pumpkin": "Calabaza de Cueva", + "block.betterend.cave_pumpkin_seed": "Semilla de Calabaza de Cueva", + "block.betterend.magnula": "Magnula", + "block.betterend.neon_cactus": "Cactus Neón", + "item.betterend.cave_pumpkin_pie": "Tarta de Calabaza de Cueva", + + "item.betterend.music_disc_strange_and_alien": "§bDisco Musical§r", + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r", + "item.betterend.music_disc_grasping_at_stars": "§bDisco Musical§r", + "item.betterend.music_disc_grasping_at_stars.desc": "§5Firel§r - §fGrasping At Stars§r", + "item.betterend.music_disc_endseeker": "§bDisco Musical§r", + "item.betterend.music_disc_endseeker.desc": "§5Firel§r - §fEndseeker§r", + "item.betterend.music_disc_eo_dracona": "§bDisco Musical§r", + "item.betterend.music_disc_eo_dracona.desc": "§5Firel§r - §fEo Dracona§r", + + "block.betterend.hydralux_petal_block_amber": "Bloque de Pétalo Ámbar", + "block.betterend.hydralux_petal_block_beige": "Bloque de Pétalo Beige", + "block.betterend.hydralux_petal_block_cream": "Bloque de Pétalo Crema", + "block.betterend.hydralux_petal_block_dark_green": "Bloque de Pétalo Verde Oscuro", + "block.betterend.hydralux_petal_block_forest_green": "Bloque de Pétalo Verde Bosque", + "block.betterend.hydralux_petal_block_hot_pink": "Bloque de Pétalo Rosa Fuerte", + "block.betterend.hydralux_petal_block_indigo": "Bloque de Pétalo Índigo", + "block.betterend.hydralux_petal_block_maroon": "Bloque de Pétalo Granate", + "block.betterend.hydralux_petal_block_navy": "Bloque de Pétalo Azul Marino", + "block.betterend.hydralux_petal_block_olive": "Bloque de Pétalo Oliva", + "block.betterend.hydralux_petal_block_pale_green": "Bloque de Pétalo Verde Pálido", + "block.betterend.hydralux_petal_block_pale_pink": "Bloque de Pétalo Rosa Pálido", + "block.betterend.hydralux_petal_block_pale_yellow": "Bloque de Pétalo Amarillo Pálido", + "block.betterend.hydralux_petal_block_sky_blue": "Bloque de Pétalo Azul Cielo", + "block.betterend.hydralux_petal_block_slate_gray": "Bloque de Pétalo Gris Pizarra", + "block.betterend.hydralux_petal_block_violet": "Bloque de Pétalo Violeta", + + "block.betterend.smaragdant_crystal_bricks": "Ladrillos de Smaragdant", + "block.betterend.smaragdant_crystal_bricks_slab": "Losa de Ladrillos de Smaragdant", + "block.betterend.smaragdant_crystal_bricks_stairs": "Escaleras de Ladrillos de Smaragdant", + "block.betterend.smaragdant_crystal_bricks_wall": "Muro de Ladrillos de Smaragdant", + "block.betterend.smaragdant_crystal_pedestal": "Pedestal de Smaragdant", + "block.betterend.smaragdant_crystal_pillar": "Pilar de Smaragdant", + "block.betterend.smaragdant_crystal_polished": "Smaragdant Pulido", + "block.betterend.smaragdant_crystal_slab": "Losa de Smaragdant", + "block.betterend.smaragdant_crystal_stairs": "Escaleras de Smaragdant", + "block.betterend.smaragdant_crystal_tiles": "Casillas de Smaragdant", + "block.betterend.smaragdant_crystal_wall": "Muro de Smaragdant", + "message.betterend.anvil_damage": "§cDaño", + + "block.betterend.neon_cactus_block": "Bloque de Cactus Neón", + "block.betterend.neon_cactus_slab": "Losa de Cactus Neón", + "block.betterend.neon_cactus_stairs": "Escaleras de Cactus Neón", + "biome.betterend.jade_cave": "Cueva de Jade", + "item.betterend.blossom_berry_jelly": "Gelatina de Balla Floreciente", + "item.betterend.aeternium_forged_plate": "Placa de Aeternio Forjada", + "item.betterend.terminite_forged_plate": "Placa de Terminita Forjada", + "item.betterend.thallasium_forged_plate": "Placa de Talismanio Forjada", + + "attribute.name.generic.blindness_resistance": "Resistencia a la Ceguera", + + "tooltip.armor.crystalite_set": "Dar bonus: Regeneración I", + "tooltip.armor.crystalite_chest": "Efecto: Velocidad de Rapidez I", + "tooltip.armor.crystalite_boots": "Efecto: Velocidad I" +} diff --git a/src/main/resources/assets/betterend/lang/ko_kr.json b/src/main/resources/assets/betterend/lang/ko_kr.json index dcdecc42..9ede3c76 100644 --- a/src/main/resources/assets/betterend/lang/ko_kr.json +++ b/src/main/resources/assets/betterend/lang/ko_kr.json @@ -1,6 +1,6 @@ { - "itemGroup.betterend.end_items": "Better End: 아이템", - "itemGroup.betterend.end_blocks": "Better End: 블록", + "itemGroup.betterend.end_items": "더좋은 엔드: 아이템", + "itemGroup.betterend.end_blocks": "더좋은 엔드: 블록", "item.betterend.guidebook": "엔드 무작정 따라하기", "book.betterend.landing": "엔드의 극한환경에서 살아남기 위한 짤막한 가이드", @@ -28,7 +28,7 @@ "block.betterend.end_mycelium_path": "엔드 균사체 길", "block.betterend.end_moss_path": "엔드 이끼 길", - "block.betterend.ender_ore": "엔더 원석", + "block.betterend.ender_ore": "엔더 광석", "block.betterend.terminite_block": "터미나이트 블록", "block.betterend.aeternium_block": "에테르늄 블록", "block.betterend.ender_block": "엔더 블록", @@ -40,7 +40,7 @@ "item.betterend.aeternium_ingot": "에테르늄 주괴", "item.betterend.terminite_helmet": "터미나이트 투구", "item.betterend.terminite_chestplate": "터미나이트 흉갑", - "item.betterend.terminite_leggings": "터미나이트 각반", + "item.betterend.terminite_leggings": "터미나이트 레깅스", "item.betterend.terminite_boots": "터미나이트 부츠", "item.betterend.terminite_shovel": "터미나이트 삽", "item.betterend.terminite_sword": "터미나이트 검", @@ -50,7 +50,7 @@ "item.betterend.terminite_hammer": "터미나이트 단조 망치", "item.betterend.aeternium_helmet": "에테르늄 투구", "item.betterend.aeternium_chestplate": "에테르늄 흉갑", - "item.betterend.aeternium_leggings": "에테르늄 각반", + "item.betterend.aeternium_leggings": "에테르늄 레깅스", "item.betterend.aeternium_boots": "에테르늄 부츠", "item.betterend.aeternium_shovel": "에테르늄 삽", "item.betterend.aeternium_sword": "에테르늄 검", @@ -65,7 +65,7 @@ "item.betterend.crystalite_boots": "크리스탈라이트 부츠", "item.betterend.crystalite_chestplate": "크리스탈라이트 흉갑", "item.betterend.crystalite_helmet": "크리스탈라이트 투구", - "item.betterend.crystalite_leggings": "크리스탈라이트 각반", + "item.betterend.crystalite_leggings": "크리스탈라이트 레깅스", "item.betterend.aeternium_axe_head": "에테르늄 도끼 머리", "item.betterend.aeternium_hammer_head": "에테르늄 망치 머리", "item.betterend.aeternium_hoe_head": "에테르늄 괭이 머리", @@ -76,6 +76,8 @@ "item.betterend.leather_stripe": "가죽끈", "item.betterend.leather_wrapped_stick": "가죽을 감은 막대기", "item.betterend.elytra_armored": "장갑 겉날개", + "item.betterend.elytra_crystalite": "겉날개 크리스탈라이트", + "item.betterend.enchanted_membrane": "마법이 부여된 막", "effect.betterend.end_veil": "엔드 베일", "enchantment.betterend.end_veil": "엔드 베일", @@ -123,27 +125,27 @@ "block.betterend.dense_vine": "조밀한 덩굴", "block.betterend.bubble_coral": "거품 산호", "block.betterend.aurora_crystal": "오로라 수정", - "item.betterend.crystal_shards": "수정 조각", + "item.betterend.crystal_shards": "오로라 수정 조각", - "block.betterend.pythadendron_sapling": "피타덴드론 묘목", - "block.betterend.pythadendron_bark": "피타덴드론", - "block.betterend.pythadendron_barrel": "피타덴드론 통", - "block.betterend.pythadendron_button": "피타덴드론 버튼", - "block.betterend.pythadendron_chest": "피타덴드론 상자", - "block.betterend.pythadendron_crafting_table": "피타덴드론 제작대", - "block.betterend.pythadendron_door": "피타덴드론 문", - "block.betterend.pythadendron_fence": "피타덴드론 울타리", - "block.betterend.pythadendron_gate": "피타덴드론 울타리 문", - "block.betterend.pythadendron_ladder": "피타덴드론 사다리", - "block.betterend.pythadendron_log": "피타덴드론 원목", - "block.betterend.pythadendron_planks": "피타덴드론 판자", - "block.betterend.pythadendron_plate": "피타덴드론 압력판", - "block.betterend.pythadendron_sign": "피타덴드론 표지판", - "block.betterend.pythadendron_slab": "피타덴드론 반 블록", - "block.betterend.pythadendron_stairs": "피타덴드론 계단", - "block.betterend.pythadendron_stripped_bark": "껍질 벗긴 피타덴드론", - "block.betterend.pythadendron_stripped_log": "껍질 벗긴 피타덴드론 원목", - "block.betterend.pythadendron_trapdoor": "피타덴드론 다락문", + "block.betterend.pythadendron_sapling": "피타덴드론나무 묘목", + "block.betterend.pythadendron_bark": "피타덴드론나무", + "block.betterend.pythadendron_barrel": "피타덴드론나무 통", + "block.betterend.pythadendron_button": "피타덴드론나무 버튼", + "block.betterend.pythadendron_chest": "피타덴드론나무 상자", + "block.betterend.pythadendron_crafting_table": "피타덴드론나무 제작대", + "block.betterend.pythadendron_door": "피타덴드론나무 문", + "block.betterend.pythadendron_fence": "피타덴드론나무 울타리", + "block.betterend.pythadendron_gate": "피타덴드론나무 울타리 문", + "block.betterend.pythadendron_ladder": "피타덴드론나무 사다리", + "block.betterend.pythadendron_log": "피타덴드론나무 원목", + "block.betterend.pythadendron_planks": "피타덴드론나무 판자", + "block.betterend.pythadendron_plate": "피타덴드론나무 압력판", + "block.betterend.pythadendron_sign": "피타덴드론나무 표지판", + "block.betterend.pythadendron_slab": "피타덴드론나무 반 블록", + "block.betterend.pythadendron_stairs": "피타덴드론나무 계단", + "block.betterend.pythadendron_stripped_bark": "껍질 벗긴 피타덴드론나무", + "block.betterend.pythadendron_stripped_log": "껍질 벗긴 피타덴드론나무 원목", + "block.betterend.pythadendron_trapdoor": "피타덴드론나무 다락문", "block.betterend.chorus_nylium": "후렴 네사체", "block.betterend.chorus_nylium_path": "후렴 네사체 길", @@ -222,7 +224,7 @@ "block.betterend.cave_moss_path": "동굴 이끼 길", "block.betterend.crystal_moss": "수정 이끼", "block.betterend.crystal_moss_path": "수정 이끼 길", - "block.betterend.pythadendron_leaves": "피타덴드론 잎", + "block.betterend.pythadendron_leaves": "피타덴드론나무 잎", "item.betterend.spawn_egg_end_fish": "엔드 물고기 생성 알", "block.betterend.crystal_grass": "수정 잔디", @@ -232,62 +234,62 @@ "block.betterend.flavolite_runed_eternal": "영원한 룬을 새긴 플라보라이트", "item.betterend.eternal_crystal": "영원한 수정", - "block.betterend.lacugrove_bark": "라쿠그로브", - "block.betterend.lacugrove_barrel": "라쿠그로브 통", - "block.betterend.lacugrove_button": "라쿠그로브 버튼", - "block.betterend.lacugrove_chest": "라쿠그로브 상자", - "block.betterend.lacugrove_crafting_table": "라쿠그로브 제작대", - "block.betterend.lacugrove_door": "라쿠그로브 문", - "block.betterend.lacugrove_fence": "라쿠그로브 울타리", - "block.betterend.lacugrove_gate": "라쿠그로브 울타리 문", - "block.betterend.lacugrove_ladder": "라쿠그로브 사다리", - "block.betterend.lacugrove_log": "라쿠그로브 원목", - "block.betterend.lacugrove_planks": "라쿠그로브 판자", - "block.betterend.lacugrove_plate": "라쿠그로브 압력판", - "block.betterend.lacugrove_sign": "라쿠그로브 표지판", - "block.betterend.lacugrove_slab": "라쿠그로브 반 블록", - "block.betterend.lacugrove_stairs": "라쿠그로브 계단", - "block.betterend.lacugrove_stripped_bark": "껍질 벗긴 라쿠그로브", - "block.betterend.lacugrove_stripped_log": "껍질 벗긴 라쿠그로브 원목", - "block.betterend.lacugrove_trapdoor": "라쿠그로브 다락문", + "block.betterend.lacugrove_bark": "라쿠그로브나무", + "block.betterend.lacugrove_barrel": "라쿠그로브나무 통", + "block.betterend.lacugrove_button": "라쿠그로브나무 버튼", + "block.betterend.lacugrove_chest": "라쿠그로브나무 상자", + "block.betterend.lacugrove_crafting_table": "라쿠그로브나무 제작대", + "block.betterend.lacugrove_door": "라쿠그로브나무 문", + "block.betterend.lacugrove_fence": "라쿠그로브나무 울타리", + "block.betterend.lacugrove_gate": "라쿠그로브나무 울타리 문", + "block.betterend.lacugrove_ladder": "라쿠그로브나무 사다리", + "block.betterend.lacugrove_log": "라쿠그로브나무 원목", + "block.betterend.lacugrove_planks": "라쿠그로브나무 판자", + "block.betterend.lacugrove_plate": "라쿠그로브나무 압력판", + "block.betterend.lacugrove_sign": "라쿠그로브나무 표지판", + "block.betterend.lacugrove_slab": "라쿠그로브나무 반 블록", + "block.betterend.lacugrove_stairs": "라쿠그로브나무 계단", + "block.betterend.lacugrove_stripped_bark": "껍질 벗긴 라쿠그로브나무", + "block.betterend.lacugrove_stripped_log": "껍질 벗긴 라쿠그로브나무 원목", + "block.betterend.lacugrove_trapdoor": "라쿠그로브나무 다락문", - "block.betterend.lacugrove_leaves": "라쿠그로브 잎", - "block.betterend.lacugrove_sapling": "라쿠그로브 묘목", + "block.betterend.lacugrove_leaves": "라쿠그로브나무 잎", + "block.betterend.lacugrove_sapling": "라쿠그로브나무 묘목", "biome.betterend.megalake_grove": "거대한 호수 숲", "biome.betterend.painted_mountains": "채색 산맥", - "block.betterend.dragon_tree_bark": "용혈수", - "block.betterend.dragon_tree_barrel": "용혈수 통", - "block.betterend.dragon_tree_button": "용혈수 버튼", - "block.betterend.dragon_tree_chest": "용혈수 상자", - "block.betterend.dragon_tree_crafting_table": "용혈수 제작대", - "block.betterend.dragon_tree_door": "용혈수 문", - "block.betterend.dragon_tree_fence": "용혈수 울타리", - "block.betterend.dragon_tree_gate": "용혈수 울타리 문", - "block.betterend.dragon_tree_ladder": "용혈수 사다리", - "block.betterend.dragon_tree_log": "용혈수 원목", - "block.betterend.dragon_tree_planks": "용혈수 판자", - "block.betterend.dragon_tree_plate": "용혈수 압력판", - "block.betterend.dragon_tree_sign": "용혈수 표지판", - "block.betterend.dragon_tree_slab": "용혈수 반 블록", - "block.betterend.dragon_tree_stairs": "용혈수 계단", - "block.betterend.dragon_tree_stripped_bark": "껍질 벗긴 용혈수", - "block.betterend.dragon_tree_stripped_log": "껍질 벗긴 용혈수 원목", - "block.betterend.dragon_tree_trapdoor": "용혈수 다락문", + "block.betterend.dragon_tree_bark": "용혈수나무", + "block.betterend.dragon_tree_barrel": "용혈수나무 통", + "block.betterend.dragon_tree_button": "용혈수나무 버튼", + "block.betterend.dragon_tree_chest": "용혈수나무 상자", + "block.betterend.dragon_tree_crafting_table": "용혈수나무 제작대", + "block.betterend.dragon_tree_door": "용혈수나무 문", + "block.betterend.dragon_tree_fence": "용혈수나무 울타리", + "block.betterend.dragon_tree_gate": "용혈수나무 울타리 문", + "block.betterend.dragon_tree_ladder": "용혈수나무 사다리", + "block.betterend.dragon_tree_log": "용혈수나무 원목", + "block.betterend.dragon_tree_planks": "용혈수나무 판자", + "block.betterend.dragon_tree_plate": "용혈수나무 압력판", + "block.betterend.dragon_tree_sign": "용혈수나무 표지판", + "block.betterend.dragon_tree_slab": "용혈수나무 반 블록", + "block.betterend.dragon_tree_stairs": "용혈수나무 계단", + "block.betterend.dragon_tree_stripped_bark": "껍질 벗긴 용혈수나무", + "block.betterend.dragon_tree_stripped_log": "껍질 벗긴 용혈수나무 원목", + "block.betterend.dragon_tree_trapdoor": "용혈수나무 다락문", "biome.betterend.shadow_forest": "그림자 숲", - "block.betterend.dragon_tree_leaves": "용혈수 잎", - "block.betterend.dragon_tree_sapling": "용혈수 묘목", + "block.betterend.dragon_tree_leaves": "용혈수나무 잎", + "block.betterend.dragon_tree_sapling": "용혈수나무 묘목", "block.betterend.shadow_grass": "그림자 잔디", "block.betterend.shadow_grass_path": "그림자 잔디 길", "block.betterend.shadow_plant": "그림자 식물", - "block.betterend.dragon_tree_bookshelf": "용혈수 책장", + "block.betterend.dragon_tree_bookshelf": "용혈수나무 책장", "block.betterend.end_lotus_bookshelf": "엔드 연꽃 책장", - "block.betterend.lacugrove_bookshelf": "라쿠그로브 책장", + "block.betterend.lacugrove_bookshelf": "라쿠그로브나무 책장", "block.betterend.mossy_glowshroom_bookshelf": "이끼 낀 발광버섯 책장", - "block.betterend.pythadendron_bookshelf": "피타덴드론 책장", + "block.betterend.pythadendron_bookshelf": "피타덴드론나무 책장", "block.betterend.murkweed": "컴컴한풀", "block.betterend.needlegrass": "털수염풀", @@ -325,34 +327,34 @@ "biome.betterend.blossoming_spires": "만발한 첨탑", "block.betterend.amber_grass": "호박 잔디", "block.betterend.amber_grass_path": "호박 잔디 길", - "block.betterend.tenanea_bark": "테나네아", - "block.betterend.tenanea_barrel": "테나네아 통", - "block.betterend.tenanea_bookshelf": "테나네아 책장", - "block.betterend.tenanea_button": "테나네아 버튼", - "block.betterend.tenanea_chest": "테나네아 상자", - "block.betterend.tenanea_crafting_table": "테나네아 제작대", - "block.betterend.tenanea_door": "테나네아 문", - "block.betterend.tenanea_fence": "테나네아 울타리", - "block.betterend.tenanea_gate": "테나네아 울타리 문", - "block.betterend.tenanea_ladder": "테나네아 사다리", - "block.betterend.tenanea_leaves": "테나네아 잎", - "block.betterend.tenanea_log": "테나네아 원목", - "block.betterend.tenanea_planks": "테나네아 판자", - "block.betterend.tenanea_plate": "테나네아 압력판", - "block.betterend.tenanea_sapling": "테나네아 묘목", - "block.betterend.tenanea_sign": "테나네아 표지판", - "block.betterend.tenanea_slab": "테나네아 반 블록", - "block.betterend.tenanea_stairs": "테나네아 계단", - "block.betterend.tenanea_stripped_bark": "껍질 벗긴 테나네아", - "block.betterend.tenanea_stripped_log": "껍질 벗긴 테나네아 원목", - "block.betterend.tenanea_trapdoor": "테나네아 다락문", + "block.betterend.tenanea_bark": "테나네아나무", + "block.betterend.tenanea_barrel": "테나네아나무 통", + "block.betterend.tenanea_bookshelf": "테나네아나무 책장", + "block.betterend.tenanea_button": "테나네아나무 버튼", + "block.betterend.tenanea_chest": "테나네아나무 상자", + "block.betterend.tenanea_crafting_table": "테나네아나무 제작대", + "block.betterend.tenanea_door": "테나네아나무 문", + "block.betterend.tenanea_fence": "테나네아나무 울타리", + "block.betterend.tenanea_gate": "테나네아나무 울타리 문", + "block.betterend.tenanea_ladder": "테나네아나무 사다리", + "block.betterend.tenanea_leaves": "테나네아나무 잎", + "block.betterend.tenanea_log": "테나네아나무 원목", + "block.betterend.tenanea_planks": "테나네아나무 판자", + "block.betterend.tenanea_plate": "테나네아나무 압력판", + "block.betterend.tenanea_sapling": "테나네아나무 묘목", + "block.betterend.tenanea_sign": "테나네아나무 표지판", + "block.betterend.tenanea_slab": "테나네아나무 반 블록", + "block.betterend.tenanea_stairs": "테나네아나무 계단", + "block.betterend.tenanea_stripped_bark": "껍질 벗긴 테나네아나무", + "block.betterend.tenanea_stripped_log": "껍질 벗긴 테나네아나무 원목", + "block.betterend.tenanea_trapdoor": "테나네아나무 다락문", "block.betterend.amber_block": "호박 블록", - "block.betterend.amber_ore": "호박 원석", + "block.betterend.amber_ore": "호박 광석", "item.betterend.amber_gem": "호박", "item.betterend.raw_amber": "가공하지 않은 호박", - "block.betterend.tenanea_flowers": "테나네아 꽃", - "block.betterend.tenanea_outer_leaves": "테나네아 겉잎", + "block.betterend.tenanea_flowers": "테나네아나무 꽃", + "block.betterend.tenanea_outer_leaves": "테나네아나무 겉잎", "block.betterend.pink_moss": "분홍색 이끼", "block.betterend.pink_moss_path": "분홍색 이끼 길", @@ -378,7 +380,7 @@ "block.betterend.iron_bulb_lantern_pink": "분홍색 철 구근 랜턴", "block.betterend.iron_bulb_lantern_purple": "보라색 철 구근 랜턴", "block.betterend.iron_bulb_lantern_red": "빨간색 철 구근 랜턴", - "block.betterend.iron_bulb_lantern_white": "흰색 철 구근 랜턴", + "block.betterend.iron_bulb_lantern_white": "하얀색 철 구근 랜턴", "block.betterend.iron_bulb_lantern_yellow": "노란색 철 구근 랜턴", "block.betterend.thallasium_bulb_lantern": "탈라슘 구근 랜턴", @@ -396,7 +398,7 @@ "block.betterend.thallasium_bulb_lantern_pink": "분홍색 탈라슘 구근 랜턴", "block.betterend.thallasium_bulb_lantern_purple": "보라색 탈라슘 구근 랜턴", "block.betterend.thallasium_bulb_lantern_red": "빨간색 탈라슘 구근 랜턴", - "block.betterend.thallasium_bulb_lantern_white": "흰색 탈라슘 구근 랜턴", + "block.betterend.thallasium_bulb_lantern_white": "하얀색 탈라슘 구근 랜턴", "block.betterend.thallasium_bulb_lantern_yellow": "노란색 탈라슘 구근 랜턴", "block.betterend.bushy_grass": "무성한 잔디", @@ -436,7 +438,7 @@ "block.betterend.hydralux_petal_block_pink": "분홍색 꽃잎 블록", "block.betterend.hydralux_petal_block_purple": "보라색 꽃잎 블록", "block.betterend.hydralux_petal_block_red": "빨간색 꽃잎 블록", - "block.betterend.hydralux_petal_block_white": "흰색 꽃잎 블록", + "block.betterend.hydralux_petal_block_white": "하얀색 꽃잎 블록", "block.betterend.hydralux_petal_block_yellow": "노란색 꽃잎 블록", "block.betterend.hydralux_sapling": "하이드라럭스 묘목", "block.betterend.hydrothermal_vent": "열수구", @@ -508,13 +510,13 @@ "message.betterend.set_spawn": "§b§l리스폰 지점을 설정했습니다", "message.betterend.fail_spawn": "§c§l리스폰 지점을 설정하려면 호박 6개를 들고 있어야 합니다", - "block.betterend.dragon_tree_composter": "용혈수 퇴비통", + "block.betterend.dragon_tree_composter": "용혈수나무 퇴비통", "block.betterend.end_lotus_composter": "엔드 연꽃 퇴비통", "block.betterend.helix_tree_composter": "나선형 나무 퇴비통", - "block.betterend.lacugrove_composter": "라쿠그로브 퇴비통", + "block.betterend.lacugrove_composter": "라쿠그로브나무 퇴비통", "block.betterend.mossy_glowshroom_composter": "이끼 낀 발광버섯 퇴비통", - "block.betterend.pythadendron_composter": "피타덴드론 퇴비통", - "block.betterend.tenanea_composter": "테나네아 퇴비통", + "block.betterend.pythadendron_composter": "피타덴드론나무 퇴비통", + "block.betterend.tenanea_composter": "테나네아나무 퇴비통", "biome.betterend.old_bulbis_gardens": "오래된 구근 정원", "block.betterend.ivis_moss": "이비스 이끼", @@ -596,6 +598,7 @@ "item.betterend.silk_fiber": "비단 실", "item.betterend.spawn_egg_silk_moth": "누에나방 생성 알", + "item.betterend.thallasium_raw": "탈라슘 원석 블록", "block.betterend.thallasium_ore": "탈라슘 광석", "item.betterend.thallasium_axe": "탈라슘 도끼", "item.betterend.thallasium_hoe": "탈라슘 괭이", @@ -642,7 +645,7 @@ "block.betterend.terminite_bulb_lantern_pink": "분홍색 터미나이트 구근 랜턴", "block.betterend.terminite_bulb_lantern_purple": "보라색 터미나이트 구근 랜턴", "block.betterend.terminite_bulb_lantern_red": "빨간색 터미나이트 구근 랜턴", - "block.betterend.terminite_bulb_lantern_white": "흰색 터미나이트 구근 랜턴", + "block.betterend.terminite_bulb_lantern_white": "하얀색 터미나이트 구근 랜턴", "block.betterend.terminite_bulb_lantern_yellow": "노란색 터미나이트 구근 랜턴", "block.betterend.terminite_chain": "터미나이트 사슬", @@ -658,7 +661,7 @@ "item.betterend.thallasium_chestplate": "탈라슘 흉갑", "item.betterend.thallasium_hammer": "탈라슘 망치", "item.betterend.thallasium_helmet": "탈라슘 투구", - "item.betterend.thallasium_leggings": "탈라슘 각반", + "item.betterend.thallasium_leggings": "탈라슘 레깅스", "block.betterend.missing_tile": "누락된 타일", "block.betterend.charcoal_block": "숯 블록", "block.betterend.end_stone_furnace": "엔드 돌 화로", @@ -715,7 +718,7 @@ "block.betterend.azure_jadestone_pedestal": "하늘색 옥석 받침대", "block.betterend.azure_jadestone_pillar": "하늘색 옥석 기둥", "block.betterend.azure_jadestone_plate": "하늘색 옥석 압력판", - "block.betterend.azure_jadestone_polished": "윤나는 하늘색 옥석 ", + "block.betterend.azure_jadestone_polished": "윤나는 하늘색 옥석", "block.betterend.azure_jadestone_slab": "하늘색 옥석 반 블록", "block.betterend.azure_jadestone_stairs": "하늘색 옥석 계단", "block.betterend.azure_jadestone_tiles": "하늘색 옥석 타일 ", @@ -778,29 +781,29 @@ "block.betterend.filalux": "필라룩스", "block.betterend.filalux_lantern": "필라룩스 랜턴", "block.betterend.filalux_wings": "필라룩스 날개", - "block.betterend.lucernia_bark": "루체르니아", - "block.betterend.lucernia_barrel": "루체르니아 통", - "block.betterend.lucernia_bookshelf": "루체르니아 책장", - "block.betterend.lucernia_button": "루체르니아 버튼", - "block.betterend.lucernia_chest": "루체르니아 상자", - "block.betterend.lucernia_composter": "루체르니아 퇴비통", - "block.betterend.lucernia_crafting_table": "루체르니아 제작대", - "block.betterend.lucernia_door": "루체르니아 문", - "block.betterend.lucernia_fence": "루체르니아 울타리", - "block.betterend.lucernia_gate": "루체르니아 울타리 문", - "block.betterend.lucernia_ladder": "루체르니아 사다리", - "block.betterend.lucernia_leaves": "루체르니아 잎", - "block.betterend.lucernia_log": "루체르니아 원목", - "block.betterend.lucernia_outer_leaves": "루체르니아 겉잎", - "block.betterend.lucernia_planks": "루체르니아 판자", - "block.betterend.lucernia_plate": "루체르니아 압력판", - "block.betterend.lucernia_sapling": "루체르니아 묘목", - "block.betterend.lucernia_sign": "루체르니아 표지판", - "block.betterend.lucernia_slab": "루체르니아 반 블록", - "block.betterend.lucernia_stairs": "루체르니아 계단", - "block.betterend.lucernia_stripped_bark": "껍질 벗긴 루체르니아", - "block.betterend.lucernia_stripped_log": "껍질 벗긴 루체르니아 원목", - "block.betterend.lucernia_trapdoor": "루체르니아 다락문", + "block.betterend.lucernia_bark": "루체르니아나무", + "block.betterend.lucernia_barrel": "루체르니아나무 통", + "block.betterend.lucernia_bookshelf": "루체르니아나무 책장", + "block.betterend.lucernia_button": "루체르니아나무 버튼", + "block.betterend.lucernia_chest": "루체르니아나무 상자", + "block.betterend.lucernia_composter": "루체르니아나무 퇴비통", + "block.betterend.lucernia_crafting_table": "루체르니아나무 제작대", + "block.betterend.lucernia_door": "루체르니아나무 문", + "block.betterend.lucernia_fence": "루체르니아나무 울타리", + "block.betterend.lucernia_gate": "루체르니아나무 울타리 문", + "block.betterend.lucernia_ladder": "루체르니아나무 사다리", + "block.betterend.lucernia_leaves": "루체르니아나무 잎", + "block.betterend.lucernia_log": "루체르니아나무 원목", + "block.betterend.lucernia_outer_leaves": "루체르니아나무 겉잎", + "block.betterend.lucernia_planks": "루체르니아나무 판자", + "block.betterend.lucernia_plate": "루체르니아나무 압력판", + "block.betterend.lucernia_sapling": "루체르니아나무 묘목", + "block.betterend.lucernia_sign": "루체르니아나무 표지판", + "block.betterend.lucernia_slab": "루체르니아나무 반 블록", + "block.betterend.lucernia_stairs": "루체르니아나무 계단", + "block.betterend.lucernia_stripped_bark": "껍질 벗긴 루체르니아나무", + "block.betterend.lucernia_stripped_log": "껍질 벗긴 루체르니아나무 원목", + "block.betterend.lucernia_trapdoor": "루체르니아나무 다락문", "block.betterend.aurant_polypore": "오랑 버섯", "block.betterend.bolux_mushroom": "볼럭스 버섯", @@ -809,7 +812,7 @@ "block.betterend.ruscus": "러스커스", "item.betterend.bolux_mushroom_cooked": "익힌 볼럭스 버섯", - "block.betterend.silk_moth_hive": "누에 나방통 ", + "block.betterend.silk_moth_hive": "누에 나방통", "item.betterend.silk_moth_matrix": "누에 나방 망", "biome.betterend.neon_oasis": "네온 오아시스", @@ -871,5 +874,40 @@ "tooltip.armor.crystalite_set": "세트 보너스 : 재생 I", "tooltip.armor.crystalite_chest": "효과 : 굴착 속도 I", - "tooltip.armor.crystalite_boots": "효과 : 신속 I" + "tooltip.armor.crystalite_boots": "효과 : 신속 I", + + "block.betterend.azure_jadestone_flower_pot": "하늘색 옥석 화분", + "block.betterend.endstone_flower_pot": "엔드 돌 화분", + "block.betterend.flavolite_flower_pot": "플라보라이트 화분", + "block.betterend.sandy_jadestone_flower_pot": "모래색 옥석 화분", + "block.betterend.sulphuric_rock_flower_pot": "유황암 화분", + "block.betterend.violecite_flower_pot": "바이올사이트 화분", + "block.betterend.virid_jadestone_flower_pot": "담녹색 옥석 화분", + "block.betterend.virid_jadestone_flower_pot": "담녹색 옥석 화분", + + "block.betterend.umbralith": "엄브럴리스", + "block.betterend.umbralith_bricks": "엄브럴리스 벽돌", + "block.betterend.umbralith_bricks_slab": "엄브럴리스 벽돌 반 블록", + "block.betterend.umbralith_bricks_stairs": "엄브럴리스 벽돌 계단", + "block.betterend.umbralith_bricks_wall": "엄브럴리스 벽돌 담장", + "block.betterend.umbralith_button": "엄브럴리스 버튼", + "block.betterend.umbralith_flower_pot": "엄브럴리스 화분", + "block.betterend.umbralith_furnace": "엄브럴리스 화로", + "block.betterend.umbralith_lantern": "엄브럴리스 랜턴", + "block.betterend.umbralith_pedestal": "엄브럴리스 받침대", + "block.betterend.umbralith_pillar": "엄브럴리스 기둥", + "block.betterend.umbralith_plate": "엄브럴리스 압력판", + "block.betterend.umbralith_polished": "윤나는 엄브럴리스", + "block.betterend.umbralith_slab": "엄브럴리스 반 블록", + "block.betterend.umbralith_stairs": "엄브럴리스 계단", + "block.betterend.umbralith_tiles": "엄브럴리스 타일", + "block.betterend.umbralith_wall": "엄브럴리스 담장", + + "biome.betterend.umbra_valley": "그림자 계곡", + "block.betterend.inflexia": "인플렉시어", + "block.betterend.pallidium_full": "팔리디움 (전체형 커버)", + "block.betterend.pallidium_heavy": "팔리디움 (중형 커버)", + "block.betterend.pallidium_thin": "팔리디움 (경형 커버)", + "block.betterend.pallidium_tiny": "팔리디움 (초경형 커버)", + "block.betterend.flammalix": "플래멀릭스" } diff --git a/src/main/resources/assets/betterend/lang/pt_br.json b/src/main/resources/assets/betterend/lang/pt_br.json new file mode 100644 index 00000000..bde732b6 --- /dev/null +++ b/src/main/resources/assets/betterend/lang/pt_br.json @@ -0,0 +1,917 @@ +{ + "itemGroup.betterend.end_items": "Better End: Itens", + "itemGroup.betterend.end_blocks": "Better End: Blocos", + + "item.betterend.guidebook": "The End para Leigos", + "book.betterend.landing": "Um pequeno guia sobre como sobreviver nas condições extremas do End.", + "book.betterend.subtitle": "Sobreviva no End", + + "category.rei.damage.amount&dmg": "Danos na ferramenta: %s", + "category.rei.infusion.time&val": "Tempo: %s", + + "biome.betterend.foggy_mushroomland": "Terras de Cogumelos Neovoada", + "biome.betterend.dust_wastelands": "Terras Devastadas", + "biome.betterend.chorus_forest": "Floresta de Choros", + "biome.betterend.megalake": "Megalake", + "biome.betterend.crystal_mountains": "Montanhas de Cristal", + + "entity.betterend.dragonfly": "Libélula", + "item.betterend.spawn_egg_dragonfly": "Ovo gerador de Libélula", + + "entity.betterend.end_slime": "Slime do End", + "item.betterend.spawn_egg_end_slime": "ovo gerador de Slime do End", + + "block.betterend.end_mycelium": "Micélio do End", + "block.betterend.end_moss": "Musgo do End", + "block.betterend.endstone_dust": "Areia do End", + + "block.betterend.end_mycelium_path": "Caminho de Micélio do End", + "block.betterend.end_moss_path": "Caminho de Musgo do End", + + "block.betterend.ender_ore": "Minério do End", + "block.betterend.terminite_block": "Bloco de Terminita", + "block.betterend.aeternium_block": "Bloco de Aeternio", + "block.betterend.ender_block": "Bloco do Ender", + "block.betterend.end_stone_smelter": "Fundidora de Pedra do End", + + "item.betterend.ender_dust": "Pó do Ender", + "item.betterend.ender_shard": "Fragmento do Ender", + "item.betterend.terminite_ingot": "Barra de Terminita", + "item.betterend.aeternium_ingot": "Barra de Aeternio", + "item.betterend.terminite_helmet": "Capacete de Terminita", + "item.betterend.terminite_chestplate": "Peitoral de Terminita", + "item.betterend.terminite_leggings": "Calças de Terminita", + "item.betterend.terminite_boots": "Botas de Terminita", + "item.betterend.terminite_shovel": "Pá de Terminita", + "item.betterend.terminite_sword": "Espada de Terminita", + "item.betterend.terminite_pickaxe": "Picareta de Terminita", + "item.betterend.terminite_axe": "Machado de Terminita", + "item.betterend.terminite_hoe": "Enxada de Terminita", + "item.betterend.terminite_hammer": "Martelo de Terminita", + "item.betterend.aeternium_helmet": "Capacete de Aeternio", + "item.betterend.aeternium_chestplate": "Peitoral de Aeternio", + "item.betterend.aeternium_leggings": "Calças de Aeternio", + "item.betterend.aeternium_boots": "Botas de Aeternio", + "item.betterend.aeternium_shovel": "Pá de Aeternio", + "item.betterend.aeternium_sword": "Espada de Aeternio", + "item.betterend.aeternium_pickaxe": "Picareta de Aeternio", + "item.betterend.aeternium_axe": "Machado de Aeternio", + "item.betterend.aeternium_hoe": "Enxada de Aeternio", + "item.betterend.aeternium_hammer": "Martelo de Aeternio", + "item.betterend.iron_hammer": "Martelo de Ferro", + "item.betterend.golden_hammer": "Martelo de Ouro", + "item.betterend.diamond_hammer": "Martelo de Diamante", + "item.betterend.netherite_hammer": "Martelo de Netherita", + "item.betterend.crystalite_boots": "Botas de Cristalita", + "item.betterend.crystalite_chestplate": "Peitoral de Cristalita", + "item.betterend.crystalite_helmet": "Capacete de Cristalita", + "item.betterend.crystalite_leggings": "Calças de Cristalita", + "item.betterend.aeternium_axe_head": "Cabeça de machado de Aeternio", + "item.betterend.aeternium_hammer_head": "Cabeça de Martelo de Aeternio", + "item.betterend.aeternium_hoe_head": "Cabeça de enxada de Aeternio", + "item.betterend.aeternium_pickaxe_head": "Cabeça de picareta de Aeternio", + "item.betterend.aeternium_shovel_head": "Cabeça de pá de Aeternio", + "item.betterend.aeternium_sword_blade": "Lâmina de espada de Aeternio", + "item.betterend.aeternium_sword_handle": "Punho de espada de Aeternio", + "item.betterend.leather_stripe": "Fatia de Couro", + "item.betterend.leather_wrapped_stick": "Couro Enrolado no Graveto", + "item.betterend.elytra_armored": "Élitros Blindada", + "item.betterend.elytra_crystalite": "Élitros de Cristalita", + "item.betterend.enchanted_membrane": "Membrana Encantada", + + "effect.betterend.end_veil": "Véu do End", + "enchantment.betterend.end_veil": "Véu do End", + "item.minecraft.potion.effect.end_veil": "Poção de Véu do End", + "item.minecraft.potion.effect.long_end_veil": "Poção de Véu do End", + "item.minecraft.splash_potion.effect.end_veil": "Poção Arremessável de Véu do End", + "item.minecraft.splash_potion.effect.long_end_veil": "Poção Arremessável de Véu do End", + "item.minecraft.lingering_potion.effect.end_veil": "Poção Prolongada de Véu do End", + "item.minecraft.lingering_potion.effect.long_end_veil": "Poção Prolongada de Véu do End", + "item.minecraft.tipped_arrow.effect.end_veil": "Flecha de Véu do End", + "item.minecraft.tipped_arrow.effect.long_end_veil": "Flecha de Véu do End", + + "block.betterend.mossy_glowshroom_sapling": "Muda de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_cap": "Copa de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_fur": "Pelagem de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_hymenophore": "Himenóforo de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_bark": "Casca de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_barrel": "Barril de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_button": "Botão de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_chest": "Baú de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_crafting_table": "Bancada de Trabalho de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_door": "Porta de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_fence": "Cerca de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_gate": "Portão de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_ladder": "Escada de mão de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_log": "Tronco de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_planks": "Tábuas de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_plate": "Placa de pressão de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_sign": "Placa de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_slab": "Laje de Coguluminoso Musgosoe", + "block.betterend.mossy_glowshroom_stairs": "Escadas de Coguluminoso Musgoso", + "block.betterend.mossy_glowshroom_stripped_bark": "Madeira de Coguluminoso Musgoso descadada", + "block.betterend.mossy_glowshroom_stripped_log": "Tronco de Coguluminoso Musgoso descascado", + "block.betterend.mossy_glowshroom_trapdoor": "Alçapão de Cogulumiso Musgoso", + + "block.betterend.umbrella_moss": "Musgo Guarda-chuva", + "block.betterend.umbrella_moss_tall": "Musgo Guarda-chuva alto", + "block.betterend.creeping_moss": "Musgo rastejante", + + "block.betterend.blue_vine_seed": "Semente de Trepadeiras Azul", + "block.betterend.blue_vine": "Trepadeiras Azul", + "block.betterend.blue_vine_lantern": "Lanterna de Trepadeiras Azul", + "block.betterend.blue_vine_fur": "Pelagem de Trepadeiras Azul", + + "block.betterend.dense_vine": "Trepadeiras densa", + "block.betterend.bubble_coral": "Coral de Bolhas", + "block.betterend.aurora_crystal": "Cristral de Aurora", + "item.betterend.crystal_shards": "Fragmentos de Cristal de Aurora", + + "block.betterend.pythadendron_sapling": "Muda de Pythadendron", + "block.betterend.pythadendron_bark": "Madeira de Pythadendron", + "block.betterend.pythadendron_barrel": "Barril de Pythadendron", + "block.betterend.pythadendron_button": "Botão de Pythadendron", + "block.betterend.pythadendron_chest": "Baú de Pythadendron", + "block.betterend.pythadendron_crafting_table": "Bancada de Trabalho de Pythadendron", + "block.betterend.pythadendron_door": "Porta de Pythadendron", + "block.betterend.pythadendron_fence": "Cerca de Pythadendron", + "block.betterend.pythadendron_gate": "Portão de Pythadendron", + "block.betterend.pythadendron_ladder": "Escada de mão de Pythadendron", + "block.betterend.pythadendron_log": "Tronco de Pythadendron", + "block.betterend.pythadendron_planks": "Tábuas de Pythadendron", + "block.betterend.pythadendron_plate": "Placa de pressão de Pythadendron", + "block.betterend.pythadendron_sign": "Placa de Pythadendron", + "block.betterend.pythadendron_slab": "Laje de Pythadendron", + "block.betterend.pythadendron_stairs": "Escadas de Pythadendron", + "block.betterend.pythadendron_stripped_bark": "Madeira de Pythadendron descascada", + "block.betterend.pythadendron_stripped_log": "Tronco de Pythadendron descascado", + "block.betterend.pythadendron_trapdoor": "Alçapão de Pythadendron", + + "block.betterend.chorus_nylium": "Nicélio do Coro", + "block.betterend.chorus_nylium_path": "Caminho de Nicélio do Coro", + "block.betterend.chorus_grass": "Grama do Coro", + + "block.betterend.end_lily": "Lírio do End", + "block.betterend.end_lily_seed": "Semente de Lírio do End", + "item.betterend.end_lily_leaf": "Folhas de Lírio do End", + "item.betterend.end_lily_leaf_dried": "Folhas seca de Lírio do End", + + "block.betterend.violecite": "Violecita", + "block.betterend.violecite_bricks": "Tijolos de Violecita", + "block.betterend.violecite_bricks_slab": "Laje de tijolos de Violecita", + "block.betterend.violecite_bricks_stairs": "Escadas de tijolos de Violecita", + "block.betterend.violecite_bricks_wall": "Muro de tijolos de Violecita", + "block.betterend.violecite_button": "Botão de Violecita", + "block.betterend.violecite_pillar": "Pilar de Violecita", + "block.betterend.violecite_plate": "Placa de pressão de Violecita", + "block.betterend.violecite_slab": "Laje de Violecita", + "block.betterend.violecite_tiles": "Azulejos de Violecita", + "block.betterend.violecite_stairs": "Escadas de Violecita", + "block.betterend.violecite_polished": "Violecita Polido", + "block.betterend.violecite_wall": "Muro de Violecita", + "block.betterend.violecite_pedestal": "Pedestal de Violecita", + + "block.betterend.flavolite": "Flavolito", + "block.betterend.flavolite_bricks": "Tijolos de Flavolito", + "block.betterend.flavolite_bricks_slab": "Laje de tijolos de Flavolito", + "block.betterend.flavolite_bricks_stairs": "Escadas de tijolos de Flavolito", + "block.betterend.flavolite_bricks_wall": "Muro de tijolos de Flavolito", + "block.betterend.flavolite_button": "Botão de Flavolito", + "block.betterend.flavolite_pillar": "Pilar de Flavolito", + "block.betterend.flavolite_plate": "Placa de pressão de Flavolito", + "block.betterend.flavolite_slab": "Laje de Flavolito", + "block.betterend.flavolite_tiles": "Azulejos de Flavolito", + "block.betterend.flavolite_stairs": "Escadas de Flavolito", + "block.betterend.flavolite_polished": "Flavolito Polido", + "block.betterend.flavolite_wall": "Muro de Flavolito", + "block.betterend.flavolite_pedestal": "Pedestal de Flavolito", + + "block.betterend.andesite_pedestal": "Pedestal de Andesito", + "block.betterend.diorite_pedestal": "Pedestal de Diorito", + "block.betterend.granite_pedestal": "Pedestal de Granito", + "block.betterend.purpur_pedestal": "Pedestal de Púrpura", + "block.betterend.quartz_pedestal": "Pedestal de Quartzo", + "block.betterend.infusion_pedestal": "Pedestal de Infusão", + + "block.betterend.end_lotus_seed": "Semente de Lotus do End", + "block.betterend.end_lotus_stem": "Caule de Lotus do End", + "block.betterend.end_lotus_leaf": "Folhas de Lotus do End", + "block.betterend.end_lotus_flower": "Flor de Lotus do End", + + "block.betterend.end_lotus_bark": "Madeira de Lotus do End", + "block.betterend.end_lotus_barrel": "Barril de Lotus do End", + "block.betterend.end_lotus_button": "Botão de Lotus do End", + "block.betterend.end_lotus_chest": "baú de Lotus do End", + "block.betterend.end_lotus_crafting_table": "Bancada de Trabalho de Lotus do End", + "block.betterend.end_lotus_door": "Porta de Lotus do End", + "block.betterend.end_lotus_fence": "Cerca de Lotus do End", + "block.betterend.end_lotus_gate": "Portão de Lotus do End", + "block.betterend.end_lotus_ladder": "Escada de mão de Lotus do End", + "block.betterend.end_lotus_log": "Tronco de Lotus do End", + "block.betterend.end_lotus_planks": "Tábuas de Lotus do End", + "block.betterend.end_lotus_plate": "Placa de pressão de Lotus do End", + "block.betterend.end_lotus_sign": "Placa de Lotus do End", + "block.betterend.end_lotus_slab": "Laje de Lotus do End", + "block.betterend.end_lotus_stairs": "Escadas de Lotus do End", + "block.betterend.end_lotus_stripped_bark": "Madeira de Lotus do End descascada", + "block.betterend.end_lotus_stripped_log": "Tronco de Lotus do End descascado", + "block.betterend.end_lotus_trapdoor": "Alçapão", + + "block.betterend.cave_moss": "Musgo Cavernoso", + "block.betterend.cave_grass": "Grama Cavernoso", + "block.betterend.cave_bush": "Arbusto Cavernoso", + + "block.betterend.cave_moss_path": "Caminho de Musgo Cavernoso", + "block.betterend.crystal_moss": "Musgo de Cristal", + "block.betterend.crystal_moss_path": "Caminho de Musgo Cavernoso", + "block.betterend.pythadendron_leaves": "Folhas de Pythadendron", + "item.betterend.spawn_egg_end_fish": "Ovo gerador de Peixe do End", + "block.betterend.crystal_grass": "Grama de Cristal", + + "block.betterend.flavolite_runed": "Runas de Flavolito", + "block.betterend.end_portal_block": "Portal do End", + "block.betterend.eternal_pedestal": "Pedestal de Eternal", + "block.betterend.flavolite_runed_eternal": "Runas de Eternal de Flavolito", + "item.betterend.eternal_crystal": "Cristal Eternal", + + "block.betterend.lacugrove_bark": "Madeira de Lacugrove", + "block.betterend.lacugrove_barrel": "Barril de Lacugrove", + "block.betterend.lacugrove_button": "Botão de Lacugrove", + "block.betterend.lacugrove_chest": "Baú de Lacugrove", + "block.betterend.lacugrove_crafting_table": "Bancada de Trabalho de Lacugrove", + "block.betterend.lacugrove_door": "Porta de Lacugrove", + "block.betterend.lacugrove_fence": "Cerca de Lacugrove", + "block.betterend.lacugrove_gate": "Portão de Lacugrove", + "block.betterend.lacugrove_ladder": "Escada de mão de Lacugrove", + "block.betterend.lacugrove_log": "Tronco de Lacugrove", + "block.betterend.lacugrove_planks": "Tábuas de Lacugrove", + "block.betterend.lacugrove_plate": "Placa de pressão de Lacugrove", + "block.betterend.lacugrove_sign": "Placa de Lacugrove", + "block.betterend.lacugrove_slab": "Lajes de Lacugrove", + "block.betterend.lacugrove_stairs": "Escadas de Lacugrove", + "block.betterend.lacugrove_stripped_bark": "Madeira de Lacugrove descascada", + "block.betterend.lacugrove_stripped_log": "Tronco de Lacugrove descascado", + "block.betterend.lacugrove_trapdoor": "Alçapão de Lacugrove", + + "block.betterend.lacugrove_leaves": "Folhas de Lacugrove", + "block.betterend.lacugrove_sapling": "Muda de Lacugrove", + + "biome.betterend.megalake_grove": "Arvoredos de Megalake", + "biome.betterend.painted_mountains": "Montanhas Pintadas", + + "block.betterend.dragon_tree_bark": "Madeira de Árvore do Dragão", + "block.betterend.dragon_tree_barrel": "Barril de Árvore do Dragão", + "block.betterend.dragon_tree_button": "Butão de Árvore do Dragão", + "block.betterend.dragon_tree_chest": "Baú de Árvore do Dragão", + "block.betterend.dragon_tree_crafting_table": "Bancada de Trabalho de Árvore do Dragão", + "block.betterend.dragon_tree_door": "Porta de Árvore do Dragão", + "block.betterend.dragon_tree_fence": "Cerca de Árvore do Dragão", + "block.betterend.dragon_tree_gate": "Portão de Árvore do Dragão", + "block.betterend.dragon_tree_ladder": "Escada de mão de Árvore do Dragão", + "block.betterend.dragon_tree_log": "Tronco de Árvore do Dragão", + "block.betterend.dragon_tree_planks": "tábuas de Árvore do Dragão", + "block.betterend.dragon_tree_plate": "Placa de pressão de Árvore do Dragão", + "block.betterend.dragon_tree_sign": "Placa de Árvore do Dragão", + "block.betterend.dragon_tree_slab": "Laje de Árvore do Dragão", + "block.betterend.dragon_tree_stairs": "Escadas de Árvore do Dragão", + "block.betterend.dragon_tree_stripped_bark": "Madeira de Árvore do Dragão descascada", + "block.betterend.dragon_tree_stripped_log": "Tronco de Árvore do Dragão descascado", + "block.betterend.dragon_tree_trapdoor": "Alçapão de Árvore do Dragão", + + "biome.betterend.shadow_forest": "Floresta da Sombra", + "block.betterend.dragon_tree_leaves": "Folhas de Árvore do Dragão", + "block.betterend.dragon_tree_sapling": "Muda de Árvore do Dragão", + "block.betterend.shadow_grass": "Grama da Sombra", + "block.betterend.shadow_grass_path": "Caminho de Grama da Sombra", + "block.betterend.shadow_plant": "Planta da Sombra", + + "block.betterend.dragon_tree_bookshelf": "Estante de livros de Árvore do Dragão", + "block.betterend.end_lotus_bookshelf": "Estante de livros de Lotus do End", + "block.betterend.lacugrove_bookshelf": "Estante de livros de Lacugrove", + "block.betterend.mossy_glowshroom_bookshelf": "Estante de livros de Coguluminoso Musgoso", + "block.betterend.pythadendron_bookshelf": "Estante de livros de Pythadendron", + + "block.betterend.murkweed": "Erva daninha", + "block.betterend.needlegrass": "Gramagulha", + "block.betterend.twisted_vine": "Trepadeiras torcida", + + "block.betterend.shadow_berry": "Semente de baga da Sombra", + "item.betterend.shadow_berry_cooked": "Baga da Sombra cozida", + "item.betterend.shadow_berry_raw": "Baga da Sombra", + "block.betterend.purple_polypore": "Polypore Púrpura", + + "block.betterend.cyan_moss": "Musgo ciano", + "block.betterend.tail_moss": "Cauda musgosa", + + "block.betterend.flavolite_lantern": "Lanterna de Flavolito", + "block.betterend.end_stone_lantern": "Lanterna de Preda do End", + "block.betterend.violecite_lantern": "Lantern de Violecita", + + "entity.betterend.end_fish": "Peixe do End", + "entity.betterend.shadow_walker": "Andarilho da Sombra", + "item.betterend.spawn_egg_shadow_walker": "Ovo gerador de Andarilho da Sombra", + + "block.betterend.andesite_lantern": "Lampião de Andesito", + "block.betterend.blackstone_lantern": "Lampião de Pedra negra", + "block.betterend.diorite_lantern": "Lampião de Diorito", + "block.betterend.granite_lantern": "Lampião de Granito", + "block.betterend.purpur_lantern": "Lampião de Púrpura", + "block.betterend.quartz_lantern": "Lampião de Quartzo", + + "item.betterend.bucket_end_fish": "Balde com Peixe do End", + "item.betterend.bucket_cubozoa": "Balde com Cubozoa", + "item.betterend.end_fish_cooked": "Peixe do End cozido", + "item.betterend.end_fish_raw": "Peixe do End", + + "biome.betterend.amber_land": "Terras de Âmbar", + "biome.betterend.blossoming_spires": "Pináculos em Flor", + "block.betterend.amber_grass": "Grama de Âmbar", + "block.betterend.amber_grass_path": "Caminho de grama de Âmbar", + "block.betterend.tenanea_bark": "Madeira de Tenanea", + "block.betterend.tenanea_barrel": "Barril de Tenanea", + "block.betterend.tenanea_bookshelf": "Estante de livros de Tenanea", + "block.betterend.tenanea_button": "Baú de Tenanea", + "block.betterend.tenanea_chest": "Báu Tenanea", + "block.betterend.tenanea_crafting_table": "Bancada de Trabalho de Tenanea", + "block.betterend.tenanea_door": "Porta de Tenanea", + "block.betterend.tenanea_fence": "Cerca de Tenanea", + "block.betterend.tenanea_gate": "Portão de Tenanea", + "block.betterend.tenanea_ladder": "Escada de mão de Tenanea", + "block.betterend.tenanea_leaves": "Folhas de Tenanea", + "block.betterend.tenanea_log": "Tronco de Tenanea", + "block.betterend.tenanea_planks": "Tábuas de Tenanea", + "block.betterend.tenanea_plate": "Placa de pressão de Tenanea", + "block.betterend.tenanea_sapling": "Muda de Tenanea", + "block.betterend.tenanea_sign": "Placa de Tenanea", + "block.betterend.tenanea_slab": "Laje de Tenanea", + "block.betterend.tenanea_stairs": "Escadas de Tenanea", + "block.betterend.tenanea_stripped_bark": "Madeira de Tenanea descascada", + "block.betterend.tenanea_stripped_log": "Tronco de Tenanea descascado", + "block.betterend.tenanea_trapdoor": "Alçapão de Tenanea", + + "block.betterend.amber_block": "Bloco de Âmbar", + "block.betterend.amber_ore": "Minério de Âmbar", + "item.betterend.amber_gem": "Joia de Âmbar", + "item.betterend.raw_amber": "Âmbar bruto", + "block.betterend.tenanea_flowers": "Flores de Tenanea", + "block.betterend.tenanea_outer_leaves": "Folhas Exteriores de Tenanea", + + "block.betterend.pink_moss": "Musgo Pink", + "block.betterend.pink_moss_path": "Pink Moss Path", + + "block.betterend.twisted_moss": "Musgo torcido", + + "block.betterend.bulb_vine": "Trepadeiras Bulbo", + "block.betterend.bulb_vine_seed": "Semente de Trepadeiras Bulbo", + "item.betterend.glowing_bulb": "Bulbo Brilhante", + + "block.betterend.iron_bulb_lantern": "Lanterna bulbo de Ferro", + "block.betterend.iron_bulb_lantern_black": "Lantera bulbo preta de Ferro", + "block.betterend.iron_bulb_lantern_blue": "Lanterna bulbo azul de Ferro", + "block.betterend.iron_bulb_lantern_brown": "Lanterna bulbo marrom de Ferro", + "block.betterend.iron_bulb_lantern_cyan": "Lanterna bulbo ciana de Ferro", + "block.betterend.iron_bulb_lantern_gray": "Lanterna bulbo cinza de Ferro", + "block.betterend.iron_bulb_lantern_green": "Lanterna bulbo verde de Ferro", + "block.betterend.iron_bulb_lantern_light_blue": "Lanterna bulbo azul-clara de Ferro", + "block.betterend.iron_bulb_lantern_light_gray": "Lanterna bulbo cinza-clara de Ferro", + "block.betterend.iron_bulb_lantern_lime": "Lanterna bulbo verde-limão de Ferro", + "block.betterend.iron_bulb_lantern_magenta": "Lanterna bulbo magenta de Ferro", + "block.betterend.iron_bulb_lantern_orange": "Lanterna bulbo laranja de Ferro", + "block.betterend.iron_bulb_lantern_pink": "Lanterna rosa de ferro de Bulbo", + "block.betterend.iron_bulb_lantern_purple": "Lanterna bulbo púrpura de Ferro", + "block.betterend.iron_bulb_lantern_red": "Lanterna bulbo vermelha de Ferro", + "block.betterend.iron_bulb_lantern_white": "Lanterna bulbo branca de Ferro", + "block.betterend.iron_bulb_lantern_yellow": "Lanterna bulbo amarelo de Ferro", + + "block.betterend.thallasium_bulb_lantern": "Lanterna bulbo de Thallasio", + "block.betterend.thallasium_bulb_lantern_black": "Lanterna bulbo preta de Thallasio", + "block.betterend.thallasium_bulb_lantern_blue": "Lanterna bulbo azul de Thallasio", + "block.betterend.thallasium_bulb_lantern_brown": "Lanterna bulbo marrom de Thallasio", + "block.betterend.thallasium_bulb_lantern_cyan": "Lanterna bulbo ciana de Thallasio", + "block.betterend.thallasium_bulb_lantern_gray": "Lanterna bulbo cinza de Thallasio", + "block.betterend.thallasium_bulb_lantern_green": "Lanterna bulbo verde de Thallasio", + "block.betterend.thallasium_bulb_lantern_light_blue": "Lanterna bulbo azul-clara de Thallasio", + "block.betterend.thallasium_bulb_lantern_light_gray": "Lanterna bulbo cinza-clara de Thallasio", + "block.betterend.thallasium_bulb_lantern_lime": "Lanterna bulbo verde-limão de Thallasio", + "block.betterend.thallasium_bulb_lantern_magenta": "Lanterna bulbo magenta de Thallasio", + "block.betterend.thallasium_bulb_lantern_orange": "Lanterna bulbo laranja de Thallasio", + "block.betterend.thallasium_bulb_lantern_pink": "Lanterna bulbo rosa de Thallasio", + "block.betterend.thallasium_bulb_lantern_purple": "Lanterna bulbo púrpura de Thallasio", + "block.betterend.thallasium_bulb_lantern_red": "Lanterna bulbo vermelha de Thallasio", + "block.betterend.thallasium_bulb_lantern_white": "Lanterna bulbo branca de Thallasio", + "block.betterend.thallasium_bulb_lantern_yellow": "Lanterna bulbo amarela de Thallasio", + + "block.betterend.bushy_grass": "Grama espessa", + + "block.betterend.brimstone": "Enxofre", + "block.betterend.sulphuric_rock": "Rocha Sulfúrica", + "block.betterend.sulphuric_rock_bricks": "Tijolos de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_bricks_slab": "Laje de tijolos de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_bricks_stairs": "Escadas de tijolos de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_bricks_wall": "Muro de tijolos de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_button": "Botão dde Rocha Sulfúrica", + "block.betterend.sulphuric_rock_lantern": "Lanterna de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_pedestal": "Pedestal de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_pillar": "Pilar de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_plate": "Placa de pressão de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_polished": "Rocha Sulfúrica polida", + "block.betterend.sulphuric_rock_slab": "Laje de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_stairs": "Escadas de Rocha Sulfúrica", + "block.betterend.sulphuric_rock_tiles": "Rocha Sulfúrica lapidada", + "block.betterend.sulphuric_rock_wall": "Muro de Rocha Sulfúrica", + "block.betterend.sulphur_crystal": "Cristal de enxofre", + "item.betterend.crystalline_sulphur": "Enxofre", + + "biome.betterend.sulphur_springs": "Fontes Sulfúricas", + "block.betterend.hydralux_petal_block": "Bloco de Pétalas Hidraluxe", + "block.betterend.hydralux_petal_block_black": "Bloco de Pétalas preto", + "block.betterend.hydralux_petal_block_blue": "Bloco de Pétalas azul", + "block.betterend.hydralux_petal_block_brown": "Bloco de Pétalas marrom", + "block.betterend.hydralux_petal_block_cyan": "Bloco de Pétalas ciano", + "block.betterend.hydralux_petal_block_gray": "Bloco de Pétalas cinza", + "block.betterend.hydralux_petal_block_green": "Bloco de Pétalas verde", + "block.betterend.hydralux_petal_block_light_blue": "Bloco de Pétalas azul-claro", + "block.betterend.hydralux_petal_block_light_gray": "Bloco de Pétalas cinza-claro", + "block.betterend.hydralux_petal_block_lime": "Bloco de Pétalas verde-limão", + "block.betterend.hydralux_petal_block_magenta": "Bloco de Pétalas magenta", + "block.betterend.hydralux_petal_block_orange": "Bloco de Pétalas laranja", + "block.betterend.hydralux_petal_block_pink": "Bloco de Pétalas rosa", + "block.betterend.hydralux_petal_block_purple": "Bloco de Pétalas púrpura", + "block.betterend.hydralux_petal_block_red": "Bloco de Pétalas veremelho", + "block.betterend.hydralux_petal_block_white": "White Petal Block", + "block.betterend.hydralux_petal_block_yellow": "Bloco de Pétalas amarelo", + "block.betterend.hydralux_sapling": "Muda de Hidraluxe", + "block.betterend.hydrothermal_vent": "Respiradouro Hidrotérmico", + "item.betterend.hydralux_petal": "Pétala de Hidraluxe", + "item.betterend.enchanted_petal": "Pétala encantada", + + "block.betterend.menger_sponge": "Esponja Menger", + "block.betterend.menger_sponge_wet": "Esponja Menger molhada", + "block.betterend.tube_worm": "Verme Tubular", + + "block.betterend.charnia_cyan": "Charnia Ciana", + "block.betterend.charnia_light_blue": "Charnia Azul-clara", + "block.betterend.charnia_orange": "Charnia Laranja", + "block.betterend.charnia_purple": "Charnia Púrpura", + "block.betterend.charnia_red": "Charnia Vermelha", + + "entity.betterend.cubozoa": "Cubozoa", + "item.betterend.spawn_egg_cubozoa": "Ovo gerador de Cubozoa", + + "item.betterend.gelatine": "Gelatina", + "item.betterend.sweet_berry_jelly": "Geléia de frutas doces", + "item.betterend.shadow_berry_jelly": "Geléia de frutas da Sombra", + + "block.betterend.amber_moss": "Musgo de Âmbar", + "block.betterend.amber_moss_path": "Caminho de musgo de Âmbar", + "block.betterend.helix_tree_bark": "Madeira de Árvore de Helix", + "block.betterend.helix_tree_barrel": "Barril de Árvore de Helix", + "block.betterend.helix_tree_bookshelf": "Estante de livros de Árvore de Helix", + "block.betterend.helix_tree_button": "botão de Árvore de Helix", + "block.betterend.helix_tree_chest": "Baú de Árvore de Helix", + "block.betterend.helix_tree_crafting_table": "Bancada de Trabalho de Árvore de Helix", + "block.betterend.helix_tree_door": "Porta de Árvore de Helix", + "block.betterend.helix_tree_fence": "Cerca de Árvore de Helix", + "block.betterend.helix_tree_gate": "Portão de Árvore de Helix", + "block.betterend.helix_tree_ladder": "Escada de mão de Árvore de Helix", + "block.betterend.helix_tree_leaves": "Folhas de Árvore de Helix", + "block.betterend.helix_tree_log": "Tronco de Árvore de Helix", + "block.betterend.helix_tree_planks": "Tábuas de Árvore de Helix", + "block.betterend.helix_tree_plate": "Placa de pressão de Árvore de Helix", + "block.betterend.helix_tree_sapling": "Muda de Árvore de Helix", + "block.betterend.helix_tree_sign": "Placa de Árvore de Helix", + "block.betterend.helix_tree_slab": "Laje de Árvore de Helix", + "block.betterend.helix_tree_stairs": "Escadas de Árvore de Helix", + "block.betterend.helix_tree_stripped_bark": "Madeira de Árvore de Helix descascada", + "block.betterend.helix_tree_stripped_log": "Tronco de Árvore de Helix descascado", + "block.betterend.helix_tree_trapdoor": "Alçapão de Árvore de Helix", + "block.betterend.lanceleaf": "Lanceleaf", + "block.betterend.lanceleaf_seed": "Semente de Lanceleaf", + "block.betterend.hydralux": "Hydralux", + "block.betterend.helix_tree_luminophor": "Árvore de Helix Luminophor", + + "block.betterend.glowing_pillar_leaves": "Folhas de pilar luminoso", + "block.betterend.glowing_pillar_luminophor": "Pilar luminoso de Luminophor", + "block.betterend.glowing_pillar_roots": "Raizes de pilar luminoso", + "block.betterend.glowing_pillar_seed": "Semente de pilar luminoso", + + "biome.betterend.ice_starfield": "Campo de Estrelas de Gelo", + + "block.betterend.ancient_emerald_ice": "Gelo Esmeralda Milenar", + "block.betterend.dense_emerald_ice": "Gelo Esmeralda Denso", + "block.betterend.dense_snow": "Neve Densa", + "block.betterend.emerald_ice": "Gelo Esmeralda", + + "block.betterend.bulb_moss": "Musgo Bulbo", + + "block.betterend.charnia_green": "Charnia Verde", + "block.betterend.vent_bubble_column": "Coluna de bolha de ventilação", + "block.betterend.respawn_obelisk": "Obelisco de Ressurgimento", + "message.betterend.set_spawn": "\u00A7b\u00A7lSeu ponto de renascimento está definido aqui", + "message.betterend.fail_spawn": "\u00A7c\u00A7lVocê precisa segurar 6 Joias de Âmbar para definir o seu ponto de renascimento", + + "block.betterend.dragon_tree_composter": "Composteira de Árvore do Dragão", + "block.betterend.end_lotus_composter": "Composteira de Lotus do End", + "block.betterend.helix_tree_composter": "Composteira de Árvore de Helix", + "block.betterend.lacugrove_composter": "Composteira de Lacugrove", + "block.betterend.mossy_glowshroom_composter": "Composteira de Coguluminoso Musgoso", + "block.betterend.pythadendron_composter": "Composteira de Pythadendron", + "block.betterend.tenanea_composter": "Composteira de Tenanea", + + "biome.betterend.old_bulbis_gardens": "Jardins Antigos Bulbis", + "block.betterend.ivis_moss": "Musgo Ivis", + "block.betterend.ivis_vine": "Trepadeiras Ivis", + "block.betterend.silk_moth_nest": "Ninho de Mariposa de Seda", + + "block.betterend.umbrella_tree_bark": "Madeira de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_barrel": "Barril de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_bookshelf": "Estante de livros de de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_button": "Botão de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_chest": "Baú de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_composter": "Composteira de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_crafting_table": "Bancada de Trabalho de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_door": "Porta de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_fence": "Cerca de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_gate": "Portão de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_ladder": "Escada de mão de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_log": "Tronco de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_planks": "Tábuas de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_plate": "Placa de pressão de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_sign": "Placa de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_slab": "Laje de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_stairs": "Escadas de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_stripped_bark": "Madeira de Árvore Guarda-chuva descascada", + "block.betterend.umbrella_tree_stripped_log": "Tronco de Árvore Guarda-chuva descascado", + "block.betterend.umbrella_tree_trapdoor": "Alçapão de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_membrane": "Membrana de Árvore Guarda-chuva", + + "biome.betterend.umbrella_jungle": "Selva de Guarda-chuvas", + "block.betterend.jungle_grass": "Jungle Grass", + "block.betterend.jungle_moss": "Jungle Moss", + "block.betterend.jungle_moss_path": "Caminho de Musgo da Selva", + "block.betterend.small_jellyshroom": "Cogumelo Gelatinoso pequeno", + "block.betterend.twisted_umbrella_moss": "Musgo torcido de Guarda-chuva", + "block.betterend.twisted_umbrella_moss_tall": "Musgo alto torcido de Guarda-chuva ", + "block.betterend.umbrella_tree_cluster": "Cacho de Árvore Guarda-chuva", + "block.betterend.umbrella_tree_cluster_empty": "Cacho vazio de Árvore Guada-chuva", + "block.betterend.jungle_vine": "Trepadeiras da Selva", + "block.betterend.jungle_fern": "Samambaia da Jungle", + + "block.betterend.jellyshroom_bark": "Madeira de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_barrel": "Barril de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_bookshelf": "Estante de livros de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_button": "botão de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_cap_purple": "Copa púrpura de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_chest": "Baú de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_composter": "Compesteira de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_crafting_table": "Bancada de Trabalho de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_door": "Porta de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_fence": "Cerca de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_gate": "Portão de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_ladder": "Escada de mão de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_log": "Tronco de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_planks": "Tábuas de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_plate": "Placa de pressão de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_sign": "Placa de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_slab": "Laje de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_stairs": "Escadas de Cogumelo Gelatinoso", + "block.betterend.jellyshroom_stripped_bark": "Madeira de Cogumelo Gelatinoso descascada", + "block.betterend.jellyshroom_stripped_log": "Tronco de Cogumelo Gelatinoso descascado", + "block.betterend.jellyshroom_trapdoor": "Alçapão de Cogumelo Gelatinoso", + + + "biome.betterend.eterial_grove": "Arvoredos Eterial", + "block.betterend.umbrella_tree_sapling": "Muda de Árvore Guarda-chuva", + "item.betterend.umbrella_cluster_juice": "Suco do Cacho de árvore guarda-chuva", + "block.betterend.blossom_berry_seed": "Semente de Flor de Baga", + "item.betterend.blossom_berry": "Flor de Baga", + + "biome.betterend.nightshade_redwoods": "Madeiras Vermelhas da Sombra Noturna", + "block.betterend.nightshade_moss": "Musgo da Sombra Noturna", + + "biome.betterend.glowing_grasslands": "Prados Brilhantes", + "block.betterend.blooming_cooksonia": "Flor Cooksonia", + "block.betterend.fracturn": "Fracturn", + "block.betterend.lumecorn": "Bloco de Espigaluminosa", + "block.betterend.salteago": "Salteago", + "block.betterend.vaiolush_fern": "Samambaia de Vaio Exuberante", + "entity.betterend.silk_moth": "Mariposa de Seda", + "item.betterend.silk_fiber": "Fibra de seda", + "item.betterend.spawn_egg_silk_moth": "Ovo gerador de Mariposa de Seda", + + "item.betterend.thallasium_raw": "Thallasio bruto", + "block.betterend.thallasium_ore": "Minério de Thallasio", + "item.betterend.thallasium_axe": "Machado de Thallasio", + "item.betterend.thallasium_hoe": "Enxada de Thallasio", + "item.betterend.thallasium_ingot": "Barra de Thallasio", + "item.betterend.thallasium_pickaxe": "Picareta de Thallasio", + "item.betterend.thallasium_shovel": "Pá de Thallasio", + "item.betterend.thallasium_sword": "Espada de Thallasio", + "block.betterend.thallasium_block": "Bloco de Thallasio", + + "block.betterend.thallasium_bars": "Grades de Thallasio", + "block.betterend.thallasium_door": "Porta de Thallasio", + "block.betterend.thallasium_plate": "Placa de pressão de Thallasio", + "block.betterend.thallasium_tile": "Thallasio lapidado", + "block.betterend.thallasium_trapdoor": "Alçapão de Thallasio", + + "block.betterend.lumecorn_seed": "Semenete de Espigaluminosa", + "item.betterend.lumecorn_rod": "Espigaluminosa", + "block.betterend.thallasium_chandelier": "Lustre de Thallasio", + + "block.betterend.thallasium_anvil": "Bigorna de Thallasio", + "block.betterend.thallasium_chain": "Corrente de Thallasio", + "block.betterend.thallasium_slab": "Laje de Thallasio", + "block.betterend.thallasium_stairs": "Escadas de Thallasio", + + "block.betterend.gold_chandelier": "Lustre de Ouro", + "block.betterend.iron_chandelier": "Lustre de Ferro", + "item.betterend.thallasium_nugget": "Pepita de Thallasio", + + "block.betterend.terminite_anvil": "Bigorna de Terminita", + "block.betterend.terminite_bars": "Grades de Terminita", + + "block.betterend.terminite_bulb_lantern": "Lanterna bulbo de Terminita", + "block.betterend.terminite_bulb_lantern_black": "Lanterna bulbo preta de Terminita", + "block.betterend.terminite_bulb_lantern_blue": "Lanterna bulbo azul de Terminita", + "block.betterend.terminite_bulb_lantern_brown": "Lanterna bulbo marrom de Terminita", + "block.betterend.terminite_bulb_lantern_cyan": "Lanterna bulbo ciana de Terminita", + "block.betterend.terminite_bulb_lantern_gray": "Lanterna bulbo cinza de Terminita", + "block.betterend.terminite_bulb_lantern_green": "Lanterna bulbo verde de Terminita", + "block.betterend.terminite_bulb_lantern_light_blue": "Lanterna bulbo azul-clara de Terminita", + "block.betterend.terminite_bulb_lantern_light_gray": "Lanterna bulbo cinza-clara de Terminita", + "block.betterend.terminite_bulb_lantern_lime": "Lanterna bulbo verde-limão de Terminita", + "block.betterend.terminite_bulb_lantern_magenta": "Lanterna bulbo magenta de Terminita", + "block.betterend.terminite_bulb_lantern_orange": "Lanterna bulbo laranja de Terminita", + "block.betterend.terminite_bulb_lantern_pink": "Lanterna bulbo rosa de Terminita", + "block.betterend.terminite_bulb_lantern_purple": "Lanterna bulbo púrpura de Terminita", + "block.betterend.terminite_bulb_lantern_red": "Lanterna bulbo vermelha de Terminita", + "block.betterend.terminite_bulb_lantern_white": "Lanterna bulbo branca de Terminita", + "block.betterend.terminite_bulb_lantern_yellow": "Lanterna bulbo amarela de Terminita", + + "block.betterend.terminite_chain": "Corrente de Terminita", + "block.betterend.terminite_chandelier": "Lustre de Terminita", + "block.betterend.terminite_door": "Porta de Terminita", + "block.betterend.terminite_plate": "Placa de pressão de Terminita", + "block.betterend.terminite_slab": "Laje de Terminita", + "block.betterend.terminite_stairs": "Escadas de Terminita", + "block.betterend.terminite_tile": "Terminita Lapidado", + "block.betterend.terminite_trapdoor": "Alçapão de Terminita", + "item.betterend.terminite_nugget": "Pepita de Terminita", + "item.betterend.thallasium_boots": "Botas de Thallasio", + "item.betterend.thallasium_chestplate": "Peitoral de Thallasio", + "item.betterend.thallasium_hammer": "Martelo de Thallasio", + "item.betterend.thallasium_helmet": "Capacete de Thallasio", + "item.betterend.thallasium_leggings": "Calças de Thallasio", + "block.betterend.missing_tile": "Ladrilho Ausente", + "block.betterend.charcoal_block": "Bloco de carvão", + "block.betterend.end_stone_furnace": "Fonalha de Pedra do End", + "block.betterend.flavolite_furnace": "Fornalha de Flavolito", + "block.betterend.sulphuric_rock_furnace": "Fornalha de Rocha Sulfúrica", + "block.betterend.violecite_furnace": "Fornalha de Violecita", + + "item.betterend.terminite_axe_head": "Cabeça de machado de Terminita", + "item.betterend.terminite_hoe_head": "Cabeça de enxada de Terminita", + "item.betterend.terminite_pickaxe_head": "Cabeça de picareta Terminita", + "item.betterend.terminite_shovel_head": "Cabeça de pá de Terminita", + "item.betterend.terminite_sword_blade": "Lâmina de espada de Terminita", + "item.betterend.terminite_sword_handle": "Punho de espada de Terminita", + "item.betterend.thallasium_axe_head": "Cabeça de machado de Thallasio", + "item.betterend.thallasium_hoe_head": "Cabeça de enxada de Thallasio", + "item.betterend.thallasium_pickaxe_head": "cabeça de picareta de Thallasio", + "item.betterend.thallasium_shovel_head": "Cabeça de pá de Thallasio", + "item.betterend.thallasium_sword_blade": "Punho de espada de Thallasio", + "item.betterend.thallasium_sword_handle": "Punho de espada de Thallasio", + "block.betterend.aeternium_anvil": "Bigorna de Aeternio", + + "biome.betterend.dragon_graveyards": "Cemitérios de Dragão", + "biome.betterend.dry_shrubland": "Arbusto Seco", + "block.betterend.aeridium": "Aeridio", + "block.betterend.amaranita_cap": "Copa de Amaranita", + "block.betterend.amaranita_fur": "Pelagem de Amaranita", + "block.betterend.amaranita_hymenophore": "Himenóforo de Amaranita", + "block.betterend.amaranita_hyphae": "Hifas de Amaranita", + "block.betterend.amaranita_lantern": "Lanterna de Amaranita", + "block.betterend.amaranita_stem": "Caule de Amaranita", + "block.betterend.clawfern": "Samambaia Gatázios", + "block.betterend.globulagus": "Globulagus", + "block.betterend.lamellarium": "Lamellario", + "block.betterend.large_amaranita_mushroom": "Cogumelo grande de Amaranita", + "block.betterend.lutebus": "Lutebus", + "block.betterend.mossy_bone": "Osso Musgoso", + "block.betterend.mossy_obsidian": "Obsidiana Musgosa", + "block.betterend.orango": "Laranjo", + "block.betterend.rutiscus": "Rutiscus", + "block.betterend.rutiscus_path": "Caminho de Rutiscus", + "block.betterend.sangnum": "Sangno", + "block.betterend.sangnum_path": "Caminho de Sangno", + "block.betterend.small_amaranita_mushroom": "Cogumelo pequeno de Amaranita", + + "block.betterend.amber_root_seed": "Semente de Raiz Âmbar", + "block.betterend.azure_jadestone": "Azure Jadestone", + "block.betterend.azure_jadestone_bricks": "Tijolos de Pedra jade azure", + "block.betterend.azure_jadestone_bricks_slab": "Laje de tijolos de Pedra Jade Azure", + "block.betterend.azure_jadestone_bricks_stairs": "Escadas de tijolos de Pedra Jade Azure", + "block.betterend.azure_jadestone_bricks_wall": "Muro de tijolos de Pedra Jade Azure", + "block.betterend.azure_jadestone_button": "Botão de Pedra Jade Azure", + "block.betterend.azure_jadestone_furnace": "Fornalha de Pedra Jade Azure", + "block.betterend.azure_jadestone_lantern": "Lanterna de Pedra Jade Azure", + "block.betterend.azure_jadestone_pedestal": "Pedestal de Pedra Jade Azure", + "block.betterend.azure_jadestone_pillar": "Pilar de Pedra Jade Azure", + "block.betterend.azure_jadestone_plate": "Placa de pressão de Pedra Jade Azure", + "block.betterend.azure_jadestone_polished": "Pedra Jade Azure polida", + "block.betterend.azure_jadestone_slab": "Laje de Pedra Jade Azure", + "block.betterend.azure_jadestone_stairs": "Escadas de Pedra Jade Azure", + "block.betterend.azure_jadestone_tiles": "Pedra Jade Azure lapidada", + "block.betterend.azure_jadestone_wall": "Muro de Pedra Jade Azure", + "block.betterend.chorus_mushroom_seed": "Semente de Cogumelo do coro", + "block.betterend.end_stone_stalactite": "Estalactite de Pedra do End", + "block.betterend.end_stone_stalactite_cavemoss": "Estalactite de Pedra do End de Musgo Cavernoso", + "block.betterend.pearlberry_seed": "Semente de Pérola", + "block.betterend.rubinea": "Rubinea", + "block.betterend.sandy_jadestone": "Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_bricks": "Tijolos de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_slab": "Laje de tijolos de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_stairs": "Escadas de tijolos de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_bricks_wall": "Muro de tijolos de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_button": "Botão de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_furnace": "Fornalha de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_lantern": "Lanterna de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_pedestal": "Pedestal de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_pillar": "Pilar de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_plate": "Placa de pressão de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_polished": "Pedra de Jade Arenosa polida", + "block.betterend.sandy_jadestone_slab": "Laje de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_stairs": "Escadas de Pedra de Jade Arenosa", + "block.betterend.sandy_jadestone_tiles": "Pedra de Jade Arenosa lapidada", + "block.betterend.sandy_jadestone_wall": "Muro de Pedra de Jade Arenosa", + + "block.betterend.smaragdant_crystal": "Cristal Esmaragdante", + "block.betterend.smaragdant_crystal_shard": "Fragmento de cristal de Esmaragdante", + + "block.betterend.virid_jadestone": "Pedra de Jade Viride", + "block.betterend.virid_jadestone_bricks": "Tijolos de Pedra de Jade Viride", + "block.betterend.virid_jadestone_bricks_slab": "Laje de tijolos de Pedra de Jade Viride", + "block.betterend.virid_jadestone_bricks_stairs": "Escadas de tijolos de Pedra de Jade Viride", + "block.betterend.virid_jadestone_bricks_wall": "Muro de tijolos de Pedra de Jade Viride", + "block.betterend.virid_jadestone_button": "Botão de Pedra de Jade Viride", + "block.betterend.virid_jadestone_furnace": "Fornalha de Pedra de Jade Viride", + "block.betterend.virid_jadestone_lantern": "Lanterna de Pedra de Jade Viride", + "block.betterend.virid_jadestone_pedestal": "Pedestal de Pedra de Jade Viride", + "block.betterend.virid_jadestone_pillar": "Pilar de Pedra de Jade Viride", + "block.betterend.virid_jadestone_plate": "Placa de pressão de Pedra de Jade Viride", + "block.betterend.virid_jadestone_polished": "Pedra de Jade Viride polida", + "block.betterend.virid_jadestone_slab": "Laje de Pedra de Jade Viride", + "block.betterend.virid_jadestone_stairs": "Escadas de Pedra de Jade Viride", + "block.betterend.virid_jadestone_tiles": "Pedra de Jade Viride lapidada", + "block.betterend.virid_jadestone_wall": "Muro de Pedra de Jade Viride", + + "item.betterend.amber_root_raw": "Raiz de Âmbar crua", + "item.betterend.chorus_mushroom_cooked": "Cogumelo do Coro cozido", + "item.betterend.chorus_mushroom_raw": "Cogumelo do Coro cru", + + "biome.betterend.empty_aurora_cave": "Caverna Aurora Vazia", + "biome.betterend.empty_end_cave": "Caverna do End Vazia", + "biome.betterend.empty_smaragdant_cave": "Caverna Exuberante de Esmaragdante Vazia", + "biome.betterend.lush_aurora_cave": "Caverna Exuberante de Aurora", + "biome.betterend.lush_smaragdant_cave": "Caverna Exuberante de Esmaragdante", + + "block.betterend.dragon_bone_block": "Bloco de Osso de Dragão", + "block.betterend.dragon_bone_slab": "Laje de Osso de Dragão", + "block.betterend.dragon_bone_stairs": "Escadas de Osso de Dragão", + "block.betterend.mossy_dragon_bone": "Osso de Dragão musgoso", + + "biome.betterend.lantern_woods": "Madeiras Lanterna", + "block.betterend.filalux": "Filaluxe", + "block.betterend.filalux_lantern": "Laterna de Filaluxe", + "block.betterend.filalux_wings": "Asas-de-Filaluxe", + "block.betterend.lucernia_bark": "Madeira de Lucernia", + "block.betterend.lucernia_barrel": "Barril de Lucernia", + "block.betterend.lucernia_bookshelf": "Estante de livros de Lucernia", + "block.betterend.lucernia_button": "botão de Lucernia", + "block.betterend.lucernia_chest": "Baú de Lucernia", + "block.betterend.lucernia_composter": "Compesteira de Lucernia", + "block.betterend.lucernia_crafting_table": "Bancada de Trabalho de Lucernia", + "block.betterend.lucernia_door": "Porta de Lucernia", + "block.betterend.lucernia_fence": "Cerca de Lucernia", + "block.betterend.lucernia_gate": "Portão de Lucernia", + "block.betterend.lucernia_ladder": "Escada de mão de Lucernia", + "block.betterend.lucernia_leaves": "Folhas de Lucernia", + "block.betterend.lucernia_log": "Tronco de Lucernia", + "block.betterend.lucernia_outer_leaves": "Folhas Exteriores de Lucernia", + "block.betterend.lucernia_planks": "Tábuas de Lucernia", + "block.betterend.lucernia_plate": "Placa de pressão de Lucernia", + "block.betterend.lucernia_sapling": "Muda de Lucernia", + "block.betterend.lucernia_sign": "Placa de Lucernia", + "block.betterend.lucernia_slab": "Laje de Lucernia", + "block.betterend.lucernia_stairs": "Escadas de Lucernia", + "block.betterend.lucernia_stripped_bark": "Madeira de Lucernia descascada", + "block.betterend.lucernia_stripped_log": "Tronco de Lucernia descascado", + "block.betterend.lucernia_trapdoor": "Alçapão de Lucernia", + + "block.betterend.aurant_polypore": "Poliporo Aurante", + "block.betterend.bolux_mushroom": "Cogumelo Boluxe", + "block.betterend.flamaea": "Flamaea", + "block.betterend.pond_anemone": "Anêmona de lago", + "block.betterend.ruscus": "Ruscus", + "item.betterend.bolux_mushroom_cooked": "Cogumelo Boluxe cozido", + + "block.betterend.silk_moth_hive": "Colmeia de Mariposa de Seda", + "item.betterend.silk_moth_matrix": "Matriz de Mariposa de Seda", + + "biome.betterend.neon_oasis": "Oasis Neon", + "block.betterend.cave_pumpkin": "Abóbora de Caverna", + "block.betterend.cave_pumpkin_seed": "Sementes de Abóbora de Caverna", + "block.betterend.magnula": "Magnula", + "block.betterend.neon_cactus": "Cacto Neon", + "item.betterend.cave_pumpkin_pie": "Torta de Abóbora de Caverna", + + "item.betterend.music_disc_strange_and_alien": "§bDisco de Música§r", + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fEstranho e Alienígena§r", + "item.betterend.music_disc_grasping_at_stars": "§bDisco de Música§r", + "item.betterend.music_disc_grasping_at_stars.desc": "§5Firel§r - §fAgarrando-se às Estrelas§r", + "item.betterend.music_disc_endseeker": "§bDisco de Música§r", + "item.betterend.music_disc_endseeker.desc": "§5Firel§r - §fCaçador do End§r", + "item.betterend.music_disc_eo_dracona": "§bDisco de Música§r", + "item.betterend.music_disc_eo_dracona.desc": "§5Firel§r - §fEo Dracona§r", + + "block.betterend.hydralux_petal_block_amber": "Bloco de Pétalas Âmbar", + "block.betterend.hydralux_petal_block_beige": "Bloco de pétalas bege", + "block.betterend.hydralux_petal_block_cream": "Bloco de pétalas creme", + "block.betterend.hydralux_petal_block_dark_green": "Bloco de pétalas verde-escuro", + "block.betterend.hydralux_petal_block_forest_green": "Bloco de pétalas verde-floresta", + "block.betterend.hydralux_petal_block_hot_pink": "Bloco de pétalas rosa-quente", + "block.betterend.hydralux_petal_block_indigo": "Bloco de pétalas indigo", + "block.betterend.hydralux_petal_block_maroon": "Bloco de pétalas maroon", + "block.betterend.hydralux_petal_block_navy": "Bloco de pétalas marinho", + "block.betterend.hydralux_petal_block_olive": "Bloco de pétalas oliva", + "block.betterend.hydralux_petal_block_pale_green": "Bloco de pétalas verde-pálido", + "block.betterend.hydralux_petal_block_pale_pink": "Bloco de pétalas rosa-pálido", + "block.betterend.hydralux_petal_block_pale_yellow": "Bloco de pétalas amerelo-pálido", + "block.betterend.hydralux_petal_block_sky_blue": "Bloco de pétalas céu-azul", + "block.betterend.hydralux_petal_block_slate_gray": "Bloco de pétalas ardósia-cinza", + "block.betterend.hydralux_petal_block_violet": "Bloco de pétalas violeta", + + "block.betterend.smaragdant_crystal_bricks": "Tijolos de Esmaragdante", + "block.betterend.smaragdant_crystal_bricks_slab": "Laje de tijolos de Esmaragdante", + "block.betterend.smaragdant_crystal_bricks_stairs": "Escadas de tijolos de Esmaragdante", + "block.betterend.smaragdant_crystal_bricks_wall": "Muro de tijolos de Esmaragdante", + "block.betterend.smaragdant_crystal_pedestal": "Pedestal de Esmaragdante", + "block.betterend.smaragdant_crystal_pillar": "Pilar de Esmaragdante", + "block.betterend.smaragdant_crystal_polished": "Esmaragdante Polido", + "block.betterend.smaragdant_crystal_slab": "Laje de Esmaragdante", + "block.betterend.smaragdant_crystal_stairs": "Escadas de Esmaragdante", + "block.betterend.smaragdant_crystal_tiles": "Esmaragdante lapidado", + "block.betterend.smaragdant_crystal_wall": "Muro de Esmaragdante", + "message.betterend.anvil_damage": "§cDano", + + "block.betterend.neon_cactus_block": "Bloco de Cacto Neon", + "block.betterend.neon_cactus_slab": "Laje de Cacto Neon", + "block.betterend.neon_cactus_stairs": "Escadas de Cacto Neon", + "biome.betterend.jade_cave": "Caverna de Jade", + "item.betterend.blossom_berry_jelly": "Geléia de baga de flor", + "item.betterend.aeternium_forged_plate": "Placa forjada de Aeternio", + "item.betterend.terminite_forged_plate": "Placa forjada de Terminita", + "item.betterend.thallasium_forged_plate": "Placa forjada de Thallasio", + + "attribute.name.generic.blindness_resistance": "Resistência à cegueira", + + "tooltip.armor.crystalite_set": "Conjunto de bônus: Regeneração I", + "tooltip.armor.crystalite_chest": "Efeito: Velocidade de escavação I", + "tooltip.armor.crystalite_boots": "Efeito: Velocidade I", + + "block.betterend.azure_jadestone_flower_pot": "Vaso de flor de Pedra de Jade Azure", + "block.betterend.endstone_flower_pot": "Vaso de flor de Pedra do End", + "block.betterend.flavolite_flower_pot": "Vaso de flor de Flavolito", + "block.betterend.sandy_jadestone_flower_pot": "Vaso de flor de Pedra de Jade Arenosa", + "block.betterend.sulphuric_rock_flower_pot": "Vaso de flor de Rocha Sulfúrica", + "block.betterend.violecite_flower_pot": "Vaso de flor de Violecita", + "block.betterend.virid_jadestone_flower_pot": "Vaso de flor de Pedra de Jade Viride", + "block.betterend.virid_jadestone_flower_pot": "Vaso de flor de Pedra de Jade Viride", + + "block.betterend.umbralith": "Umbralite", + "block.betterend.umbralith_bricks": "Tijolos de Umbralite", + "block.betterend.umbralith_bricks_slab": "Laje de tijolos de Umbralite", + "block.betterend.umbralith_bricks_stairs": "Escadas de tijolos de Umbralite", + "block.betterend.umbralith_bricks_wall": "Muro de tijolos de Umbralite", + "block.betterend.umbralith_button": "Botão de Umbralite", + "block.betterend.umbralith_flower_pot": "Vaso de flores de Umbralite", + "block.betterend.umbralith_furnace": "Fornalha de Umbralite", + "block.betterend.umbralith_lantern": "Lanterna de Umbralite", + "block.betterend.umbralith_pedestal": "Pesdestal de Umbralite", + "block.betterend.umbralith_pillar": "Pilar de Umbralite", + "block.betterend.umbralith_plate": "Placa de pressão de Umbralite", + "block.betterend.umbralith_polished": "Umbralite Polido", + "block.betterend.umbralith_slab": "Laje de Umbralite", + "block.betterend.umbralith_stairs": "Escadas de Umbralite", + "block.betterend.umbralith_tiles": "Umbralite Lapido", + "block.betterend.umbralith_wall": "Muro de Umbralite", + + "biome.betterend.umbra_valley": "Vale Da Sombra", + "block.betterend.inflexia": "Inflexia", + "block.betterend.pallidium_full": "Pallidio (Cobertura completa)", + "block.betterend.pallidium_heavy": "Pallidio (Cobertura pesada)", + "block.betterend.pallidium_thin": "Pallidio (Cobertuna fina)", + "block.betterend.pallidium_tiny": "Pallidio (Cobertura dispersada)", + "block.betterend.flammalix": "Flammalixe" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 1db5508b..f948788a 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -125,7 +125,7 @@ "block.betterend.dense_vine": "Плотная лоза", "block.betterend.bubble_coral": "Пузырчатый коралл", "block.betterend.aurora_crystal": "Кристалл авроры", - "item.betterend.crystal_shards": "Осколки кристаллов", + "item.betterend.crystal_shards": "Осколки кристаллов авроры", "block.betterend.pythadendron_sapling": "Саженец пифадендрона", "block.betterend.pythadendron_bark": "Кора пифадендрона", @@ -618,6 +618,7 @@ "item.betterend.silk_fiber": "Шёлковое волокно", "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли", + "item.betterend.thallasium_raw": "Необработанный талласий", "block.betterend.thallasium_ore": "Талласиевая руда", "item.betterend.thallasium_axe": "Талласиевый топор", "item.betterend.thallasium_hoe": "Талласиевая мотыга", @@ -859,7 +860,7 @@ "block.betterend.hydralux_petal_block_pale_green": "Бледно-зеленый блок лепестков", "block.betterend.hydralux_petal_block_pale_pink": "Бледно-розовый блок лепестков", "block.betterend.hydralux_petal_block_pale_yellow": "Бледно-жёлтый блок лепестков", - "block.betterend.hydralux_petal_block_sky_blue": "Неьесно-голубой блок лепестков", + "block.betterend.hydralux_petal_block_sky_blue": "Небесно-голубой блок лепестков", "block.betterend.hydralux_petal_block_slate_gray": "Сланцево-серый блок лепестков", "block.betterend.hydralux_petal_block_violet": "Лиловый блок лепестков", @@ -889,5 +890,39 @@ "tooltip.armor.crystalite_set": "Бонус сета: Регенерация I", "tooltip.armor.crystalite_chest": "Эффект: Ускорение I", - "tooltip.armor.crystalite_boots": "Эффект: Стремительность I" + "tooltip.armor.crystalite_boots": "Эффект: Стремительность I", + + "block.betterend.azure_jadestone_flower_pot": "Цветочный горшок из лазурного нефрита", + "block.betterend.endstone_flower_pot": "Цветочный горшок из эндерняка", + "block.betterend.flavolite_flower_pot": "Цветочный горшок из флаволита", + "block.betterend.sandy_jadestone_flower_pot": "Цветочный горшок из песчаного нефрита", + "block.betterend.sulphuric_rock_flower_pot": "Цветочный горшок из серного камня", + "block.betterend.violecite_flower_pot": "Цветочный горшок из виолецита", + "block.betterend.virid_jadestone_flower_pot": "Цветочный горшок из зелёного нефрита", + + "block.betterend.umbralith": "Умбралит", + "block.betterend.umbralith_bricks": "Умбралитовые кирпичи", + "block.betterend.umbralith_bricks_slab": "Плита из умбралитовых кирпичей", + "block.betterend.umbralith_bricks_stairs": "Ступени из умбралитовых кирпичей", + "block.betterend.umbralith_bricks_wall": "Стена из умбралитовых кирпичей", + "block.betterend.umbralith_button": "Умбралитовая кнопка", + "block.betterend.umbralith_flower_pot": "Умбралитовый горшок", + "block.betterend.umbralith_furnace": "Умбралитовая печь", + "block.betterend.umbralith_lantern": "Умбралитовый фонарь", + "block.betterend.umbralith_pedestal": "Умбралитовый пьедестал", + "block.betterend.umbralith_pillar": "Умбралитовая колонна", + "block.betterend.umbralith_plate": "Умбралитовая нажимная плита", + "block.betterend.umbralith_polished": "Полированный умбралит", + "block.betterend.umbralith_slab": "Умбралитовая плита", + "block.betterend.umbralith_stairs": "Умбралитовые ступени", + "block.betterend.umbralith_tiles": "Умбралитовая плитка", + "block.betterend.umbralith_wall": "Умбралитовая стена", + + "biome.betterend.umbra_valley": "Долина Умбра", + "block.betterend.inflexia": "Инфлексия", + "block.betterend.pallidium_full": "Паллидиум (полное покрытие)", + "block.betterend.pallidium_heavy": "Паллидиум (густое покрытие)", + "block.betterend.pallidium_thin": "Паллидиум (тонкое покрытие)", + "block.betterend.pallidium_tiny": "Паллидиум (маленькое покрытие)", + "block.betterend.flammalix": "Фламмаликс" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/zh_cn.json b/src/main/resources/assets/betterend/lang/zh_cn.json index 524c9ddb..d8204197 100644 --- a/src/main/resources/assets/betterend/lang/zh_cn.json +++ b/src/main/resources/assets/betterend/lang/zh_cn.json @@ -44,18 +44,11 @@ "item.betterend.aeternium_leggings": "太古合金护腿", "item.betterend.aeternium_boots": "太古合金靴子", "item.betterend.aeternium_shovel": "太古合金锹", - "item.betterend.aeternium_shovel_head": "太古合金锹头部", "item.betterend.aeternium_sword": "太古合金剑", - "item.betterend.aeternium_sword_blade": "太古合金剑刃", - "item.betterend.aeternium_sword_handle": "太古合金剑柄", "item.betterend.aeternium_pickaxe": "太古合金镐", - "item.betterend.aeternium_pickaxe_head": "太古合金镐头部", "item.betterend.aeternium_axe": "太古合金斧", - "item.betterend.aeternium_axe_head": "太古合金斧头部", "item.betterend.aeternium_hoe": "太古合金锄", - "item.betterend.aeternium_hoe_head": "太古合金锄头部", "item.betterend.aeternium_hammer": "太古合金锻锤", - "item.betterend.aeternium_hammer_head": "太古合金锻锤头部", "item.betterend.iron_hammer": "铁锻锤", "item.betterend.golden_hammer": "金锻锤", "item.betterend.diamond_hammer": "钻石锻锤", @@ -64,9 +57,18 @@ "item.betterend.crystalite_chestplate": "融晶合金胸甲", "item.betterend.crystalite_helmet": "融晶合金头盔", "item.betterend.crystalite_leggings": "融晶合金护腿", + "item.betterend.aeternium_axe_head": "太古合金斧头部", + "item.betterend.aeternium_hammer_head": "太古合金锻锤头部", + "item.betterend.aeternium_hoe_head": "太古合金锄头部", + "item.betterend.aeternium_pickaxe_head": "太古合金镐头部", + "item.betterend.aeternium_shovel_head": "太古合金锹头部", + "item.betterend.aeternium_sword_blade": "太古合金剑刃", + "item.betterend.aeternium_sword_handle": "太古合金剑柄", "item.betterend.leather_stripe": "皮革条纹", "item.betterend.leather_wrapped_stick": "皮革包装棒", "item.betterend.elytra_armored": "装甲鞘翅", + "item.betterend.elytra_crystalite": "鞘翅融晶合金", + "item.betterend.enchanted_membrane": "附魔膜", "effect.betterend.end_veil": "末地面纱", "enchantment.betterend.end_veil": "末地面纱", "item.minecraft.potion.effect.end_veil": "末地面纱药水", @@ -145,7 +147,7 @@ "block.betterend.violecite_pillar": "紫罗兰石柱", "block.betterend.violecite_plate": "紫罗兰石压力板", "block.betterend.violecite_slab": "紫罗兰石台阶", - "block.betterend.violecite_tiles": "紫罗兰石瓷砖", + "block.betterend.violecite_tiles": "紫罗兰石瓦", "block.betterend.violecite_stairs": "紫罗兰石楼梯", "block.betterend.violecite_polished": "磨制紫罗兰石", "block.betterend.violecite_wall": "紫罗兰石墙", @@ -159,7 +161,7 @@ "block.betterend.flavolite_pillar": "苍黄石柱", "block.betterend.flavolite_plate": "苍黄石压力板", "block.betterend.flavolite_slab": "苍黄石台阶", - "block.betterend.flavolite_tiles": "苍黄石瓷砖", + "block.betterend.flavolite_tiles": "苍黄石瓦", "block.betterend.flavolite_stairs": "苍黄石楼梯", "block.betterend.flavolite_polished": "磨制苍黄石", "block.betterend.flavolite_wall": "苍黄石墙", @@ -354,25 +356,25 @@ "block.betterend.thallasium_bulb_lantern_white": "白色铊灯泡灯笼", "block.betterend.thallasium_bulb_lantern_yellow": "黄色铊灯泡灯笼", "block.betterend.bushy_grass": "丛藓", - "block.betterend.brimstone": "硫磺石", - "block.betterend.sulphuric_rock": "硫磺岩", - "block.betterend.sulphuric_rock_bricks": "硫磺岩砖", - "block.betterend.sulphuric_rock_bricks_slab": "硫磺岩砖台阶", - "block.betterend.sulphuric_rock_bricks_stairs": "硫磺岩砖楼梯", - "block.betterend.sulphuric_rock_bricks_wall": "硫磺岩砖墙", - "block.betterend.sulphuric_rock_button": "硫磺岩按钮", - "block.betterend.sulphuric_rock_lantern": "硫磺岩灯笼", - "block.betterend.sulphuric_rock_pedestal": "硫磺岩基座", - "block.betterend.sulphuric_rock_pillar": "硫磺岩柱", - "block.betterend.sulphuric_rock_plate": "硫磺岩压力板", - "block.betterend.sulphuric_rock_polished": "磨制硫磺岩", - "block.betterend.sulphuric_rock_slab": "硫磺岩台阶", - "block.betterend.sulphuric_rock_stairs": "硫磺岩楼梯", - "block.betterend.sulphuric_rock_tiles": "硫磺岩瓷砖", - "block.betterend.sulphuric_rock_wall": "硫磺岩墙", - "block.betterend.sulphur_crystal": "硫磺结晶", - "item.betterend.crystalline_sulphur": "硫磺", - "biome.betterend.sulphur_springs": "硫磺矿泉", + "block.betterend.brimstone": "硫黄", + "block.betterend.sulphuric_rock": "硫黄岩", + "block.betterend.sulphuric_rock_bricks": "硫黄岩砖", + "block.betterend.sulphuric_rock_bricks_slab": "硫黄岩砖台阶", + "block.betterend.sulphuric_rock_bricks_stairs": "硫黄岩砖楼梯", + "block.betterend.sulphuric_rock_bricks_wall": "硫黄岩砖墙", + "block.betterend.sulphuric_rock_button": "硫黄岩按钮", + "block.betterend.sulphuric_rock_lantern": "硫黄岩灯笼", + "block.betterend.sulphuric_rock_pedestal": "硫黄岩基座", + "block.betterend.sulphuric_rock_pillar": "硫黄岩柱", + "block.betterend.sulphuric_rock_plate": "硫黄岩压力板", + "block.betterend.sulphuric_rock_polished": "磨制硫黄岩", + "block.betterend.sulphuric_rock_slab": "硫黄岩台阶", + "block.betterend.sulphuric_rock_stairs": "硫黄岩楼梯", + "block.betterend.sulphuric_rock_tiles": "硫黄岩瓦", + "block.betterend.sulphuric_rock_wall": "硫黄岩墙", + "block.betterend.sulphur_crystal": "硫黄结晶", + "item.betterend.crystalline_sulphur": "硫黄", + "biome.betterend.sulphur_springs": "硫黄矿泉", "block.betterend.hydralux_petal_block": "水生勒克斯花瓣块", "block.betterend.hydralux_petal_block_black": "黑色花瓣块", "block.betterend.hydralux_petal_block_blue": "蓝色花瓣块", @@ -529,6 +531,7 @@ "entity.betterend.silk_moth": "蚕", "item.betterend.silk_fiber": "蚕丝", "item.betterend.spawn_egg_silk_moth": "蚕刷怪蛋", + "item.betterend.thallasium_raw": "Raw Thallasium", "block.betterend.thallasium_ore": "铊矿", "item.betterend.thallasium_axe": "铊斧头", "item.betterend.thallasium_hoe": "铊锄", @@ -589,7 +592,7 @@ "block.betterend.charcoal_block": "木碳块", "block.betterend.end_stone_furnace": "末地石熔炉", "block.betterend.flavolite_furnace": "苍黄石熔炉", - "block.betterend.sulphuric_rock_furnace": "硫磺熔炉", + "block.betterend.sulphuric_rock_furnace": "硫黄岩熔炉", "block.betterend.violecite_furnace": "紫罗兰石熔炉", "item.betterend.terminite_axe_head": "终界斧头部", "item.betterend.terminite_hoe_head": "终界锄头部", @@ -736,9 +739,13 @@ "block.betterend.neon_cactus": "霓虹仙人掌", "item.betterend.cave_pumpkin_pie": "洞穴南瓜饼", "item.betterend.music_disc_strange_and_alien": "§b音乐光盘§r", + "item.betterend.music_disc_strange_and_alien.desc": "§5Firel§r - §fStrange And Alien§r", "item.betterend.music_disc_grasping_at_stars": "§b音乐光盘§r", + "item.betterend.music_disc_grasping_at_stars.desc": "§5Firel§r - §fGrasping At Stars§r", "item.betterend.music_disc_endseeker": "§b音乐光盘§r", + "item.betterend.music_disc_endseeker.desc": "§5Firel§r - §fEndseeker§r", "item.betterend.music_disc_eo_dracona": "§b音乐光盘§r", + "item.betterend.music_disc_eo_dracona.desc": "§5Firel§r - §fEo Dracona§r", "block.betterend.hydralux_petal_block_amber": "琥珀花瓣块", "block.betterend.hydralux_petal_block_beige": "米色花瓣块", "block.betterend.hydralux_petal_block_cream": "奶油花瓣块", @@ -774,5 +781,40 @@ "item.betterend.blossom_berry_jelly": "开花浆果果冻", "item.betterend.aeternium_forged_plate": "太古合金锻造盘", "item.betterend.terminite_forged_plate": "终界锻造盘", - "item.betterend.thallasium_forged_plate": "铊锻造盘" + "item.betterend.thallasium_forged_plate": "铊锻造盘", + "attribute.name.generic.blindness_resistance": "失明防御", + "tooltip.armor.crystalite_set": "设置奖励:再生 I", + "tooltip.armor.crystalite_chest": "效果:挖掘速度 I", + "tooltip.armor.crystalite_boots": "效果:迅捷 I", + "block.betterend.azure_jadestone_flower_pot": "蓝晶花盆", + "block.betterend.endstone_flower_pot": "末地花盆", + "block.betterend.flavolite_flower_pot": "苍黄石花盆", + "block.betterend.sandy_jadestone_flower_pot": "沙玉花盆", + "block.betterend.sulphuric_rock_flower_pot": "硫黄岩花盆", + "block.betterend.violecite_flower_pot": "紫罗兰石花盆", + "block.betterend.virid_jadestone_flower_pot": "翠碧玉石花盆", + "block.betterend.umbralith": "灰暗石", + "block.betterend.umbralith_bricks": "灰暗石砖", + "block.betterend.umbralith_bricks_slab": "灰暗石砖台阶", + "block.betterend.umbralith_bricks_stairs": "灰暗石砖楼梯", + "block.betterend.umbralith_bricks_wall": "灰暗石砖墙", + "block.betterend.umbralith_button": "灰暗石按钮", + "block.betterend.umbralith_flower_pot": "灰暗石花盆", + "block.betterend.umbralith_furnace": "灰暗石熔炉", + "block.betterend.umbralith_lantern": "灰暗石灯笼", + "block.betterend.umbralith_pedestal": "灰暗石基座", + "block.betterend.umbralith_pillar": "灰暗石柱", + "block.betterend.umbralith_plate": "灰暗石压力板", + "block.betterend.umbralith_polished": "磨制灰暗石", + "block.betterend.umbralith_slab": "灰暗石台阶", + "block.betterend.umbralith_stairs": "灰暗石楼梯", + "block.betterend.umbralith_tiles": "灰暗石瓦", + "block.betterend.umbralith_wall": "灰暗石墙", + "biome.betterend.umbra_valley": "灰暗谷", + "block.betterend.inflexia": "曲转草", + "block.betterend.pallidium_full": "蒿石(完全覆盖)", + "block.betterend.pallidium_heavy": "蒿石(基本覆盖)", + "block.betterend.pallidium_thin": "蒿石(部分覆盖)", + "block.betterend.pallidium_tiny": "蒿石(略微覆盖)", + "block.betterend.flammalix": "燃草" } diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json new file mode 100644 index 00000000..c2b812b6 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/models/block/amber_grass_potted.json b/src/main/resources/assets/betterend/models/block/amber_grass_potted.json new file mode 100644 index 00000000..9b669549 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_grass_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/amber_grass_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/amber_root_seed_potted.json b/src/main/resources/assets/betterend/models/block/amber_root_seed_potted.json new file mode 100644 index 00000000..3bce217c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/amber_root_seed_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/amber_root_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/blooming_cooksonia_potted.json b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_potted.json new file mode 100644 index 00000000..b3abaa7d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/blooming_cooksonia_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/blooming_cooksonia_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/bolux_mushroom_potted.json b/src/main/resources/assets/betterend/models/block/bolux_mushroom_potted.json new file mode 100644 index 00000000..5730313a --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bolux_mushroom_potted.json @@ -0,0 +1,45 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/bolux_mushroom", + "texture": "betterend:block/bolux_mushroom" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 3, 4 ], + "to": [ 12, 7, 12 ], + "faces": { + "down": { "uv": [ 0, 8, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "south": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "west": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 8, 12, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 7, 5 ], + "to": [ 11, 8, 11 ], + "faces": { + "up": { "uv": [ 9, 1, 15, 7 ], "texture": "#texture" }, + "north": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "south": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "west": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" }, + "east": { "uv": [ 9, 11, 15, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 3, 9 ], + "faces": { + "north": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 2, 3 ], "texture": "#texture" }, + "west": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" }, + "east": { "uv": [ 2, 0, 0, 3 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/bushy_grass_potted.json b/src/main/resources/assets/betterend/models/block/bushy_grass_potted.json new file mode 100644 index 00000000..e9e9c134 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/bushy_grass_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/bushy_grass_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/cave_grass_potted.json b/src/main/resources/assets/betterend/models/block/cave_grass_potted.json new file mode 100644 index 00000000..618a68dc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/cave_grass_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/cave_grass_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/chorus_grass_potted.json b/src/main/resources/assets/betterend/models/block/chorus_grass_potted.json new file mode 100644 index 00000000..f7a83d0c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_grass_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/chorus_grass_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/chorus_mushroom_seed_potted.json b/src/main/resources/assets/betterend/models/block/chorus_mushroom_seed_potted.json new file mode 100644 index 00000000..58cf9e2d --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/chorus_mushroom_seed_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/chorus_mushroom_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/clawfern_potted.json b/src/main/resources/assets/betterend/models/block/clawfern_potted.json new file mode 100644 index 00000000..9ac28aa5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/clawfern_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/clawfern_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/crystal_grass_potted.json b/src/main/resources/assets/betterend/models/block/crystal_grass_potted.json new file mode 100644 index 00000000..96fd61d3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/crystal_grass_potted.json @@ -0,0 +1,95 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/crystal_grass_2", + "texture": "betterend:block/crystal_grass_2" + }, + "elements": [ + { + "__comment": "PlaneX1", + "from": [ 5, 0, 4.5 ], + "to": [ 5.001, 9, 9.5 ], + "rotation": { "origin": [ 5, 0, 4.5 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 8.5, 0, 4.5 ], + "to": [ 8.501, 9, 9.5 ], + "rotation": { "origin": [ 8.5, 0, 4.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 4, 8.5, 4 ], + "to": [ 9, 8.501, 9 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 5, 5 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 8.5, -3, 7 ], + "to": [ 8.501, 6, 12 ], + "rotation": { "origin": [ 8.5, -3, 7 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 12, -3, 7 ], + "to": [ 12.001, 6, 12 ], + "rotation": { "origin": [ 12, -3, 7 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 7, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneY4", + "from": [ 8, 5.5, 6 ], + "to": [ 13, 5.501, 11 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 5, 5 ], "texture": "#texture" }, + "up": { "uv": [ 0, 0, 5, 5 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 5, -3, 9 ], + "to": [ 5.001, 5, 14 ], + "rotation": { "origin": [ 5, -3, 9 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 8, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 8, 11, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX1", + "from": [ 8, -3, 9.5 ], + "to": [ 8.001, 5, 14.5 ], + "rotation": { "origin": [ 8, -3, 9.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 6, 8, 11, 16 ], "texture": "#texture" }, + "east": { "uv": [ 6, 8, 11, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flammalix_1.json b/src/main/resources/assets/betterend/models/block/flammalix_1.json new file mode 100644 index 00000000..990e7d6e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flammalix_1.json @@ -0,0 +1,262 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "betterend:block/flammalix", + "particle": "betterend:block/flammalix" + }, + "elements": [ + { + "name": "stem", + "from": [4, 0, 4], + "to": [5, 3, 5], + "faces": { + "north": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "east": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "south": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "west": {"uv": [14, 6, 15, 9], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [2, 3, 2], + "to": [7, 7, 7], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [7, 3, 2], + "to": [2, 7, 7], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [3, 4, 3], + "to": [6, 7, 6], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [3, 2, 3], + "to": [6, 3, 6], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "stem_thick", + "from": [10.5, 0, 5.5], + "to": [12.5, 2, 7.5], + "faces": { + "north": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 8], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 8], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [11, 2, 6], + "to": [12, 5, 7], + "faces": { + "north": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 7], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [9, 3, 4], + "to": [14, 7, 9], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [14, 3, 4], + "to": [9, 7, 9], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [10, 5, 5], + "to": [13, 8, 8], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [10, 2, 5], + "to": [13, 3, 8], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "stem_thick", + "from": [6, 0, 12], + "to": [8, 3, 14], + "faces": { + "north": {"uv": [6, 6, 8, 9], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 9], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 9], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 9], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [6.5, 4, 12.5], + "to": [7.5, 9, 13.5], + "faces": { + "north": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 9], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [4, 4, 10], + "to": [10, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "east": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "south": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "west": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "down": {"uv": [0, 10, 6, 16], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [10, 4, 10], + "to": [4, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "east": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "south": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "west": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "down": {"uv": [0, 10, 6, 16], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [5.5, 8, 11.5], + "to": [8.5, 12, 14.5], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bottom", + "from": [5, 3, 11], + "to": [9, 4, 15], + "shade": false, + "faces": { + "north": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "east": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "west": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "down": {"uv": [1, 11, 5, 15], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "small", + "origin": [0, 0, 0], + "color": 0, + "children": [0, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2] + }, 3, 4] + }, + { + "name": "medium", + "origin": [0, 0, 0], + "color": 0, + "children": [5, 6, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [7, 8] + }, 9, 10] + }, + { + "name": "large", + "origin": [0, 0, 0], + "color": 0, + "children": [11, 12, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [13, 14] + }, 15, 16] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flammalix_2.json b/src/main/resources/assets/betterend/models/block/flammalix_2.json new file mode 100644 index 00000000..efb49fc3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flammalix_2.json @@ -0,0 +1,186 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "betterend:block/flammalix", + "particle": "betterend:block/flammalix" + }, + "elements": [ + { + "name": "stem_thick", + "from": [9.5, 0, 2.5], + "to": [11.5, 2, 4.5], + "faces": { + "north": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 8], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 8], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [10, 2, 3], + "to": [11, 5, 4], + "faces": { + "north": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 7], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [8, 3, 1], + "to": [13, 7, 6], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [13, 3, 1], + "to": [8, 7, 6], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [9, 5, 2], + "to": [12, 8, 5], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [9, 2, 2], + "to": [12, 3, 5], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "stem_thick", + "from": [4, 0, 10], + "to": [6, 3, 12], + "faces": { + "north": {"uv": [6, 6, 8, 9], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 9], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 9], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 9], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [4.5, 4, 10.5], + "to": [5.5, 9, 11.5], + "faces": { + "north": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 9], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 9], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [2, 4, 8], + "to": [8, 8, 14], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "east": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "south": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "west": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "down": {"uv": [0, 10, 6, 16], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [8, 4, 8], + "to": [2, 8, 14], + "shade": false, + "faces": { + "north": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "east": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "south": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "west": {"uv": [6, 0, 12, 4], "texture": "#0"}, + "down": {"uv": [0, 10, 6, 16], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [3.5, 8, 9.5], + "to": [6.5, 12, 12.5], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 4], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bottom", + "from": [3, 3, 9], + "to": [7, 4, 13], + "shade": false, + "faces": { + "north": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "east": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "south": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "west": {"uv": [7, 4, 11, 5], "texture": "#0"}, + "down": {"uv": [1, 11, 5, 15], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "medium", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3] + }, 4, 5] + }, + { + "name": "large", + "origin": [0, 0, 0], + "color": 0, + "children": [6, 7, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [8, 9] + }, 10, 11] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flammalix_3.json b/src/main/resources/assets/betterend/models/block/flammalix_3.json new file mode 100644 index 00000000..4be4def9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flammalix_3.json @@ -0,0 +1,175 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "betterend:block/flammalix", + "particle": "betterend:block/flammalix" + }, + "elements": [ + { + "name": "stem", + "from": [4, 0, 4], + "to": [5, 3, 5], + "faces": { + "north": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "east": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "south": {"uv": [14, 6, 15, 9], "texture": "#0"}, + "west": {"uv": [14, 6, 15, 9], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [2, 3, 2], + "to": [7, 7, 7], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [7, 3, 2], + "to": [2, 7, 7], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [3, 4, 3], + "to": [6, 7, 6], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [3, 2, 3], + "to": [6, 3, 6], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "stem_thick", + "from": [10.5, 0, 10.5], + "to": [12.5, 2, 12.5], + "faces": { + "north": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 8], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 8], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [11, 2, 11], + "to": [12, 5, 12], + "faces": { + "north": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 7], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [9, 3, 9], + "to": [14, 7, 14], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [14, 3, 9], + "to": [9, 7, 14], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [10, 5, 10], + "to": [13, 8, 13], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [10, 2, 10], + "to": [13, 3, 13], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "small", + "origin": [0, 0, 0], + "color": 0, + "children": [0, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2] + }, 3, 4] + }, + { + "name": "medium", + "origin": [0, 0, 0], + "color": 0, + "children": [5, 6, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [7, 8] + }, 9, 10] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flammalix_4.json b/src/main/resources/assets/betterend/models/block/flammalix_4.json new file mode 100644 index 00000000..be931203 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flammalix_4.json @@ -0,0 +1,99 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "betterend:block/flammalix", + "particle": "betterend:block/flammalix" + }, + "elements": [ + { + "name": "stem_thick", + "from": [7.5, 0, 8.5], + "to": [9.5, 2, 10.5], + "faces": { + "north": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 8], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 8], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [8, 2, 9], + "to": [9, 5, 10], + "faces": { + "north": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 7], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [6, 3, 7], + "to": [11, 7, 12], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [11, 3, 7], + "to": [6, 7, 12], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [7, 5, 8], + "to": [10, 8, 11], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [7, 2, 8], + "to": [10, 3, 11], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "medium", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3] + }, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/flammalix_potted.json b/src/main/resources/assets/betterend/models/block/flammalix_potted.json new file mode 100644 index 00000000..a0dbdec6 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flammalix_potted.json @@ -0,0 +1,99 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "betterend:block/flammalix", + "particle": "betterend:block/flammalix" + }, + "elements": [ + { + "name": "stem_thick", + "from": [7, 0, 7], + "to": [9, 2, 9], + "faces": { + "north": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [7, 6, 9, 8], "texture": "#0"}, + "south": {"uv": [6, 6, 8, 8], "texture": "#0"}, + "west": {"uv": [7, 6, 9, 8], "texture": "#0"} + } + }, + { + "name": "stem_upper", + "from": [7.5, 2, 7.5], + "to": [8.5, 5, 8.5], + "faces": { + "north": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "east": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "south": {"uv": [14, 4, 15, 7], "texture": "#0"}, + "west": {"uv": [14, 4, 15, 7], "texture": "#0"} + } + }, + { + "name": "cap_outside", + "from": [5.5, 3, 5.5], + "to": [10.5, 7, 10.5], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "cap_inside", + "from": [10.5, 3, 5.5], + "to": [5.5, 7, 10.5], + "shade": false, + "faces": { + "north": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "down": {"uv": [0, 5, 5, 10], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [6.5, 5, 6.5], + "to": [9.5, 8, 9.5], + "shade": false, + "faces": { + "north": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [13, 0, 16, 3], "texture": "#0"}, + "up": {"uv": [1, 6, 4, 9], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + }, + { + "name": "bulb", + "from": [6.5, 2, 6.5], + "to": [9.5, 3, 9.5], + "shade": false, + "faces": { + "north": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "south": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 4, 4, 5], "texture": "#0"}, + "down": {"uv": [1, 6, 4, 9], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "medium", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, + { + "name": "cap", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3] + }, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/fracturn_potted.json b/src/main/resources/assets/betterend/models/block/fracturn_potted.json new file mode 100644 index 00000000..a0e565f8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/fracturn_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/fracturn_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/globulagus_potted.json b/src/main/resources/assets/betterend/models/block/globulagus_potted.json new file mode 100644 index 00000000..c028d9af --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/globulagus_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/globulagus_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/inflexia_potted.json b/src/main/resources/assets/betterend/models/block/inflexia_potted.json new file mode 100644 index 00000000..aa15c800 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/inflexia_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/inflexia_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/jungle_grass_potted.json b/src/main/resources/assets/betterend/models/block/jungle_grass_potted.json new file mode 100644 index 00000000..ad6ab68f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/jungle_grass_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/jungle_grass_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lamellarium_potted.json b/src/main/resources/assets/betterend/models/block/lamellarium_potted.json new file mode 100644 index 00000000..745763a0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lamellarium_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/lamellarium_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json new file mode 100644 index 00000000..747e639b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 16, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json new file mode 100644 index 00000000..651265cd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 2, 13, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#base" }, + "north": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "south": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "west": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "east": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" } + } + }, + { + "__comment": "top", + "from": [ 1, 14, 1 ], + "to": [ 15, 16, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#base", "cullface": "up" }, + "north": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "south": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "west": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "east": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json new file mode 100644 index 00000000..3a88e975 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 2, 13, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#base" }, + "north": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "south": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "west": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "east": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" } + } + }, + { + "__comment": "top", + "from": [ 1, 14, 1 ], + "to": [ 15, 16, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#base", "cullface": "up" }, + "north": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "south": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "west": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "east": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json new file mode 100644 index 00000000..b4dfd5e7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 12, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 1, 12, 1 ], + "to": [ 15, 14, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "south": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "west": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "east": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json new file mode 100644 index 00000000..797d66ce --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#pillar" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 16, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json new file mode 100644 index 00000000..5886f233 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 8, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 1, 8, 1 ], + "to": [ 15, 10, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "south": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "west": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "east": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs.json b/src/main/resources/assets/betterend/models/block/lit_stairs.json new file mode 100644 index 00000000..45326109 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs.json @@ -0,0 +1,50 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "display": { + "gui": { + "rotation": [ 30, 135, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "head": { + "rotation": [ 0, -90, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, -135, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + } + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json b/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json new file mode 100644 index 00000000..d9ee9b90 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json @@ -0,0 +1,44 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 8, 8 ], + "to": [ 8, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 8, 8, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "west" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json b/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json new file mode 100644 index 00000000..13725a18 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json @@ -0,0 +1,33 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 8 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 8, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_post.json b/src/main/resources/assets/betterend/models/block/lit_wall_post.json new file mode 100644 index 00000000..48859b0c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_post.json @@ -0,0 +1,21 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall", "cullface": "up" }, + "north": { "texture": "#wall" }, + "south": { "texture": "#wall" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + }, + "__comment": "Center post" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_side.json b/src/main/resources/assets/betterend/models/block/lit_wall_side.json new file mode 100644 index 00000000..27d8698c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_side.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 5, 0, 0 ], + "to": [ 11, 14, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall" }, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + }, + "__comment": "wall" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json new file mode 100644 index 00000000..ee0dfab1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 5, 0, 0 ], + "to": [ 11, 16, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall", "cullface": "up"}, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/murkweed_potted.json b/src/main/resources/assets/betterend/models/block/murkweed_potted.json new file mode 100644 index 00000000..07ec3599 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/murkweed_potted.json @@ -0,0 +1,163 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/murkweed", + "texture": "betterend:block/murkweed" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 5, 11, 3 ], + "to": [ 9, 15, 7 ], + "faces": { + "down": { "uv": [ 4, 12, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 4, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 6, 15, 4 ], + "to": [ 8, 15.5, 6 ], + "faces": { + "north": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "south": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "west": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "east": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5.5, 15.5, 3.5 ], + "to": [ 8.5, 16, 6.5 ], + "faces": { + "down": { "uv": [ 0, 4, 3, 7 ], "texture": "#texture" }, + "up": { "uv": [ 0, 4, 3, 7 ], "texture": "#texture" }, + "north": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "south": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "west": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "east": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 5, 0, 2.5 ], + "to": [ 5.001, 11, 8.5 ], + "rotation": { "origin": [ 5, 0, 2.5 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 0, 16, 16 ], "texture": "#texture" }, + "east": { "uv": [ 10, 0, 16, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 9, 0, 2.5 ], + "to": [ 9.000999, 11, 8.5 ], + "rotation": { "origin": [ 9, 0, 2.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 0, 16, 12 ], "texture": "#texture" }, + "east": { "uv": [ 10, 0, 16, 12 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 9, 0, 6.5 ], + "to": [ 9.000999, 9, 12.5 ], + "rotation": { "origin": [ 9, 0, 6.5 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 4, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 10, 4, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 13, 0, 6.5 ], + "to": [ 13.001, 9, 12.5 ], + "rotation": { "origin": [ 13, 0, 6.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 4, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 10, 4, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 4.5, 0, 7.5 ], + "to": [ 4.501, 5, 13.5 ], + "rotation": { "origin": [ 4.5, 0, 7.5 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 8, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 10, 8, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "PlaneX4", + "from": [ 8.5, 0, 7.5 ], + "to": [ 8.500999, 5, 13.5 ], + "rotation": { "origin": [ 8.5, 0, 7.5 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 10, 8, 16, 13 ], "texture": "#texture" }, + "east": { "uv": [ 10, 8, 16, 13 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9, 9, 7 ], + "to": [ 13, 13, 11 ], + "faces": { + "down": { "uv": [ 4, 12, 8, 16 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 4, 12 ], "texture": "#texture" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 10, 13, 9 ], + "to": [ 12, 13.5, 11 ], + "faces": { + "north": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "south": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "west": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" }, + "east": { "uv": [ 1, 7.5, 3, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 9.5, 13.5, 7.5 ], + "to": [ 12.5, 14, 10.5 ], + "faces": { + "down": { "uv": [ 0, 4, 3, 7 ], "texture": "#texture" }, + "up": { "uv": [ 0, 4, 3, 7 ], "texture": "#texture" }, + "north": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "south": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "west": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" }, + "east": { "uv": [ 0, 6.5, 3, 7 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 5, 8 ], + "to": [ 8, 9, 11 ], + "faces": { + "down": { "uv": [ 4, 12, 7, 15 ], "texture": "#texture" }, + "up": { "uv": [ 0, 8, 3, 11 ], "texture": "#texture" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_potted.json b/src/main/resources/assets/betterend/models/block/neon_cactus_potted.json new file mode 100644 index 00000000..b194651f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_potted.json @@ -0,0 +1,45 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/neon_cactus_small_side", + "side": "betterend:block/neon_cactus_small_side_moss", + "top": "betterend:block/neon_cactus_small_top" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 6, 0, 6 ], + "to": [ 10, 8, 10 ], + "shade": false, + "faces": { + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#top" }, + "north": { "uv": [ 7, 6, 11, 14 ], "texture": "#side" }, + "south": { "uv": [ 7, 6, 11, 14 ], "texture": "#side" }, + "west": { "uv": [ 5, 6, 9, 14 ], "texture": "#side" }, + "east": { "uv": [ 5, 6, 9, 14 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 4, 0, 4 ], + "to": [ 4.001, 8, 15.5 ], + "rotation": { "origin": [ 4, 0, 4 ], "axis": "y", "angle": 45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "__comment": "PlaneX2", + "from": [ 12, 0, 4 ], + "to": [ 12.001, 8, 15.5 ], + "rotation": { "origin": [ 12, 0, 4 ], "axis": "y", "angle": -45 }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json index 22fb196b..ccd83a76 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json @@ -1,5 +1,5 @@ { - "parent": "block/slab", + "parent": "betterend:block/slab_noshade", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json index 0a0df2b2..bae5dffd 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/stairs", + "parent": "betterend:block/lit_stairs", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json index 78d80cc5..2eecc8e2 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/inner_stairs", + "parent": "betterend:block/lit_stairs_inner", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json index 01f12961..ead881f0 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/outer_stairs", + "parent": "betterend:block/lit_stairs_outer", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/pillar_noshade.json b/src/main/resources/assets/betterend/models/block/pillar_noshade.json new file mode 100644 index 00000000..cf1bd8de --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pillar_noshade.json @@ -0,0 +1,21 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/shadow_plant_potted.json b/src/main/resources/assets/betterend/models/block/shadow_plant_potted.json new file mode 100644 index 00000000..747d552e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/shadow_plant_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/shadow_plant_potted" + } +} diff --git a/src/main/resources/assets/betterend/models/block/slab_noshade.json b/src/main/resources/assets/betterend/models/block/slab_noshade.json new file mode 100644 index 00000000..e629ba9e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/slab_noshade.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json new file mode 100644 index 00000000..6200b8c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json new file mode 100644 index 00000000..f0ac1df0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_inner", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json new file mode 100644 index 00000000..ed02dfcd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_outer", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json new file mode 100644 index 00000000..e74131d0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_post", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json new file mode 100644 index 00000000..ad9b2c94 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_side", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json new file mode 100644 index 00000000..c49dacb0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_side_tall", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json new file mode 100644 index 00000000..c5e167df --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json @@ -0,0 +1,23 @@ +{ + "parent": "block/block", + "textures": { + "side": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#side" + }, + "elements": [ + { + "from": [ 4, -0.01, 4 ], + "to": [ 12, 16, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json new file mode 100644 index 00000000..4bba9abf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json @@ -0,0 +1,21 @@ +{ + "textures": { + "wall": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#wall" + }, + "elements": [ + { + "from": [ 5, 0, 0 ], + "to": [ 11, 14, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json new file mode 100644 index 00000000..dac2fa44 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json @@ -0,0 +1,21 @@ +{ + "textures": { + "wall": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#wall" + }, + "elements": [ + { + "from": [ 5, 0, 0 ], + "to": [ 11, 16, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top", "cullface": "up"}, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json new file mode 100644 index 00000000..d4f4423b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_bottom", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json new file mode 100644 index 00000000..aba32bf3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_column", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json new file mode 100644 index 00000000..2f8a7add --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json @@ -0,0 +1,7 @@ +{ + "parent": "betterend:block/lit_pedestal_column_top", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json new file mode 100644 index 00000000..07e36ccc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json @@ -0,0 +1,9 @@ +{ + "parent": "betterend:block/lit_pedestal_default", + "textures": { + "top": "betterend:block/smaragdant_crystal_polished", + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json new file mode 100644 index 00000000..2041fe88 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_pedestal_pillar", + "textures": { + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json new file mode 100644 index 00000000..7f586614 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_top", + "textures": { + "top": "betterend:block/smaragdant_crystal_polished", + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_slab.json b/src/main/resources/assets/betterend/models/block/smaragdant_slab.json new file mode 100644 index 00000000..19f5cca8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/slab_noshade", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json new file mode 100644 index 00000000..288366da --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json new file mode 100644 index 00000000..2339f001 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_inner", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json new file mode 100644 index 00000000..380d63db --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_outer", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_1.json b/src/main/resources/assets/betterend/models/block/umbralith_1.json new file mode 100644 index 00000000..8db9f234 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_2.json b/src/main/resources/assets/betterend/models/block/umbralith_2.json new file mode 100644 index 00000000..61f6c8a9 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_3.json b/src/main/resources/assets/betterend/models/block/umbralith_3.json new file mode 100644 index 00000000..d6992e52 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_4.json b/src/main/resources/assets/betterend/models/block/umbralith_4.json new file mode 100644 index 00000000..ff896e16 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_5.json b/src/main/resources/assets/betterend/models/block/umbralith_5.json new file mode 100644 index 00000000..c9136b9b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_6.json b/src/main/resources/assets/betterend/models/block/umbralith_6.json new file mode 100644 index 00000000..63ce05b1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_6" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbralith_7.json b/src/main/resources/assets/betterend/models/block/umbralith_7.json new file mode 100644 index 00000000..b1b81960 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbralith_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbralith_7" + } +} diff --git a/src/main/resources/assets/betterend/models/block/vaiolush_fern_potted.json b/src/main/resources/assets/betterend/models/block/vaiolush_fern_potted.json new file mode 100644 index 00000000..5a915f54 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/vaiolush_fern_potted.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "betterend:block/vaiolush_fern_potted" + } +} diff --git a/src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json b/src/main/resources/assets/betterend/models/item/custom_chorus_flower.json similarity index 94% rename from src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json rename to src/main/resources/assets/betterend/models/item/custom_chorus_flower.json index c26d27c1..30047d60 100644 --- a/src/main/resources/assets/minecraft/models/item/custom_chorus_flower.json +++ b/src/main/resources/assets/betterend/models/item/custom_chorus_flower.json @@ -1,3 +1,3 @@ -{ - "parent": "betterend:block/chorus_plant_flower" -} +{ + "parent": "betterend:block/chorus_plant_flower" +} diff --git a/src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json b/src/main/resources/assets/betterend/models/item/custom_chorus_plant.json similarity index 94% rename from src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json rename to src/main/resources/assets/betterend/models/item/custom_chorus_plant.json index 70794d60..96bfea4d 100644 --- a/src/main/resources/assets/minecraft/models/item/custom_chorus_plant.json +++ b/src/main/resources/assets/betterend/models/item/custom_chorus_plant.json @@ -1,3 +1,3 @@ -{ - "parent": "betterend:block/chorus_plant_center" -} +{ + "parent": "betterend:block/chorus_plant_center" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..92b2603b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_bricks_stairs" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..b89dc3ef --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..ca50eb45 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_pedestal_default" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json new file mode 100644 index 00000000..1099667b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_slab" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..7af759c0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_stairs" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json new file mode 100644 index 00000000..4391b325 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/patterns/block/flower_pot.json b/src/main/resources/assets/betterend/patterns/block/flower_pot.json new file mode 100644 index 00000000..55088bf3 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/flower_pot.json @@ -0,0 +1,71 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "parent": "block/block", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 4, 7, 4 ], + "to": [ 12, 8, 12 ], + "faces": { + "down": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 0, 0, 8, 1 ], "texture": "#texture" }, + "south": { "uv": [ 0, 0, 8, 1 ], "texture": "#texture" }, + "west": { "uv": [ 0, 0, 8, 1 ], "texture": "#texture" }, + "east": { "uv": [ 0, 0, 8, 1 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 5, 0, 5 ], + "to": [ 11, 1, 11 ], + "faces": { + "down": { "uv": [ 9, 9, 15, 15 ], "texture": "#texture", "cullface": "down" }, + "up": { "uv": [ 9, 9, 15, 15 ], "texture": "#texture" }, + "north": { "uv": [ 1, 7, 7, 8 ], "texture": "#texture" }, + "south": { "uv": [ 1, 7, 7, 8 ], "texture": "#texture" }, + "west": { "uv": [ 1, 7, 7, 8 ], "texture": "#texture" }, + "east": { "uv": [ 1, 7, 7, 8 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4, 1, 4 ], + "to": [ 12, 6, 12 ], + "faces": { + "down": { "uv": [ 8, 8, 16, 16 ], "texture": "#texture" }, + "up": { "uv": [ 8, 0, 16, 8 ], "texture": "#texture" }, + "north": { "uv": [ 0, 2, 8, 7 ], "texture": "#texture" }, + "south": { "uv": [ 0, 2, 8, 7 ], "texture": "#texture" }, + "west": { "uv": [ 0, 2, 8, 7 ], "texture": "#texture" }, + "east": { "uv": [ 0, 2, 8, 7 ], "texture": "#texture" } + } + }, + { + "__comment": "Box1", + "from": [ 4.5, 6, 4.5 ], + "to": [ 11.5, 7, 11.5 ], + "faces": { + "north": { "uv": [ 0.5, 1, 7.5, 2 ], "texture": "#texture" }, + "south": { "uv": [ 0.5, 1, 7.5, 2 ], "texture": "#texture" }, + "west": { "uv": [ 0.5, 1, 7.5, 2 ], "texture": "#texture" }, + "east": { "uv": [ 0.5, 1, 7.5, 2 ], "texture": "#texture" } + } + }, + { + "__comment": "Box14", + "from": [ 11, 8, 11 ], + "to": [ 5, 1, 5 ], + "faces": { + "north": { "uv": [ 1, 0, 7, 7 ], "texture": "#texture" }, + "south": { "uv": [ 1, 0, 7, 7 ], "texture": "#texture" }, + "west": { "uv": [ 1, 0, 7, 7 ], "texture": "#texture" }, + "east": { "uv": [ 1, 0, 7, 7 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/flower_pot_soil.json b/src/main/resources/assets/betterend/patterns/block/flower_pot_soil.json new file mode 100644 index 00000000..224858f1 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/flower_pot_soil.json @@ -0,0 +1,17 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%texture%", + "texture": "betterend:block/%texture%" + }, + "elements": [ + { + "__comment": "PlaneY1", + "from": [ 5, 7.5, 5 ], + "to": [ 11, 7.501, 11 ], + "faces": { + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#texture" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/potted_leaves.json b/src/main/resources/assets/betterend/patterns/block/potted_leaves.json new file mode 100644 index 00000000..8e2446f5 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/potted_leaves.json @@ -0,0 +1,35 @@ +{ + "__comment": "Designed by Paulevs with Cubik Studio - https://cubik.studio", + "textures": { + "particle": "betterend:block/%leaves%", + "stem": "betterend:block/%stem%", + "leaves": "betterend:block/%leaves%" + }, + "elements": [ + { + "__comment": "Box1", + "from": [ 3, 2, 3 ], + "to": [ 13, 12, 13 ], + "faces": { + "down": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" }, + "up": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" }, + "north": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" }, + "south": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" }, + "west": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" }, + "east": { "uv": [ 3, 3, 13, 13 ], "texture": "#leaves" } + } + }, + { + "__comment": "Box1", + "from": [ 7, 0, 7 ], + "to": [ 9, 8, 9 ], + "faces": { + "up": { "uv": [ 7, 7, 9, 9 ], "texture": "#stem" }, + "north": { "uv": [ 7, 8, 9, 16 ], "texture": "#stem" }, + "south": { "uv": [ 7, 8, 9, 16 ], "texture": "#stem" }, + "west": { "uv": [ 7, 8, 9, 16 ], "texture": "#stem" }, + "east": { "uv": [ 7, 8, 9, 16 ], "texture": "#stem" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index f0abe0dd..d44fd81c 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -219,6 +219,24 @@ } ] }, + "betterend.ambient.amber_land": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/amber_land", + "stream": true + } + ] + }, + "betterend.ambient.umbra_valley": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/umbra_valley", + "stream": true + } + ] + }, "betterend.entity.dragonfly": { "category": "entity", diff --git a/src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg b/src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg new file mode 100644 index 00000000..6b830cdb Binary files /dev/null and b/src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg differ diff --git a/src/main/resources/assets/betterend/sounds/ambient/umbra_valley.ogg b/src/main/resources/assets/betterend/sounds/ambient/umbra_valley.ogg new file mode 100644 index 00000000..24c47c41 Binary files /dev/null and b/src/main/resources/assets/betterend/sounds/ambient/umbra_valley.ogg differ diff --git a/src/main/resources/assets/betterend/textures/block/aeridium.png b/src/main/resources/assets/betterend/textures/block/aeridium.png index ad97e778..17a33d94 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeridium.png and b/src/main/resources/assets/betterend/textures/block/aeridium.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeridium_e.png b/src/main/resources/assets/betterend/textures/block/aeridium_e.png index e3a7da6f..58437781 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeridium_e.png and b/src/main/resources/assets/betterend/textures/block/aeridium_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png index 42d59708..bb067de0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_back.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png index fbf5143b..be7e6940 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png index 9b2d22b6..7f6d0bed 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png index afdcd731..23e3472f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png index b206f373..51f7a0c9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png index 84380c58..a8f3fbfb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png index 3e8e4f66..c350e957 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png and b/src/main/resources/assets/betterend/textures/block/aeternium_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aeternium_block.png b/src/main/resources/assets/betterend/textures/block/aeternium_block.png index eae91fe3..f1bcfd01 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aeternium_block.png and b/src/main/resources/assets/betterend/textures/block/aeternium_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_cap.png b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png index 6b7fddd1..401157b9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_cap.png and b/src/main/resources/assets/betterend/textures/block/amaranita_cap.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png index e735e76d..ba1cf0c8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_fur.png and b/src/main/resources/assets/betterend/textures/block/amaranita_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png index c25e3b08..790e74bb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png and b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png index 8148cff5..8401e5da 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png and b/src/main/resources/assets/betterend/textures/block/amaranita_hymenophore_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png index 2f4f4f63..a79e668f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png and b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png index e236e4d2..d6aa0e08 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png and b/src/main/resources/assets/betterend/textures/block/amaranita_hyphae_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png b/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png index dc669adb..bcaa73c2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png and b/src/main/resources/assets/betterend/textures/block/amaranita_lantern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png index 69ad1cad..af2df081 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png index f7317e51..2325249d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png index cb26d739..f4499f4e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png and b/src/main/resources/assets/betterend/textures/block/amaranita_stem_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_block.png b/src/main/resources/assets/betterend/textures/block/amber_block.png index 37c7e6e8..09bff026 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_block.png and b/src/main/resources/assets/betterend/textures/block/amber_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_grass.png b/src/main/resources/assets/betterend/textures/block/amber_grass.png index c78817cf..ce185a31 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_grass.png and b/src/main/resources/assets/betterend/textures/block/amber_grass.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_grass_potted.png b/src/main/resources/assets/betterend/textures/block/amber_grass_potted.png new file mode 100644 index 00000000..ca6b4005 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_grass_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/amber_moss_path_top.png index 740ed96e..737dd634 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_moss_path_top.png and b/src/main/resources/assets/betterend/textures/block/amber_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_side_1.png b/src/main/resources/assets/betterend/textures/block/amber_moss_side_1.png index cbf62819..08fa045b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_moss_side_1.png and b/src/main/resources/assets/betterend/textures/block/amber_moss_side_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_side_2.png b/src/main/resources/assets/betterend/textures/block/amber_moss_side_2.png index 6d7b516a..4dd69984 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_moss_side_2.png and b/src/main/resources/assets/betterend/textures/block/amber_moss_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_moss_side_3.png b/src/main/resources/assets/betterend/textures/block/amber_moss_side_3.png index e59c23ce..4647e293 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_moss_side_3.png and b/src/main/resources/assets/betterend/textures/block/amber_moss_side_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_ore.png b/src/main/resources/assets/betterend/textures/block/amber_ore.png index 01f7bac4..9a350f66 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_ore.png and b/src/main/resources/assets/betterend/textures/block/amber_ore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_0.png b/src/main/resources/assets/betterend/textures/block/amber_root_0.png index bccbce93..c86a64ce 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_root_0.png and b/src/main/resources/assets/betterend/textures/block/amber_root_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_1.png b/src/main/resources/assets/betterend/textures/block/amber_root_1.png index 7ca89b63..78e4bcbb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_root_1.png and b/src/main/resources/assets/betterend/textures/block/amber_root_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_2.png b/src/main/resources/assets/betterend/textures/block/amber_root_2.png index 1a05d5f9..e7994694 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_root_2.png and b/src/main/resources/assets/betterend/textures/block/amber_root_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_3.png b/src/main/resources/assets/betterend/textures/block/amber_root_3.png index e9e6b445..979afbeb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/amber_root_3.png and b/src/main/resources/assets/betterend/textures/block/amber_root_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/amber_root_potted.png b/src/main/resources/assets/betterend/textures/block/amber_root_potted.png new file mode 100644 index 00000000..e20493d5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/amber_root_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/andesite_lantern_side.png b/src/main/resources/assets/betterend/textures/block/andesite_lantern_side.png index 4dc49ecd..408ad8d5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/andesite_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/andesite_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore.png index f3f94190..373b084e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aurant_polypore.png and b/src/main/resources/assets/betterend/textures/block/aurant_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png b/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png index 7d19a8a3..f5182e60 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png and b/src/main/resources/assets/betterend/textures/block/aurant_polypore_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/aurora_crystal.png b/src/main/resources/assets/betterend/textures/block/aurora_crystal.png index 58a4de41..0f71be6d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/aurora_crystal.png and b/src/main/resources/assets/betterend/textures/block/aurora_crystal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png index b77aa314..2515a024 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_flower_pot.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_flower_pot.png new file mode 100644 index 00000000..12390578 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png index 85243b6b..d350e5f0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png index 8be6d6db..a88e392c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png index d6f4c239..ca8c1602 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png index 097f9402..509a9ba0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png index 690edaf9..e5669e06 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png index 4e406618..eebdce48 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png index 68aec9bd..9e235895 100644 Binary files a/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/azure_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_bottom.png index 6756c1dd..73dbb03b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_side.png index 8bde80b8..91bacf11 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_top.png index f7d5f2b0..3b09e50c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blackstone_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/blackstone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png index 4cc6d5d8..c6f628bc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png index dbb75d68..2fdb0256 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted.png new file mode 100644 index 00000000..ae614749 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted_e.png b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted_e.png new file mode 100644 index 00000000..440aabfc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/blooming_cooksonia_potted_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png index ba9f2ee4..ce408433 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png and b/src/main/resources/assets/betterend/textures/block/blossom_berry_flower.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png index fe5bdee0..5080dd5e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png and b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png index 6b4242aa..7a7d2992 100644 Binary files a/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png and b/src/main/resources/assets/betterend/textures/block/blossom_berry_seed_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png index 8b869fa1..d259982e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png and b/src/main/resources/assets/betterend/textures/block/bolux_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png b/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png index d90e929b..0bcf6f3f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png and b/src/main/resources/assets/betterend/textures/block/bolux_mushroom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs.png b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs.png index 185bb491..68ccceb3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs.png and b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png index 55896402..4106a750 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_moss_bulbs_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_moss_leaves.png b/src/main/resources/assets/betterend/textures/block/bulb_moss_leaves.png index 9881ee0a..5465b27a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_moss_leaves.png and b/src/main/resources/assets/betterend/textures/block/bulb_moss_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine.png b/src/main/resources/assets/betterend/textures/block/bulb_vine.png index 33fbcd10..a9ab55f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_fur.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_fur.png index 3c39a774..90c1c075 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_fur.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png index ea2f464a..e1d3a8db 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png index ea2f464a..e1d3a8db 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_bulb_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay.png index 8a3c1a3a..2ffa45a8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png index 8a3c1a3a..2ffa45a8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_lantern_overlay_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_middle.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_middle.png index 23c43ab4..e5ce1b7c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_middle.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0.png index 08e67c4d..87662ff5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1.png index a008b8ca..033e22e5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png index 6430c866..c3848630 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2.png index 3c46d166..0dc3c7cb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png index 511e9552..7c8ab9c3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3.png index 91beb0f1..5a15491f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png index 651708a1..41213791 100644 Binary files a/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png and b/src/main/resources/assets/betterend/textures/block/bulb_vine_seed_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/bushy_grass_potted.png b/src/main/resources/assets/betterend/textures/block/bushy_grass_potted.png new file mode 100644 index 00000000..0cd78fc1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/bushy_grass_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png index 0270aade..e8147836 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png index 232ab77d..a79a3fbf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png index e2ebfeaa..b331f988 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png index 2261d204..f1f6b543 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png index f61e82a1..154913a3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png index 99bb6a69..12fe93d9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png index 5cd9b25f..2b0e9247 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png and b/src/main/resources/assets/betterend/textures/block/cave_bush_leaves_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_1.png b/src/main/resources/assets/betterend/textures/block/cave_grass_1.png index fba927d7..c0356dec 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_grass_1.png and b/src/main/resources/assets/betterend/textures/block/cave_grass_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png index dde241fe..2ad3bca5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_grass_2.png and b/src/main/resources/assets/betterend/textures/block/cave_grass_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_grass_potted.png b/src/main/resources/assets/betterend/textures/block/cave_grass_potted.png new file mode 100644 index 00000000..bf379c2a Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/cave_grass_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_side.png b/src/main/resources/assets/betterend/textures/block/cave_moss_side.png index 97aabc14..48c59b5e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_moss_side.png and b/src/main/resources/assets/betterend/textures/block/cave_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png index 14eb1bae..7ae0ef4c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_moss_top.png and b/src/main/resources/assets/betterend/textures/block/cave_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png index 6c35ab7d..06a23b5a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png index 96e2e1f4..db30aa24 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png index 1a75960f..b46d2e62 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png index 01b6a719..9e761742 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png index 71f6391c..c3b72b15 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png index 7944679b..57abbd90 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png index 9b3607bd..c66cace9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_stem_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png index 821029c3..859f30be 100644 Binary files a/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png and b/src/main/resources/assets/betterend/textures/block/cave_pumpkin_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charcoal_block.png b/src/main/resources/assets/betterend/textures/block/charcoal_block.png index 8b3696b5..43ad3c8f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charcoal_block.png and b/src/main/resources/assets/betterend/textures/block/charcoal_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_cyan.png b/src/main/resources/assets/betterend/textures/block/charnia_cyan.png index d038d3b3..cc93ab69 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_cyan.png and b/src/main/resources/assets/betterend/textures/block/charnia_cyan.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_green.png b/src/main/resources/assets/betterend/textures/block/charnia_green.png index 44851676..1443c1bd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_green.png and b/src/main/resources/assets/betterend/textures/block/charnia_green.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_light_blue.png b/src/main/resources/assets/betterend/textures/block/charnia_light_blue.png index 1c68449b..c5754706 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_light_blue.png and b/src/main/resources/assets/betterend/textures/block/charnia_light_blue.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_orange.png b/src/main/resources/assets/betterend/textures/block/charnia_orange.png index db9ad3c2..35256a3c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_orange.png and b/src/main/resources/assets/betterend/textures/block/charnia_orange.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_purple.png b/src/main/resources/assets/betterend/textures/block/charnia_purple.png index f9901429..7e607ad1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_purple.png and b/src/main/resources/assets/betterend/textures/block/charnia_purple.png differ diff --git a/src/main/resources/assets/betterend/textures/block/charnia_red.png b/src/main/resources/assets/betterend/textures/block/charnia_red.png index eff3dcbe..152a3290 100644 Binary files a/src/main/resources/assets/betterend/textures/block/charnia_red.png and b/src/main/resources/assets/betterend/textures/block/charnia_red.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_grass_potted.png b/src/main/resources/assets/betterend/textures/block/chorus_grass_potted.png new file mode 100644 index 00000000..7c51f013 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_grass_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png index 8162484c..6d58e8fd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png index dcd8ddd9..609accf4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png index 5cfacd08..15ca654e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_mushroom_potted.png b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_potted.png new file mode 100644 index 00000000..1e7559cd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/chorus_mushroom_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png index dc0ea52d..6691aa7f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png and b/src/main/resources/assets/betterend/textures/block/chorus_nylium_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png index 5e41736f..4c256a8a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png and b/src/main/resources/assets/betterend/textures/block/chorus_nylium_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_nylium_top.png b/src/main/resources/assets/betterend/textures/block/chorus_nylium_top.png index 46a6bded..27a59ac5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_nylium_top.png and b/src/main/resources/assets/betterend/textures/block/chorus_nylium_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant.png b/src/main/resources/assets/betterend/textures/block/chorus_plant.png index 828b15af..2cb4a85f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_plant.png and b/src/main/resources/assets/betterend/textures/block/chorus_plant.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant_2.png b/src/main/resources/assets/betterend/textures/block/chorus_plant_2.png index 0858a3b9..d80ab0ef 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_plant_2.png and b/src/main/resources/assets/betterend/textures/block/chorus_plant_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_bottom.png b/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_bottom.png index 0211bbac..f3fd4918 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_bottom.png and b/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_top.png b/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_top.png index 4ecfbb72..dcc38ba9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_top.png and b/src/main/resources/assets/betterend/textures/block/chorus_plant_flower_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/clawfern.png b/src/main/resources/assets/betterend/textures/block/clawfern.png index 80214371..955c0fcd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/clawfern.png and b/src/main/resources/assets/betterend/textures/block/clawfern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/clawfern_potted.png b/src/main/resources/assets/betterend/textures/block/clawfern_potted.png new file mode 100644 index 00000000..6ea0d05f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/clawfern_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/creeping_moss_spores.png b/src/main/resources/assets/betterend/textures/block/creeping_moss_spores.png index 02967e53..6b23f698 100644 Binary files a/src/main/resources/assets/betterend/textures/block/creeping_moss_spores.png and b/src/main/resources/assets/betterend/textures/block/creeping_moss_spores.png differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_grass_2.png b/src/main/resources/assets/betterend/textures/block/crystal_grass_2.png index 57d33eef..7d4ef32f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_grass_2.png and b/src/main/resources/assets/betterend/textures/block/crystal_grass_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_grass_4.png b/src/main/resources/assets/betterend/textures/block/crystal_grass_4.png index 517d3b0b..0cbffbba 100644 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_grass_4.png and b/src/main/resources/assets/betterend/textures/block/crystal_grass_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/crystal_grass_5.png b/src/main/resources/assets/betterend/textures/block/crystal_grass_5.png index 0cebf007..f6b71d47 100644 Binary files a/src/main/resources/assets/betterend/textures/block/crystal_grass_5.png and b/src/main/resources/assets/betterend/textures/block/crystal_grass_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dense_emerald_ice.png b/src/main/resources/assets/betterend/textures/block/dense_emerald_ice.png index e15cbaa2..c009cb67 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dense_emerald_ice.png and b/src/main/resources/assets/betterend/textures/block/dense_emerald_ice.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dense_snow.png b/src/main/resources/assets/betterend/textures/block/dense_snow.png index efbdb369..e6bd8330 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dense_snow.png and b/src/main/resources/assets/betterend/textures/block/dense_snow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dense_vine.png b/src/main/resources/assets/betterend/textures/block/dense_vine.png index afab6cad..045cbdb0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dense_vine.png and b/src/main/resources/assets/betterend/textures/block/dense_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dense_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/dense_vine_bottom.png index 26e92dc2..d5ccb1f2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dense_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/dense_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png index f238dda9..fc46f1a3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png index 564ba177..c7eb460e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png index 3b204813..ba4fbf13 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png and b/src/main/resources/assets/betterend/textures/block/dragon_bone_block_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_barrel_top_open.png index 4b84f3a8..cd92a98e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png index 3100943b..1130d672 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_bottom.png index e19cae90..77ed1c14 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_side.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_side.png index 7096c72d..d3ee8ce4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_side.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_top.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_top.png index dd049d0c..2b261f0b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_top.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_front.png index e4b0ca73..59202dd9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_side.png index 25f4f4ca..eca07d98 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_top.png index 7ad56b30..1883b2f5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_leaves.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_leaves.png index 05fbb1ac..ae764ead 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_leaves.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_2.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_2.png index c7fb2be0..b5e76c6d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_2.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_3.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_3.png index 5a70c312..52836190 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_3.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_4.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_4.png index 3e25118c..bb932882 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_4.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_side_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_top.png index 93f7fbfc..e17490a4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_log_top.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_planks.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_planks.png index 8a9ed37c..6f11a40c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_planks.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_sapling.png index 601ca187..45e14a8f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_sapling.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_side.png index f13d8e70..3dc84c13 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_top.png index 2d35fefa..27808db6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/dragon_tree_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/emerald_ice.png b/src/main/resources/assets/betterend/textures/block/emerald_ice.png index 67b46600..1b75cb9e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/emerald_ice.png and b/src/main/resources/assets/betterend/textures/block/emerald_ice.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_leaf.png b/src/main/resources/assets/betterend/textures/block/end_lily_leaf.png index 7c13c283..742a04cb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lily_leaf.png and b/src/main/resources/assets/betterend/textures/block/end_lily_leaf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_leaf_dried.png b/src/main/resources/assets/betterend/textures/block/end_lily_leaf_dried.png index eb671ff2..6cc1df65 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lily_leaf_dried.png and b/src/main/resources/assets/betterend/textures/block/end_lily_leaf_dried.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_leaf_small.png b/src/main/resources/assets/betterend/textures/block/end_lily_leaf_small.png index 160df978..50af136c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lily_leaf_small.png and b/src/main/resources/assets/betterend/textures/block/end_lily_leaf_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_roots.png b/src/main/resources/assets/betterend/textures/block/end_lily_roots.png index aeb08eec..23e8d674 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lily_roots.png and b/src/main/resources/assets/betterend/textures/block/end_lily_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lily_stem.png b/src/main/resources/assets/betterend/textures/block/end_lily_stem.png index 58581159..eceaaae5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lily_stem.png and b/src/main/resources/assets/betterend/textures/block/end_lily_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_4.png b/src/main/resources/assets/betterend/textures/block/end_lotus_4.png index 578a3f03..557dc1bf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_4.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_bottom.png index 42b733e5..fc94bdab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_bottom.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top.png index 44a75f2f..55e02cb1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top_open.png index cbd97421..b4fa284f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center.png index dd388ff8..a7c54ebb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_center.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_center.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2.png index 2254a18a..cdfd4fbe 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png index 0bb66e45..a5e492bc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_center_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png index f8c7e2e8..dfb1638a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_center_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_bottom.png index b720c226..45f7751b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_side.png b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_side.png index 303bf5ae..7d3a2b1b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_side.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_top.png index 315296fd..07f72aab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_composter_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_front.png index c1d3c5e4..5d191e93 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_top.png index 1a8f2759..049de61f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_door_bottom.png b/src/main/resources/assets/betterend/textures/block/end_lotus_door_bottom.png index 5cd2bb6b..50f8a411 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_door_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_door_top.png index 1e41acc0..759e5bd8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_door_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_center.png b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_center.png index d6dd184c..46e03e0c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_center.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_center.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_corner.png b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_corner.png index a8126c78..d3b33e7d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_corner.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_corner.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_cutout.png b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_cutout.png index f3f2b748..d5851cc2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_cutout.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_cutout.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_side.png b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_side.png index 70d1c67b..dd49f021 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_side.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_leaf_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_log_side.png b/src/main/resources/assets/betterend/textures/block/end_lotus_log_side.png index 461c85aa..0fe3f1f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_log_side.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal.png index 5834c996..cfbaa4cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_petal.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2.png index 7f688b67..fa5888e5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png index 7f688b67..fa5888e5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png index 5834c996..cfbaa4cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_petal_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_stem.png b/src/main/resources/assets/betterend/textures/block/end_lotus_stem.png index b3d6ae69..6204c60a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_stem.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/end_lotus_stripped_log_top.png index a9e6becf..c77ef193 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_lotus_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/end_lotus_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_side.png b/src/main/resources/assets/betterend/textures/block/end_moss_side.png index cc0449f7..b720e5f6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_moss_side.png and b/src/main/resources/assets/betterend/textures/block/end_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_moss_top.png b/src/main/resources/assets/betterend/textures/block/end_moss_top.png index de6139a4..a3ddcc5c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_moss_top.png and b/src/main/resources/assets/betterend/textures/block/end_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_portal.png b/src/main/resources/assets/betterend/textures/block/end_portal.png index 4c79d3e2..d5ccc52a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_portal.png and b/src/main/resources/assets/betterend/textures/block/end_portal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_portal_grey.png b/src/main/resources/assets/betterend/textures/block/end_portal_grey.png index c04fe031..9a90f2ed 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_portal_grey.png and b/src/main/resources/assets/betterend/textures/block/end_portal_grey.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png index 65e87503..3d219682 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png index 58dcd4a1..a04be26e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png index 58dcd4a1..a04be26e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png index 5b79a56e..31c24e68 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/end_stone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png index 1ee9ea3c..2f878d06 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png index 47c3f431..cc91fda9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png index 3abdc94f..9640c177 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png index 71f47f4f..34e3641a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png and b/src/main/resources/assets/betterend/textures/block/end_stone_smelter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png index 21690cf5..706e1ea8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png index ef790765..2d958753 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png index 03cc818c..cc57f448 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png index 06558e52..d751a5bc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png index 141e59ee..0718aba9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png index 6b3820e6..03453357 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png index 0a73d8fa..49aa5320 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png index e92f5a5a..4942f495 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png index 24de0bb9..1a2c308e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png index e025e06f..8d2dbe04 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png index 9ea8fc49..def8630d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png index 8c01d85c..6dce32ea 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png index 807efa04..645ffe49 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png index 1e387a9f..48e7c37b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png index 6484f928..b90a1dd3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png index 563537ca..5d666972 100644 Binary files a/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png and b/src/main/resources/assets/betterend/textures/block/end_stone_stalactite_cavemoss_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ender_block.png b/src/main/resources/assets/betterend/textures/block/ender_block.png index 929bdec1..be43bf85 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ender_block.png and b/src/main/resources/assets/betterend/textures/block/ender_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ender_ore.png b/src/main/resources/assets/betterend/textures/block/ender_ore.png index d2bd1136..ea514c8a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ender_ore.png and b/src/main/resources/assets/betterend/textures/block/ender_ore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/endstone_dust.png b/src/main/resources/assets/betterend/textures/block/endstone_dust.png index 6b98cde8..facaa574 100644 Binary files a/src/main/resources/assets/betterend/textures/block/endstone_dust.png and b/src/main/resources/assets/betterend/textures/block/endstone_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/endstone_flower_pot.png b/src/main/resources/assets/betterend/textures/block/endstone_flower_pot.png new file mode 100644 index 00000000..631545a8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/endstone_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png index 73f9e380..332e71a5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_bottom.png and b/src/main/resources/assets/betterend/textures/block/filalux_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png b/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png index dc94f6b6..bce11d35 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png and b/src/main/resources/assets/betterend/textures/block/filalux_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png index d217989c..ae72b082 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_lantern.png and b/src/main/resources/assets/betterend/textures/block/filalux_lantern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png b/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png index 02fe0302..8b829289 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png and b/src/main/resources/assets/betterend/textures/block/filalux_lantern_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_middle.png b/src/main/resources/assets/betterend/textures/block/filalux_middle.png index 2a7dddbb..f8daf0ff 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_middle.png and b/src/main/resources/assets/betterend/textures/block/filalux_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings.png b/src/main/resources/assets/betterend/textures/block/filalux_wings.png index 081170d4..74748177 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png index 06ba9fd1..49b7603d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_large.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png index 00f90595..6a7eeb18 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png index bc399f47..83e72da6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png index 62661b9a..8ff78904 100644 Binary files a/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png and b/src/main/resources/assets/betterend/textures/block/filalux_wings_top_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1.png b/src/main/resources/assets/betterend/textures/block/flamaea_1.png index d7fb8cef..ca8a7ece 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_1.png and b/src/main/resources/assets/betterend/textures/block/flamaea_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png index e246a96e..edf19d93 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png and b/src/main/resources/assets/betterend/textures/block/flamaea_1_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_2.png b/src/main/resources/assets/betterend/textures/block/flamaea_2.png index 0b3486f9..61a1dfe2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_2.png and b/src/main/resources/assets/betterend/textures/block/flamaea_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png index d6b109e7..0eb18392 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png and b/src/main/resources/assets/betterend/textures/block/flamaea_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_3.png b/src/main/resources/assets/betterend/textures/block/flamaea_3.png index 4404b30e..869153ee 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_3.png and b/src/main/resources/assets/betterend/textures/block/flamaea_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png index c2071744..d6b00e67 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png and b/src/main/resources/assets/betterend/textures/block/flamaea_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_4.png b/src/main/resources/assets/betterend/textures/block/flamaea_4.png index 098f1fd3..c54c97ff 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_4.png and b/src/main/resources/assets/betterend/textures/block/flamaea_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png index 46c461bf..cf48e948 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png and b/src/main/resources/assets/betterend/textures/block/flamaea_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5.png b/src/main/resources/assets/betterend/textures/block/flamaea_5.png index 52458b41..bbfeb9f1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_5.png and b/src/main/resources/assets/betterend/textures/block/flamaea_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png b/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png index 3d1d907e..b5892af4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png and b/src/main/resources/assets/betterend/textures/block/flamaea_5_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flammalix.png b/src/main/resources/assets/betterend/textures/block/flammalix.png new file mode 100644 index 00000000..2757c703 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flammalix.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flammalix_e.png b/src/main/resources/assets/betterend/textures/block/flammalix_e.png new file mode 100644 index 00000000..d93c8b0c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flammalix_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite.png b/src/main/resources/assets/betterend/textures/block/flavolite.png index 25e7f824..f259025e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite.png and b/src/main/resources/assets/betterend/textures/block/flavolite.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png b/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png index 9446fb39..39d09783 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png and b/src/main/resources/assets/betterend/textures/block/flavolite_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_flower_pot.png b/src/main/resources/assets/betterend/textures/block/flavolite_flower_pot.png new file mode 100644 index 00000000..53379ba5 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png index dfb223f4..7bd185fa 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png index 1d51de8a..cc94cf18 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png index b4c4cf32..3c6d5964 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/flavolite_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png index 51971a4c..0344cedf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png index ed2b6472..7144e90e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png index a244b4c7..476e7edf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/flavolite_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png index 28ec0820..3f2e5468 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png index 1c4024c9..0330151f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png and b/src/main/resources/assets/betterend/textures/block/flavolite_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png index 8f239b70..14c07cf6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_polished.png and b/src/main/resources/assets/betterend/textures/block/flavolite_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png index 2aed9bca..65d25895 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png index 59bc7f79..e87cbc4d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png index c3c624c5..3d141ea0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png index a6d93c16..92535d5a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png index a4b35d2f..bba189b1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png index 40bdc614..85170808 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png index b7cbe8a5..c1b4ab1f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png index 60792f55..dc9dede3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_8.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png index 849732b6..e331457f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_9.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png index bfb72505..b14bdaf5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png index ed85bea7..121e0234 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png index 1370b369..a524e70a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png index e7e499f5..1888c21c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png index 1735bdd3..026459d9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png index d945f546..9b3011ea 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png index 43650b68..3cb0c3de 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_5_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png index 32ed4e93..3ff4d6ec 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png index e8dc3118..e72392f0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_6_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png index 437974a9..09c8a20f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png index 4c12cc22..3da6fdd2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_7_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png index 85e2fe33..8b9a330b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_8.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png index 48c287d3..536e26ea 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png index 46ed7538..06d8aa01 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png and b/src/main/resources/assets/betterend/textures/block/flavolite_runed_active_9_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png b/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png index e9880db0..3ee5436a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png and b/src/main/resources/assets/betterend/textures/block/flavolite_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn.png b/src/main/resources/assets/betterend/textures/block/fracturn.png index 8159716a..a8412057 100644 Binary files a/src/main/resources/assets/betterend/textures/block/fracturn.png and b/src/main/resources/assets/betterend/textures/block/fracturn.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_e.png b/src/main/resources/assets/betterend/textures/block/fracturn_e.png index 3e739d5b..a2152d21 100644 Binary files a/src/main/resources/assets/betterend/textures/block/fracturn_e.png and b/src/main/resources/assets/betterend/textures/block/fracturn_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_potted.png b/src/main/resources/assets/betterend/textures/block/fracturn_potted.png new file mode 100644 index 00000000..bc5a5409 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/fracturn_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/fracturn_potted_e.png b/src/main/resources/assets/betterend/textures/block/fracturn_potted_e.png new file mode 100644 index 00000000..1f1dcfd6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/fracturn_potted_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/geyser_top.png b/src/main/resources/assets/betterend/textures/block/geyser_top.png index 28b67d57..0fc22b0f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/geyser_top.png and b/src/main/resources/assets/betterend/textures/block/geyser_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/globulagus.png b/src/main/resources/assets/betterend/textures/block/globulagus.png index b2782275..cd8e5fcc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/globulagus.png and b/src/main/resources/assets/betterend/textures/block/globulagus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/globulagus_potted.png b/src/main/resources/assets/betterend/textures/block/globulagus_potted.png new file mode 100644 index 00000000..f9fe85fd Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/globulagus_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/glowing_pillar_roots_bottom.png b/src/main/resources/assets/betterend/textures/block/glowing_pillar_roots_bottom.png index 2bd85ed6..4166fd3f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/glowing_pillar_roots_bottom.png and b/src/main/resources/assets/betterend/textures/block/glowing_pillar_roots_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png index bf3c870e..95bdb260 100644 Binary files a/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png index 05e83ea4..adf1c0cb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png index 27182e7a..4e1c0a1a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png and b/src/main/resources/assets/betterend/textures/block/gold_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/granite_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/granite_lantern_bottom.png index fe236bd8..45f112bd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/granite_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/granite_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/granite_lantern_side.png b/src/main/resources/assets/betterend/textures/block/granite_lantern_side.png index ebd6ccc0..f90d94bd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/granite_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/granite_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/granite_lantern_top.png b/src/main/resources/assets/betterend/textures/block/granite_lantern_top.png index c7fa1bb1..654ce79b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/granite_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/granite_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_bookshelf.png b/src/main/resources/assets/betterend/textures/block/helix_tree_bookshelf.png index 98a0e07c..8afd8c59 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_bottom.png index 800f725e..8b34262f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_side.png index 4ee19572..22a1c276 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_side.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_top.png b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_top.png index 3375742d..aa8963dd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_composter_top.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_bottom.png index d2066d0f..4c197387 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_front.png index 27ee53d3..485b9abf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_side.png index 754e6f39..6cacf8ef 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_top.png index 3ca07e10..509fac94 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_door_bottom.png b/src/main/resources/assets/betterend/textures/block/helix_tree_door_bottom.png index e49ab911..9856bccd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_door_top.png b/src/main/resources/assets/betterend/textures/block/helix_tree_door_top.png index 3038eceb..457f27ad 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_door_top.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png index 93245192..041fd139 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/helix_tree_log_top.png index e93d8cfd..475ab027 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_log_top.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_planks.png b/src/main/resources/assets/betterend/textures/block/helix_tree_planks.png index 19a0ce73..d824ef4b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_planks.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/helix_tree_sapling.png index 4ad7d9dc..911be1e2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_sapling.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_side.png index a75ae1ad..b9ffe039 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_top.png index e727ea1f..a6c46704 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/helix_tree_trapdoor.png b/src/main/resources/assets/betterend/textures/block/helix_tree_trapdoor.png index 3f19d0ac..0386aa0e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/helix_tree_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/helix_tree_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_bloom_bottom.png b/src/main/resources/assets/betterend/textures/block/hydralux_bloom_bottom.png index d642c9cc..52ed57dc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_bloom_bottom.png and b/src/main/resources/assets/betterend/textures/block/hydralux_bloom_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_bloom_top.png b/src/main/resources/assets/betterend/textures/block/hydralux_bloom_top.png index 032a4608..6c2f0529 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_bloom_top.png and b/src/main/resources/assets/betterend/textures/block/hydralux_bloom_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom.png index 9cae5188..fcf05ac6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png index b15af0e5..ea0feec4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud.png index 2e2d54ce..38770084 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_bottom.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_bottom.png index 2ea7f8ac..8e577d39 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_bottom.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side.png index d9492fc0..7de03a1e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png index d9492fc0..7de03a1e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_side_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top.png index f625b709..b945c552 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png index f625b709..b945c552 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_bud_petal_top_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal.png index 892bfa06..30150f22 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png index 892bfa06..30150f22 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_flower_petal_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_petal_block.png b/src/main/resources/assets/betterend/textures/block/hydralux_petal_block.png index df55a3f7..0f9557b8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_petal_block.png and b/src/main/resources/assets/betterend/textures/block/hydralux_petal_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_petal_block_colored.png b/src/main/resources/assets/betterend/textures/block/hydralux_petal_block_colored.png index 259cf553..596dd886 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_petal_block_colored.png and b/src/main/resources/assets/betterend/textures/block/hydralux_petal_block_colored.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_roots.png b/src/main/resources/assets/betterend/textures/block/hydralux_roots.png index 6d43f753..8ec72837 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_roots.png and b/src/main/resources/assets/betterend/textures/block/hydralux_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2.png index e589537a..ddf006a4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png index e9258f7c..b9ee2e04 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_2_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3.png index 7bccc83d..516b3c16 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png index fd52c709..957af6fb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4.png index e1bcc6a9..584e2b77 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png index 4ca5bde7..ff912b51 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png and b/src/main/resources/assets/betterend/textures/block/hydralux_sapling_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_vine.png b/src/main/resources/assets/betterend/textures/block/hydralux_vine.png index c62b9567..5c34083a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_vine.png and b/src/main/resources/assets/betterend/textures/block/hydralux_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/hydralux_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/hydralux_vine_bottom.png index 955ae225..57b5c43b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/hydralux_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/hydralux_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/inflexia.png b/src/main/resources/assets/betterend/textures/block/inflexia.png new file mode 100644 index 00000000..19b83699 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/inflexia.png differ diff --git a/src/main/resources/assets/betterend/textures/block/inflexia_potted.png b/src/main/resources/assets/betterend/textures/block/inflexia_potted.png new file mode 100644 index 00000000..ad36f264 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/inflexia_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/infusion_pedestal_pillar.png b/src/main/resources/assets/betterend/textures/block/infusion_pedestal_pillar.png index 6f92ef58..17b52155 100644 Binary files a/src/main/resources/assets/betterend/textures/block/infusion_pedestal_pillar.png and b/src/main/resources/assets/betterend/textures/block/infusion_pedestal_pillar.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png index 40f80b82..0f754fbe 100644 Binary files a/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png and b/src/main/resources/assets/betterend/textures/block/iron_bulb_vine_lantern_metal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png index 41913eb2..cbd8eace 100644 Binary files a/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png index 692adedf..34fad0b0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png index b6a04527..7cc40041 100644 Binary files a/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png and b/src/main/resources/assets/betterend/textures/block/iron_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine.png b/src/main/resources/assets/betterend/textures/block/ivis_vine.png index 541854b1..323b26ec 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_vine.png and b/src/main/resources/assets/betterend/textures/block/ivis_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png index 6d6d883a..673924de 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/ivis_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png index 33d8361c..364a8443 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png index 8a368a4b..473b6093 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png index a8e7203f..953a33c3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png index 5a2850bb..056397e2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_cap_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png index 6cbf057b..e714a9de 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_ceiling_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png index 521619ea..d17deb85 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png index 3ee7f1fb..c9f448e6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png index 4a41b359..9c2e9d16 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png index 0c419f55..1b8e4849 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png index 3dc62afd..82277d37 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png index 43aee59e..f0506345 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png index e0548c49..67594787 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png index 13c21ebb..760ca050 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png index 5f466430..66ed2077 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png index 6f3e85db..2f34d449 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png index 71c8f8c6..1ea58485 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png index 39b651bc..0180b73d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png index c188da6f..1a18c394 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png and b/src/main/resources/assets/betterend/textures/block/jellyshroom_wall_stem_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png index dc7e77e1..a7f62e00 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png index 43e53ca6..85ab5e7e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png index a106d397..86cbcb27 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_leaf_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png index 216632c2..e28d8aaf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png index a327269d..0e8384b4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png index fe41f344..b2411761 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_middle_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png index 3b4dd02d..5504e57e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png and b/src/main/resources/assets/betterend/textures/block/jungle_fern_spore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass.png b/src/main/resources/assets/betterend/textures/block/jungle_grass.png index 93e9235e..088cdaf9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_grass.png and b/src/main/resources/assets/betterend/textures/block/jungle_grass.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png b/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png index 7a22e3f4..41591c65 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png and b/src/main/resources/assets/betterend/textures/block/jungle_grass_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_grass_potted.png b/src/main/resources/assets/betterend/textures/block/jungle_grass_potted.png new file mode 100644 index 00000000..62100143 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/jungle_grass_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png index a56eb030..eeacaa11 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png and b/src/main/resources/assets/betterend/textures/block/jungle_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png index 37505929..ee9a5be1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png and b/src/main/resources/assets/betterend/textures/block/jungle_moss_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine.png b/src/main/resources/assets/betterend/textures/block/jungle_vine.png index 7bdcee97..82c144fc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_vine.png and b/src/main/resources/assets/betterend/textures/block/jungle_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png index 23ed5823..e3c5055c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/jungle_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_bottom.png index d579104c..13da51d8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_bottom.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top.png index 6c96fdfd..d1d3b834 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top_open.png index a84d9827..f9cc595e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png b/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png index 3863d4b6..e295ea55 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_bottom.png index cba04b4f..97f921cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_side.png b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_side.png index 7d0c993d..ee3e6459 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_side.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_top.png index 22c34cd5..ef723a7f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_composter_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_bottom.png index a825fd45..9d552188 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_front.png index a8c996dd..277569d5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_side.png index f095ccbc..d6967e11 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_top.png index ba026b34..ac74f71b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_door_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_door_top.png index e40e26ab..97729be9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_door_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png b/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png index a15a1bae..38a70f34 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side.png b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side.png index 6316c535..885e2800 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_2.png b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_2.png index 78b85fe4..1e4ddac3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_2.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_3.png b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_3.png index 9f7a3d7b..d2053e29 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_3.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_4.png b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_4.png index bbc31139..dc310ff0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_4.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_log_side_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_log_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_log_top.png index e1a7f327..0fdbc85a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_log_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_planks.png b/src/main/resources/assets/betterend/textures/block/lacugrove_planks.png index e0f13fad..7e3156f1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_planks.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_sapling.png b/src/main/resources/assets/betterend/textures/block/lacugrove_sapling.png index fa01d469..5f3b90b7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_sapling.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_side.png index e614419f..b01b7c11 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_top.png index 4855faaf..b185e26f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_trapdoor.png b/src/main/resources/assets/betterend/textures/block/lacugrove_trapdoor.png index 3bca4da9..69bf2469 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lacugrove_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/lacugrove_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lamellarium.png b/src/main/resources/assets/betterend/textures/block/lamellarium.png index e4d035b0..a57759bb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lamellarium.png and b/src/main/resources/assets/betterend/textures/block/lamellarium.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lamellarium_potted.png b/src/main/resources/assets/betterend/textures/block/lamellarium_potted.png new file mode 100644 index 00000000..fa7d7bfa Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lamellarium_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_bottom.png b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_bottom.png index d5a46a27..6072f3e5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_bottom.png and b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_middle.png b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_middle.png index 146dc0a2..2894e388 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_middle.png and b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_pre_top.png b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_pre_top.png index 3f4d8776..e7b37ede 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_pre_top.png and b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_pre_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_top.png b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_top.png index df9c89df..70a162be 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_top.png and b/src/main/resources/assets/betterend/textures/block/lanceleaf_leaf_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png index 99902f43..a87e472e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png index 602d4c78..fa114fa7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png index 8d3d3f74..67fc68f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png and b/src/main/resources/assets/betterend/textures/block/large_amaranita_cap_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png index 906c92ed..e75be969 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png index d007b97f..6d9ad50b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png index f2a902f8..f6eee97a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png index bc512b06..a3cce982 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/lucernia_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png b/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png index c63e9680..7a1af9f9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/lucernia_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png index 3069334e..46c653d5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png index df4985fd..bd2a20d2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png index a4d670ac..a7a59050 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png index df64f9ef..656fae59 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png index 66534540..b5474571 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png index 96b85558..8bea026f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png index bdd32bf6..14aa27ca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png index 1709535e..fa40aec4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/lucernia_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png index 0a528f06..b357cf70 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png and b/src/main/resources/assets/betterend/textures/block/lucernia_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png index 6ca50c75..e7b90205 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png b/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png index 839ba808..75933434 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png and b/src/main/resources/assets/betterend/textures/block/lucernia_ladder.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png index 7dc39a1c..a2c3f619 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png index b1f5cf69..d597885d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png index 09467dde..53a8b142 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png index c2aa8894..6331bbcc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png and b/src/main/resources/assets/betterend/textures/block/lucernia_leaves_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png index f4866cd5..37402358 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png and b/src/main/resources/assets/betterend/textures/block/lucernia_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png index 8a0b513e..6bfaba6d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png and b/src/main/resources/assets/betterend/textures/block/lucernia_log_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png index 7a2b1aad..6166846f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png index be12c9aa..544e3d7b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png index 48296cb3..1159b21f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png index 8f068b78..9239b981 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png and b/src/main/resources/assets/betterend/textures/block/lucernia_outer_leaves_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png index 7d734474..82caf41b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_planks.png and b/src/main/resources/assets/betterend/textures/block/lucernia_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png b/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png index 6b8ec8ee..949abba4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png and b/src/main/resources/assets/betterend/textures/block/lucernia_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png index f16b22c2..fcbae539 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/lucernia_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png index a484e86f..dd368738 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/lucernia_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_1.png index 72bd2b58..387bb9cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_1.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_2.png index a0e8a291..4012f31e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_2.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png index c9c7b969..6fc509f5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_3.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png index 8c8f1ebf..88cba6d1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png b/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png index d50e5264..a3de184e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_big_petal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png index 725ed557..40a46a12 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png index 1c93b511..c56fb816 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_leaf_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png index af9e5ea1..eac95c92 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png index af9e5ea1..eac95c92 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_bottom_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png index f592a2fa..67342280 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png index f592a2fa..67342280 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_middle_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png index fbe0ee35..ea76ef21 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png index fbe0ee35..ea76ef21 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png index 33769136..ab20ad70 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png index 33769136..ab20ad70 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_light_top_middle_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png b/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png index 17081516..4441c150 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png and b/src/main/resources/assets/betterend/textures/block/lumecorn_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lutebus.png b/src/main/resources/assets/betterend/textures/block/lutebus.png index 1f5a2686..c850af59 100644 Binary files a/src/main/resources/assets/betterend/textures/block/lutebus.png and b/src/main/resources/assets/betterend/textures/block/lutebus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/magnula.png b/src/main/resources/assets/betterend/textures/block/magnula.png index 7fe91460..73fe3e7c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/magnula.png and b/src/main/resources/assets/betterend/textures/block/magnula.png differ diff --git a/src/main/resources/assets/betterend/textures/block/magnula_bottom.png b/src/main/resources/assets/betterend/textures/block/magnula_bottom.png index eda6b963..ac2fb89d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/magnula_bottom.png and b/src/main/resources/assets/betterend/textures/block/magnula_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/menger_sponge.png b/src/main/resources/assets/betterend/textures/block/menger_sponge.png index 3e1d2d80..d67d81b5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/menger_sponge.png and b/src/main/resources/assets/betterend/textures/block/menger_sponge.png differ diff --git a/src/main/resources/assets/betterend/textures/block/menger_sponge_wet.png b/src/main/resources/assets/betterend/textures/block/menger_sponge_wet.png index f3e4a5c5..ac0a74a7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/menger_sponge_wet.png and b/src/main/resources/assets/betterend/textures/block/menger_sponge_wet.png differ diff --git a/src/main/resources/assets/betterend/textures/block/missing_tile.png b/src/main/resources/assets/betterend/textures/block/missing_tile.png index 5b31bfae..190a193a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/missing_tile.png and b/src/main/resources/assets/betterend/textures/block/missing_tile.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png index d26fcb91..c9034277 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_cut.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png index f75dc0fe..365fbed1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_hor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png index 9173717b..993767cf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png and b/src/main/resources/assets/betterend/textures/block/mossy_dragon_bone_side_ver.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_bookshelf.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_bookshelf.png index 6a7adfe0..50ac4612 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap.png index 975f33c4..2e57fc57 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap_transition.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap_transition.png index 4b1d0715..11194c9b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap_transition.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_cap_transition.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_bottom.png index 28a2f221..3b17e75d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_side.png index 5743553c..a06cd6f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_top.png index f3fbe238..65769aab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_top.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_front.png index e79e51cd..47e145ca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_side.png index 22c5cbbd..b6fc10f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_top.png index 6e26f3dc..c305082d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png index 37b40dd5..549a3bc3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_fur.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side.png index 7080537f..b6f03889 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_2.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_2.png index bc9fcd43..cf06c235 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_2.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png index bdbe83a4..537c3d14 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_4.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_4.png index 3ffc2512..9758ee03 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_4.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_5.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_5.png index 362854f7..5a05e592 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_5.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_side_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_stripped_side.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_stripped_side.png index 587ba5a0..e6f0fbe1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_stripped_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_log_stripped_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_planks.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_planks.png index 457056be..785b01f3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_planks.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_5.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_5.png index ff7b0016..d852da52 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_5.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_stripped_log_side_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_trapdoor.png b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_trapdoor.png index 73c9f0a9..55490f72 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/mossy_glowshroom_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png index 0b4b3c7d..2d9b9003 100644 Binary files a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png and b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/needlegrass_01.png b/src/main/resources/assets/betterend/textures/block/needlegrass_01.png index cf683705..da166ddd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/needlegrass_01.png and b/src/main/resources/assets/betterend/textures/block/needlegrass_01.png differ diff --git a/src/main/resources/assets/betterend/textures/block/needlegrass_02.png b/src/main/resources/assets/betterend/textures/block/needlegrass_02.png index 824d8b3e..0be03068 100644 Binary files a/src/main/resources/assets/betterend/textures/block/needlegrass_02.png and b/src/main/resources/assets/betterend/textures/block/needlegrass_02.png differ diff --git a/src/main/resources/assets/betterend/textures/block/needlegrass_03.png b/src/main/resources/assets/betterend/textures/block/needlegrass_03.png index 93188b2c..38a4aa1f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/needlegrass_03.png and b/src/main/resources/assets/betterend/textures/block/needlegrass_03.png differ diff --git a/src/main/resources/assets/betterend/textures/block/needlegrass_04.png b/src/main/resources/assets/betterend/textures/block/needlegrass_04.png index f4d6a7cc..1cf1c921 100644 Binary files a/src/main/resources/assets/betterend/textures/block/needlegrass_04.png and b/src/main/resources/assets/betterend/textures/block/needlegrass_04.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png index 1323e564..ae278be4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png index 0aba31b5..07ef9b88 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png index 264be428..3a8e09ca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png index e22c2e9a..96cfe29a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png index e6ac60a1..e6303288 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_big_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png index 2c681c7d..bd373094 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png index f3c4c0a8..4ac7b373 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_block_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png index 7fd0f467..f5e4709a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png index a36b2e48..92a278b5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png index e00a6131..3665c517 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png index 2887aae9..8da6888b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png index 1a10d5eb..84a99c36 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png index 74f13b76..0f2782a4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_medium_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png index cfdd7a22..6ac3ee72 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png index e664cfe6..2c1eb0cf 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png index 9a47ee11..b68f46ea 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_dust_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png index 5b2b0586..69ee4bba 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png index a296b22f..944f3902 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_side_moss_overlay.png differ diff --git a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png index 23414dfe..3d200ae1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png and b/src/main/resources/assets/betterend/textures/block/neon_cactus_small_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/orango.png b/src/main/resources/assets/betterend/textures/block/orango.png index b4f74bc1..63d30f64 100644 Binary files a/src/main/resources/assets/betterend/textures/block/orango.png and b/src/main/resources/assets/betterend/textures/block/orango.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_full_side.png b/src/main/resources/assets/betterend/textures/block/pallidium_full_side.png new file mode 100644 index 00000000..2411e32b Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_full_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_full_top.png b/src/main/resources/assets/betterend/textures/block/pallidium_full_top.png new file mode 100644 index 00000000..99484442 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_full_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_heavy_side.png b/src/main/resources/assets/betterend/textures/block/pallidium_heavy_side.png new file mode 100644 index 00000000..ce0f0e8c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_heavy_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_heavy_top.png b/src/main/resources/assets/betterend/textures/block/pallidium_heavy_top.png new file mode 100644 index 00000000..2d10e51f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_heavy_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_thin_side.png b/src/main/resources/assets/betterend/textures/block/pallidium_thin_side.png new file mode 100644 index 00000000..650b7aaf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_thin_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_thin_top.png b/src/main/resources/assets/betterend/textures/block/pallidium_thin_top.png new file mode 100644 index 00000000..372221df Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_thin_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_tiny_side.png b/src/main/resources/assets/betterend/textures/block/pallidium_tiny_side.png new file mode 100644 index 00000000..3aab3250 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_tiny_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pallidium_tiny_top.png b/src/main/resources/assets/betterend/textures/block/pallidium_tiny_top.png new file mode 100644 index 00000000..488248c4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pallidium_tiny_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png index 9c76fae5..de91a403 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png and b/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pond_anemone.png b/src/main/resources/assets/betterend/textures/block/pond_anemone.png index 48fef70e..a2115e4d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pond_anemone.png and b/src/main/resources/assets/betterend/textures/block/pond_anemone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png b/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png index 0b21d42b..1b6cfb6e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png and b/src/main/resources/assets/betterend/textures/block/pond_anemone_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/purple_polypore.png b/src/main/resources/assets/betterend/textures/block/purple_polypore.png index 655fb9fb..4f440610 100644 Binary files a/src/main/resources/assets/betterend/textures/block/purple_polypore.png and b/src/main/resources/assets/betterend/textures/block/purple_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/block/purpur_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/purpur_lantern_bottom.png index f3ed7066..2a7e59ab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/purpur_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/purpur_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/purpur_lantern_side.png b/src/main/resources/assets/betterend/textures/block/purpur_lantern_side.png index d96ca73e..2821ad7d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/purpur_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/purpur_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/purpur_lantern_top.png b/src/main/resources/assets/betterend/textures/block/purpur_lantern_top.png index d9781078..18df5e0b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/purpur_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/purpur_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/pythadendron_barrel_top_open.png index eacb1d41..819875ad 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png b/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png index ee830cc6..a7c1eb27 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_bottom.png index b464e7f5..920bc289 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_side.png b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_side.png index bbe963db..2578d2a1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_side.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_top.png b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_top.png index 8c80853a..903ec9bb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_composter_top.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_bottom.png index 9cb80e79..c602145b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_front.png index c922003c..96058cab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_side.png index 5b006bb0..6f613692 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_top.png index 6f799ca1..6f92664e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_door_side.png b/src/main/resources/assets/betterend/textures/block/pythadendron_door_side.png index feb975e7..94dd576d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_door_side.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_leaves.png b/src/main/resources/assets/betterend/textures/block/pythadendron_leaves.png index e4bec2e4..770229ac 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_leaves.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side.png b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side.png index c343d064..3ad2f165 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy.png b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy.png index bc53c4c1..d04ed45c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy_2.png b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy_2.png index ac5e3d3a..b8323919 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy_2.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_log_side_mossy_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_log_top.png b/src/main/resources/assets/betterend/textures/block/pythadendron_log_top.png index 76dcbdea..73206e69 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_log_top.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_planks.png b/src/main/resources/assets/betterend/textures/block/pythadendron_planks.png index 940cf9d4..3c412f24 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_planks.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_sapling.png b/src/main/resources/assets/betterend/textures/block/pythadendron_sapling.png index c895622e..b12ef419 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_sapling.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_side.png index 676e3f02..12ad614d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_top.png index 437096e8..87ec4750 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_trapdoor.png b/src/main/resources/assets/betterend/textures/block/pythadendron_trapdoor.png index cadb9632..ca7113d2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/pythadendron_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/pythadendron_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/quartz_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/quartz_lantern_bottom.png index fc0421ad..4ac07c5a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/quartz_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/quartz_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/quartz_lantern_top.png b/src/main/resources/assets/betterend/textures/block/quartz_lantern_top.png index ad6f16c8..6e5c5e5f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/quartz_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/quartz_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/respawn_obelisk_top_and_side.png b/src/main/resources/assets/betterend/textures/block/respawn_obelisk_top_and_side.png index 7832bdb5..988fa52d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/respawn_obelisk_top_and_side.png and b/src/main/resources/assets/betterend/textures/block/respawn_obelisk_top_and_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rubinea.png b/src/main/resources/assets/betterend/textures/block/rubinea.png index b590bfe8..ea924734 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rubinea.png and b/src/main/resources/assets/betterend/textures/block/rubinea.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png index 5601c268..8ad59259 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png and b/src/main/resources/assets/betterend/textures/block/rubinea_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/ruscus.png b/src/main/resources/assets/betterend/textures/block/ruscus.png index 68589632..0098eef0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/ruscus.png and b/src/main/resources/assets/betterend/textures/block/ruscus.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png b/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png index e01bc130..35a2f2c2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side.png index d052be19..ff0195f5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_side.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png index b92237a7..7c7cb921 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png index b3f35918..c24ccf60 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_side_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png index 17aba4aa..d3204145 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png index cb14baa0..43d50bce 100644 Binary files a/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png and b/src/main/resources/assets/betterend/textures/block/rutiscus_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/salteago.png b/src/main/resources/assets/betterend/textures/block/salteago.png index dd0df547..25f43f33 100644 Binary files a/src/main/resources/assets/betterend/textures/block/salteago.png and b/src/main/resources/assets/betterend/textures/block/salteago.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png index f00ff0c2..256ca2f7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png index 667f447f..939a6e8d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_flower_pot.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_flower_pot.png new file mode 100644 index 00000000..9b12e5a2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png index b248b45d..1c3f0779 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png index 7e6d7e3c..ce44d104 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png index 1efbd34b..0cbaf1a8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png index cf5b31c5..1c312e6a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png index 0807c5bc..98bb0831 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png index ada8266e..53691d81 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png index f6044f04..1e79a0dd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png index 4ab1013d..d69f0992 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png index cbfcfa8a..761ca2fb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png and b/src/main/resources/assets/betterend/textures/block/sandy_jadestone_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_side.png b/src/main/resources/assets/betterend/textures/block/sangnum_side.png index 62bb58df..ee8d4fff 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sangnum_side.png and b/src/main/resources/assets/betterend/textures/block/sangnum_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sangnum_top.png b/src/main/resources/assets/betterend/textures/block/sangnum_top.png index e321cbb1..8382234f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sangnum_top.png and b/src/main/resources/assets/betterend/textures/block/sangnum_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_berry_leaves.png b/src/main/resources/assets/betterend/textures/block/shadow_berry_leaves.png index 88ac59a9..2be3feca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/shadow_berry_leaves.png and b/src/main/resources/assets/betterend/textures/block/shadow_berry_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png b/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png index 18d61cdd..628a98f4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png and b/src/main/resources/assets/betterend/textures/block/shadow_grass_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png b/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png index e4ca5d7f..496d4f99 100644 Binary files a/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png and b/src/main/resources/assets/betterend/textures/block/shadow_grass_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_grass_top.png b/src/main/resources/assets/betterend/textures/block/shadow_grass_top.png index 2fe86a05..2a2ecf69 100644 Binary files a/src/main/resources/assets/betterend/textures/block/shadow_grass_top.png and b/src/main/resources/assets/betterend/textures/block/shadow_grass_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_plant.png b/src/main/resources/assets/betterend/textures/block/shadow_plant.png index 40b46460..bd812aac 100644 Binary files a/src/main/resources/assets/betterend/textures/block/shadow_plant.png and b/src/main/resources/assets/betterend/textures/block/shadow_plant.png differ diff --git a/src/main/resources/assets/betterend/textures/block/shadow_plant_potted.png b/src/main/resources/assets/betterend/textures/block/shadow_plant_potted.png new file mode 100644 index 00000000..797bb567 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/shadow_plant_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/silk_moth_nest_connect.png b/src/main/resources/assets/betterend/textures/block/silk_moth_nest_connect.png index b6a5c7ee..df88a38c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/silk_moth_nest_connect.png and b/src/main/resources/assets/betterend/textures/block/silk_moth_nest_connect.png differ diff --git a/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png index f7ab7e63..51e2a511 100644 Binary files a/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png and b/src/main/resources/assets/betterend/textures/block/small_amaranita_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png b/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png index c73056f1..ea93ff32 100644 Binary files a/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png and b/src/main/resources/assets/betterend/textures/block/small_jellyshroom_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png deleted file mode 100644 index e2981961..00000000 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png and /dev/null differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png index b6b4336b..f3cb7623 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png index 6edbb4a2..409d2354 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png index 04973162..5ff24fe3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png index 9b0a4fab..c17d40d8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png index aa1a21fe..f410d09e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png index e2981961..9828de1a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png index ad66fdd4..e69f57b1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png index ada5b494..420a521f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png and b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png index cdecb5f2..9e4c20cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks.png index 4e7fda6f..d8411976 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks_wall_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks_wall_top.png index 4f0b359c..c7cdaab2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks_wall_top.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_bricks_wall_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_flower_pot.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_flower_pot.png new file mode 100644 index 00000000..14bec47e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png index dffaa6b8..54cc0de1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png index 989c5650..f85b5bd3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png index c5b2f091..e2471df2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png index 5314ff63..904e7782 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_lantern_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_lantern_side.png index 7912965c..e2af6b78 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_pillar_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_pillar_side.png index e6712047..26b4c916 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_polished.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_polished.png index 4493c2d3..e9056aa0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_polished.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_side.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_side.png index 75a57a67..140a2fab 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_side.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_top.png index aa8192cc..bc81074a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_top.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_post_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_tiles.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_tiles.png index 94c6540a..11683331 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_tiles.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_top.png b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_top.png index f6d3900a..fc306515 100644 Binary files a/src/main/resources/assets/betterend/textures/block/sulphuric_rock_top.png and b/src/main/resources/assets/betterend/textures/block/sulphuric_rock_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tail_moss.png b/src/main/resources/assets/betterend/textures/block/tail_moss.png index 6c1c583a..be639ec7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tail_moss.png and b/src/main/resources/assets/betterend/textures/block/tail_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top.png index 4813c41d..c498c4f4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top_open.png b/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top_open.png index 7a32a97e..11554ea6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top_open.png and b/src/main/resources/assets/betterend/textures/block/tenanea_barrel_top_open.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_bookshelf.png b/src/main/resources/assets/betterend/textures/block/tenanea_bookshelf.png index 3ca8d449..121a4cdc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/tenanea_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/tenanea_composter_bottom.png index 2b281191..60e78b3a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/tenanea_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_composter_side.png b/src/main/resources/assets/betterend/textures/block/tenanea_composter_side.png index 84686721..8308504a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_composter_side.png and b/src/main/resources/assets/betterend/textures/block/tenanea_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_composter_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_composter_top.png index aaeb6391..497c16d1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_composter_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_bottom.png b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_bottom.png index 8031c220..ec5e10dd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_bottom.png and b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_front.png index 5862ae14..a9ddfc87 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_side.png index 751a91bc..3c0065e9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_top.png index 842f74ab..6afe861a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_flowers.png b/src/main/resources/assets/betterend/textures/block/tenanea_flowers.png index db355c90..5280ebaa 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_flowers.png and b/src/main/resources/assets/betterend/textures/block/tenanea_flowers.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_bottom.png b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_bottom.png index 783673aa..76c3e0e6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_bottom.png and b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem.png b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem.png index a6132d47..511d81d2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem.png and b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem_bottom.png b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem_bottom.png index 3afd63ec..82e3bcb8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem_bottom.png and b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_stem_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_top.png index 3c5937fd..8845c528 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_flowers_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_flowers_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_leaves.png b/src/main/resources/assets/betterend/textures/block/tenanea_leaves.png index a4285202..8bb1150d 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_leaves.png and b/src/main/resources/assets/betterend/textures/block/tenanea_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_log_side.png b/src/main/resources/assets/betterend/textures/block/tenanea_log_side.png index eda9c545..f34dab0b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_log_side.png and b/src/main/resources/assets/betterend/textures/block/tenanea_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_log_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_log_top.png index b0edb7c8..da917216 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_log_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_outer_leaves.png b/src/main/resources/assets/betterend/textures/block/tenanea_outer_leaves.png index 0db71132..8aa75fd6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_outer_leaves.png and b/src/main/resources/assets/betterend/textures/block/tenanea_outer_leaves.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_planks.png b/src/main/resources/assets/betterend/textures/block/tenanea_planks.png index ef6e8e70..159e3346 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_planks.png and b/src/main/resources/assets/betterend/textures/block/tenanea_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_side.png index 9ef2c0d0..dbc75bde 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_top.png index 43958ea0..80027302 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/tenanea_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tenanea_trapdoor.png b/src/main/resources/assets/betterend/textures/block/tenanea_trapdoor.png index 2abfd2fc..dea0f719 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tenanea_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/tenanea_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png index ab1960cb..886d4c8b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_back.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png index 837326c8..80a608cc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png index c017633d..46f2e6c8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png index b590f604..5a90d0f7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png index cf463857..c4a64326 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png and b/src/main/resources/assets/betterend/textures/block/terminite_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bars.png b/src/main/resources/assets/betterend/textures/block/terminite_bars.png index e9be368c..7d9623a1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_bars.png and b/src/main/resources/assets/betterend/textures/block/terminite_bars.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_block.png b/src/main/resources/assets/betterend/textures/block/terminite_block.png index 26c25d6c..a0b4d738 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_block.png and b/src/main/resources/assets/betterend/textures/block/terminite_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png index e8177af7..6278cecd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png and b/src/main/resources/assets/betterend/textures/block/terminite_bulb_vine_lantern_metal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png index 0578cba3..2c4bc2e1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png index a44c68b6..bdf332fa 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png index 689e5c9e..dd8498f8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png and b/src/main/resources/assets/betterend/textures/block/terminite_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png index 3491b811..1ec27441 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/terminite_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_side.png b/src/main/resources/assets/betterend/textures/block/terminite_door_side.png index e7eeefcc..de8623d6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_door_side.png and b/src/main/resources/assets/betterend/textures/block/terminite_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_door_top.png b/src/main/resources/assets/betterend/textures/block/terminite_door_top.png index 66e886cc..1a4f4d70 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_door_top.png and b/src/main/resources/assets/betterend/textures/block/terminite_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_tile.png b/src/main/resources/assets/betterend/textures/block/terminite_tile.png index 3b31396d..1464c9ff 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_tile.png and b/src/main/resources/assets/betterend/textures/block/terminite_tile.png differ diff --git a/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png b/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png index e904fb28..00364b25 100644 Binary files a/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/terminite_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png index 83a1ac99..2f0fffad 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png index 78d46224..44196c65 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_panel.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png index a7189969..92be9637 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png index 6d41d028..c99a62b0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png and b/src/main/resources/assets/betterend/textures/block/thallasium_anvil_top_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bars.png b/src/main/resources/assets/betterend/textures/block/thallasium_bars.png index 465a4a6c..25568e74 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_bars.png and b/src/main/resources/assets/betterend/textures/block/thallasium_bars.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_block.png b/src/main/resources/assets/betterend/textures/block/thallasium_block.png index 50d0d93c..10700012 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_block.png and b/src/main/resources/assets/betterend/textures/block/thallasium_block.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png b/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png index ca39eac9..7ac65a9e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png and b/src/main/resources/assets/betterend/textures/block/thallasium_bulb_vine_lantern_metal.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png index 942ba9ce..66aef332 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_ceil.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png index 90b9a25b..ef02d30b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_floor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png index 59cb4f63..95ef5288 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png and b/src/main/resources/assets/betterend/textures/block/thallasium_chandelier_wall.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png index 23832cdd..d4e4299a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/thallasium_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png index 597023e8..aa266b4e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png and b/src/main/resources/assets/betterend/textures/block/thallasium_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png index d0787596..8fa8642a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png and b/src/main/resources/assets/betterend/textures/block/thallasium_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png index 30b1170e..30d1aeaa 100644 Binary files a/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/thallasium_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tube_worm_1.png b/src/main/resources/assets/betterend/textures/block/tube_worm_1.png index 2be52d58..1b993308 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tube_worm_1.png and b/src/main/resources/assets/betterend/textures/block/tube_worm_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tube_worm_2.png b/src/main/resources/assets/betterend/textures/block/tube_worm_2.png index 7b90cd00..7a2331ce 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tube_worm_2.png and b/src/main/resources/assets/betterend/textures/block/tube_worm_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/tube_worm_3.png b/src/main/resources/assets/betterend/textures/block/tube_worm_3.png index 8e97cc6d..fb6084a7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/tube_worm_3.png and b/src/main/resources/assets/betterend/textures/block/tube_worm_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_moss.png b/src/main/resources/assets/betterend/textures/block/twisted_moss.png index 3f734254..64352afd 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_moss.png and b/src/main/resources/assets/betterend/textures/block/twisted_moss.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_moss_2.png b/src/main/resources/assets/betterend/textures/block/twisted_moss_2.png index befe1545..dfc98752 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_moss_2.png and b/src/main/resources/assets/betterend/textures/block/twisted_moss_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png index 53d299c7..f12047a3 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png index b9464747..06d1bbad 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_end.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png index 3ef19a06..5337e498 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_small.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png index 2fc30812..20b3b409 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png index 703a1e39..d2feb638 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_sporophyte_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png index 7266a4c2..ab04f81a 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png and b/src/main/resources/assets/betterend/textures/block/twisted_umbrella_moss_up.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_vine.png b/src/main/resources/assets/betterend/textures/block/twisted_vine.png index 475ea57d..94035748 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_vine.png and b/src/main/resources/assets/betterend/textures/block/twisted_vine.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_vine_bottom.png b/src/main/resources/assets/betterend/textures/block/twisted_vine_bottom.png index e54ac776..44dfe5ad 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_vine_bottom.png and b/src/main/resources/assets/betterend/textures/block/twisted_vine_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/twisted_vine_roots.png b/src/main/resources/assets/betterend/textures/block/twisted_vine_roots.png index 77d9a9de..a68c549b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/twisted_vine_roots.png and b/src/main/resources/assets/betterend/textures/block/twisted_vine_roots.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith.png b/src/main/resources/assets/betterend/textures/block/umbralith.png new file mode 100644 index 00000000..5ed097f7 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_2.png b/src/main/resources/assets/betterend/textures/block/umbralith_2.png new file mode 100644 index 00000000..a49cc9bb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_3.png b/src/main/resources/assets/betterend/textures/block/umbralith_3.png new file mode 100644 index 00000000..0434d35e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_3_e.png b/src/main/resources/assets/betterend/textures/block/umbralith_3_e.png new file mode 100644 index 00000000..bea94a5d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_3_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_4.png b/src/main/resources/assets/betterend/textures/block/umbralith_4.png new file mode 100644 index 00000000..1b6d9efe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_4_e.png b/src/main/resources/assets/betterend/textures/block/umbralith_4_e.png new file mode 100644 index 00000000..70c9f9cb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_4_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_5.png b/src/main/resources/assets/betterend/textures/block/umbralith_5.png new file mode 100644 index 00000000..d2986cfe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_5_e.png b/src/main/resources/assets/betterend/textures/block/umbralith_5_e.png new file mode 100644 index 00000000..7f3712a3 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_5_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_6.png b/src/main/resources/assets/betterend/textures/block/umbralith_6.png new file mode 100644 index 00000000..4f7b2189 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_7.png b/src/main/resources/assets/betterend/textures/block/umbralith_7.png new file mode 100644 index 00000000..89d2b5e6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_bricks.png b/src/main/resources/assets/betterend/textures/block/umbralith_bricks.png new file mode 100644 index 00000000..f5af79cb Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_flower_pot.png b/src/main/resources/assets/betterend/textures/block/umbralith_flower_pot.png new file mode 100644 index 00000000..23ae2fc1 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front.png new file mode 100644 index 00000000..20f8cbf2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front_on.png new file mode 100644 index 00000000..696f967d Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png.mcmeta b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png.mcmeta new file mode 100644 index 00000000..1c2798b6 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png new file mode 100644 index 00000000..ad655693 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png.mcmeta b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png.mcmeta new file mode 100644 index 00000000..1c2798b6 --- /dev/null +++ b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_glow_e.png.mcmeta @@ -0,0 +1,12 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8, + "frames": [ + 0, + 1, + 2, + 3 + ] + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_side.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_side.png new file mode 100644 index 00000000..dc5d4d97 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_furnace_top.png b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_top.png new file mode 100644 index 00000000..45986bf8 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_bottom.png new file mode 100644 index 00000000..41b38062 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_lantern_side.png b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_side.png new file mode 100644 index 00000000..63eeef86 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_lantern_top.png b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_top.png new file mode 100644 index 00000000..3eb6a18c Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_pillar_side.png b/src/main/resources/assets/betterend/textures/block/umbralith_pillar_side.png new file mode 100644 index 00000000..68552023 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_pillar_top.png b/src/main/resources/assets/betterend/textures/block/umbralith_pillar_top.png new file mode 100644 index 00000000..ad283b42 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_polished.png b/src/main/resources/assets/betterend/textures/block/umbralith_polished.png new file mode 100644 index 00000000..c5a256cc Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbralith_tiles.png b/src/main/resources/assets/betterend/textures/block/umbralith_tiles.png new file mode 100644 index 00000000..71ff3226 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbralith_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png index 0c0167a2..5b8a40ae 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png index 859d7e13..01065fd5 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png index ce3be5bc..5bd2cdca 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png index 7ca47be8..4873c7ef 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_composter_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png index 56f6e074..860b111c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png index 8b6dc906..7a1e8ff2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png index 2b5e02af..851d73ba 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_crafting_table_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png index 3ca75a7b..eb16485c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png index 4962a1e6..d82aa4f1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png index a8e2472f..41fe7a86 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_door_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png index 74ab18a6..1052e62b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png index 1aed4f68..d2e7a4a2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png index 6aed0419..d9ccb39b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png index 668b3236..6eea05c0 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png index 91caf5c7..a9080d6b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png index 293c6b16..c1e3fcd1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png index da56a9b9..57ad9bd9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png index 3ff72f88..0dacbc6c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png index 001dadc9..292c8b96 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png index f431af32..bc8fe86e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png index 5e3d4f8a..b37365d4 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png index fa89c7e5..da8d7800 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_planks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png index 5a269b70..b104d279 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_sapling.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png index c0109808..b677ec04 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png index 5a9c4c75..6cd36eed 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_stripped_log_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png index 20c4233c..3a04b5bc 100644 Binary files a/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_trapdoor.png differ diff --git a/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png b/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png index 81631cec..f1fe5267 100644 Binary files a/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png and b/src/main/resources/assets/betterend/textures/block/vaiolush_fern.png differ diff --git a/src/main/resources/assets/betterend/textures/block/vaiolush_fern_potted.png b/src/main/resources/assets/betterend/textures/block/vaiolush_fern_potted.png new file mode 100644 index 00000000..2797cacf Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/vaiolush_fern_potted.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite.png b/src/main/resources/assets/betterend/textures/block/violecite.png index 7b3f9b76..c36e1d40 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite.png and b/src/main/resources/assets/betterend/textures/block/violecite.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_bricks.png b/src/main/resources/assets/betterend/textures/block/violecite_bricks.png index bfee2087..c2bc46b7 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_bricks.png and b/src/main/resources/assets/betterend/textures/block/violecite_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_flower_pot.png b/src/main/resources/assets/betterend/textures/block/violecite_flower_pot.png new file mode 100644 index 00000000..c8551839 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/violecite_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png index a00b7eb5..0766f1ee 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png index 311fda8c..11ec02fe 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png b/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png index dffd5b35..1f616a4c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/violecite_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_pillar_side.png b/src/main/resources/assets/betterend/textures/block/violecite_pillar_side.png index a7b85016..029a3d95 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/violecite_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_pillar_top.png b/src/main/resources/assets/betterend/textures/block/violecite_pillar_top.png index e68fb339..81a02a5b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_pillar_top.png and b/src/main/resources/assets/betterend/textures/block/violecite_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_polished.png b/src/main/resources/assets/betterend/textures/block/violecite_polished.png index 38655205..5240a81c 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_polished.png and b/src/main/resources/assets/betterend/textures/block/violecite_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/violecite_post_side.png b/src/main/resources/assets/betterend/textures/block/violecite_post_side.png index aa2e5fe7..11701e9e 100644 Binary files a/src/main/resources/assets/betterend/textures/block/violecite_post_side.png and b/src/main/resources/assets/betterend/textures/block/violecite_post_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png index 9e756998..8ce9445b 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png index ebb6a9ab..55ee89e1 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_bricks.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_flower_pot.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_flower_pot.png new file mode 100644 index 00000000..72603752 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_flower_pot.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png index d71ecb81..5c578d7f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png index 899e1c14..51464edb 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_front_on.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png index ecf9569c..1335de36 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png index c81182e2..e6f9670f 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_furnace_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png index 3e78f2dc..fb39e011 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_bottom.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png index 9e3e91e5..425961d8 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png index 2ceefd0d..b4ae13d6 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_lantern_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png index 502ffa0e..df24dd33 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png index 7879b95f..96e85dd2 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_pillar_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png index 38460f73..f810e5f9 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_polished.png differ diff --git a/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png index 4d7db656..f0f0d052 100644 Binary files a/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png and b/src/main/resources/assets/betterend/textures/block/virid_jadestone_tiles.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest.png index d610d601..c3d71599 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest.png and b/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest_right.png index 56835c74..95acf304 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest_right.png and b/src/main/resources/assets/betterend/textures/entity/chest/dragon_tree_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png index 5c736a98..6878d49e 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png index 2538d299..cfef1815 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_left.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png index ae64b382..bbf45721 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png and b/src/main/resources/assets/betterend/textures/entity/chest/lucernia_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/mossy_glowshroom_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/mossy_glowshroom_chest.png index b4213e59..764269a0 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/mossy_glowshroom_chest.png and b/src/main/resources/assets/betterend/textures/entity/chest/mossy_glowshroom_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest.png b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest.png index ea5565fa..d35814cf 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest.png and b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_left.png b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_left.png index ad430ec1..da8fa6fd 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_left.png and b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_left.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_right.png b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_right.png index dc8d6fa9..ddbd1e86 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_right.png and b/src/main/resources/assets/betterend/textures/entity/chest/pythadendron_chest_right.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png index 5f5dbb93..547a194a 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png index 1ff0bcf7..90ec8895 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png index 4cf67740..7abb243f 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png index d302c5a7..b0196652 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png and b/src/main/resources/assets/betterend/textures/entity/cubozoa/cubozoa_sulphur_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/dragonfly.png b/src/main/resources/assets/betterend/textures/entity/dragonfly.png index 3c69d09f..7a3cc9a7 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/dragonfly.png and b/src/main/resources/assets/betterend/textures/entity/dragonfly.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/dragonfly_glow.png b/src/main/resources/assets/betterend/textures/entity/dragonfly_glow.png index c781f72c..0e515fa5 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/dragonfly_glow.png and b/src/main/resources/assets/betterend/textures/entity/dragonfly_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/elytra_armored.png b/src/main/resources/assets/betterend/textures/entity/elytra_armored.png index 4fb41886..ce93c8c3 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/elytra_armored.png and b/src/main/resources/assets/betterend/textures/entity/elytra_armored.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/elytra_crystalite.png b/src/main/resources/assets/betterend/textures/entity/elytra_crystalite.png index 6f970955..eda29ead 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/elytra_crystalite.png and b/src/main/resources/assets/betterend/textures/entity/elytra_crystalite.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png index 9f77504f..aa0c2bc5 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png index c7ac74e0..01c9b309 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_0_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png index 4d73ab13..416975bc 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png index f3c96e46..eb1ef39a 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_1_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png index f2f2e224..effea377 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png index 1689a3a5..4da30ccc 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_2_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png index dc1137da..40d0bf47 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png index 1bc4dfee..f3c4f387 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_3_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png index 2db3f17e..d98eaa8d 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png index 25fc9931..5f19b77d 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_4_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png index 6120cb0a..c9a33250 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png index 03d527ab..5319aaa9 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_5_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png index 606fbca6..79c9d0fd 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png index 43118e03..069a0947 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_6_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png index 6648a828..987a8e18 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png index 1577d4a0..33cc58c7 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_fish/end_fish_7_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png index 2f44e329..035b17e7 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_amber.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png index 472300de..7ef73d3e 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png index 711d1497..fa81a98c 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png and b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png b/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png index 9b63ccf3..52c3eaa4 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png and b/src/main/resources/assets/betterend/textures/entity/eternal_crystal.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/shadow_walker.png b/src/main/resources/assets/betterend/textures/entity/shadow_walker.png index 2bd9593d..a43d152a 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/shadow_walker.png and b/src/main/resources/assets/betterend/textures/entity/shadow_walker.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/dragon_tree_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/dragon_tree_sign.png index 20faf88d..a4fd763f 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/dragon_tree_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/dragon_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/end_lotus_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/end_lotus_sign.png index 2d8d9e6b..bf79c45e 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/end_lotus_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/end_lotus_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/helix_tree_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/helix_tree_sign.png index 7df69a2e..2f886d23 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/helix_tree_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/helix_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png index f16e9528..2e49e074 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/jellyshroom_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/lacugrove_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/lacugrove_sign.png index b4164eb6..8ffe4247 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/lacugrove_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/lacugrove_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png index 0836dd40..6582238a 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/lucernia_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/pythadendron_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/pythadendron_sign.png index c53643d9..3810727f 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/pythadendron_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/pythadendron_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/tenanea_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/tenanea_sign.png index 7771a007..90534337 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/tenanea_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/tenanea_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png b/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png index 23e39bb4..22ed069e 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png and b/src/main/resources/assets/betterend/textures/entity/sign/umbrella_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/entity/silk_moth.png b/src/main/resources/assets/betterend/textures/entity/silk_moth.png index c66fb192..fd8d6574 100644 Binary files a/src/main/resources/assets/betterend/textures/entity/silk_moth.png and b/src/main/resources/assets/betterend/textures/entity/silk_moth.png differ diff --git a/src/main/resources/assets/betterend/textures/gui/rei_infusion.png b/src/main/resources/assets/betterend/textures/gui/rei_infusion.png index a25798d3..597615ea 100644 Binary files a/src/main/resources/assets/betterend/textures/gui/rei_infusion.png and b/src/main/resources/assets/betterend/textures/gui/rei_infusion.png differ diff --git a/src/main/resources/assets/betterend/textures/gui/smelter_gui.png b/src/main/resources/assets/betterend/textures/gui/smelter_gui.png index 5f070aee..640a1447 100644 Binary files a/src/main/resources/assets/betterend/textures/gui/smelter_gui.png and b/src/main/resources/assets/betterend/textures/gui/smelter_gui.png differ diff --git a/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png b/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png index 020f8daa..5d49bbc5 100644 Binary files a/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png and b/src/main/resources/assets/betterend/textures/heightmaps/mountain_1.png differ diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png index 64af920a..a9fbfce1 100644 Binary files a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png and b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_frame_full.png differ diff --git a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png index 6d460027..b1460785 100644 Binary files a/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png and b/src/main/resources/assets/betterend/textures/images/eternal_ritual/portal_structure.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png index 88e04018..01ddead7 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_full.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png index 2361f777..57f3cc27 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/infusion_ritual_start.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png index 1bfb82df..f754bd2b 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_finished.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png index 42a5459e..efae5a7a 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_ready.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png index b3f5898f..29a6d007 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_started.png differ diff --git a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png index b06d537f..8cc26ef9 100644 Binary files a/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png and b/src/main/resources/assets/betterend/textures/images/infusion_ritual/ritual_structure.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_boots.png b/src/main/resources/assets/betterend/textures/item/aeternium_boots.png index d36b2dc0..402c8126 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_boots.png and b/src/main/resources/assets/betterend/textures/item/aeternium_boots.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_chestplate.png b/src/main/resources/assets/betterend/textures/item/aeternium_chestplate.png index b150e1a5..49f0c341 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_chestplate.png and b/src/main/resources/assets/betterend/textures/item/aeternium_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_forged_plate.png b/src/main/resources/assets/betterend/textures/item/aeternium_forged_plate.png index 3ffd9a9a..9f177f33 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_forged_plate.png and b/src/main/resources/assets/betterend/textures/item/aeternium_forged_plate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_helmet.png b/src/main/resources/assets/betterend/textures/item/aeternium_helmet.png index ba4664fb..3fe27e48 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_helmet.png and b/src/main/resources/assets/betterend/textures/item/aeternium_helmet.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_ingot.png b/src/main/resources/assets/betterend/textures/item/aeternium_ingot.png index 031a777a..6622d555 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_ingot.png and b/src/main/resources/assets/betterend/textures/item/aeternium_ingot.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aeternium_leggings.png b/src/main/resources/assets/betterend/textures/item/aeternium_leggings.png index 69c2a5a5..4ad455a4 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aeternium_leggings.png and b/src/main/resources/assets/betterend/textures/item/aeternium_leggings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_gem.png b/src/main/resources/assets/betterend/textures/item/amber_gem.png index 9843c210..248b9764 100644 Binary files a/src/main/resources/assets/betterend/textures/item/amber_gem.png and b/src/main/resources/assets/betterend/textures/item/amber_gem.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_raw.png b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png index adae9d37..d78d4562 100644 Binary files a/src/main/resources/assets/betterend/textures/item/amber_root_raw.png and b/src/main/resources/assets/betterend/textures/item/amber_root_raw.png differ diff --git a/src/main/resources/assets/betterend/textures/item/amber_root_seed.png b/src/main/resources/assets/betterend/textures/item/amber_root_seed.png index bf1a7b90..270c111d 100644 Binary files a/src/main/resources/assets/betterend/textures/item/amber_root_seed.png and b/src/main/resources/assets/betterend/textures/item/amber_root_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/aurant_polypore.png b/src/main/resources/assets/betterend/textures/item/aurant_polypore.png index bfdde532..84010b1d 100644 Binary files a/src/main/resources/assets/betterend/textures/item/aurant_polypore.png and b/src/main/resources/assets/betterend/textures/item/aurant_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry.png b/src/main/resources/assets/betterend/textures/item/blossom_berry.png index d0a89188..a92c1db0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/blossom_berry.png and b/src/main/resources/assets/betterend/textures/item/blossom_berry.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry_jelly.png b/src/main/resources/assets/betterend/textures/item/blossom_berry_jelly.png index d09b7c25..46c128b8 100644 Binary files a/src/main/resources/assets/betterend/textures/item/blossom_berry_jelly.png and b/src/main/resources/assets/betterend/textures/item/blossom_berry_jelly.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png b/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png index 6a34f91a..0d9cbf5e 100644 Binary files a/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png and b/src/main/resources/assets/betterend/textures/item/blossom_berry_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/blue_vine_seed.png b/src/main/resources/assets/betterend/textures/item/blue_vine_seed.png index 965fccd1..8749466c 100644 Binary files a/src/main/resources/assets/betterend/textures/item/blue_vine_seed.png and b/src/main/resources/assets/betterend/textures/item/blue_vine_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png index 350ed56b..a9276264 100644 Binary files a/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png and b/src/main/resources/assets/betterend/textures/item/bolux_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png index 4541a243..844e05ab 100644 Binary files a/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png and b/src/main/resources/assets/betterend/textures/item/bolux_mushroom_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png index 6b1e88c4..cd510ebb 100644 Binary files a/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png and b/src/main/resources/assets/betterend/textures/item/bucket_cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/item/bucket_end_fish.png b/src/main/resources/assets/betterend/textures/item/bucket_end_fish.png index 9b0678c4..460c451a 100644 Binary files a/src/main/resources/assets/betterend/textures/item/bucket_end_fish.png and b/src/main/resources/assets/betterend/textures/item/bucket_end_fish.png differ diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png index d24ce153..419b2de1 100644 Binary files a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png and b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_pie.png differ diff --git a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png index f49ede5b..e6e2278e 100644 Binary files a/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png and b/src/main/resources/assets/betterend/textures/item/cave_pumpkin_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_cyan.png b/src/main/resources/assets/betterend/textures/item/charnia_cyan.png index 2cccc768..36357963 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_cyan.png and b/src/main/resources/assets/betterend/textures/item/charnia_cyan.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_green.png b/src/main/resources/assets/betterend/textures/item/charnia_green.png index a63ccf28..7e9121b5 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_green.png and b/src/main/resources/assets/betterend/textures/item/charnia_green.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_light_blue.png b/src/main/resources/assets/betterend/textures/item/charnia_light_blue.png index 5e82ab7e..2dde93a9 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_light_blue.png and b/src/main/resources/assets/betterend/textures/item/charnia_light_blue.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_orange.png b/src/main/resources/assets/betterend/textures/item/charnia_orange.png index e95351d3..19da7ad1 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_orange.png and b/src/main/resources/assets/betterend/textures/item/charnia_orange.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_purple.png b/src/main/resources/assets/betterend/textures/item/charnia_purple.png index f46cacbd..40538bf3 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_purple.png and b/src/main/resources/assets/betterend/textures/item/charnia_purple.png differ diff --git a/src/main/resources/assets/betterend/textures/item/charnia_red.png b/src/main/resources/assets/betterend/textures/item/charnia_red.png index 69378b84..bf5cddfa 100644 Binary files a/src/main/resources/assets/betterend/textures/item/charnia_red.png and b/src/main/resources/assets/betterend/textures/item/charnia_red.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png index ebed2b9b..dd74d8c9 100644 Binary files a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png index a40c514a..171777e0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_raw.png differ diff --git a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png index 996f396e..31c20cc7 100644 Binary files a/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png and b/src/main/resources/assets/betterend/textures/item/chorus_mushroom_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/crystalite_boots.png b/src/main/resources/assets/betterend/textures/item/crystalite_boots.png index f8f05112..f5c8a6df 100644 Binary files a/src/main/resources/assets/betterend/textures/item/crystalite_boots.png and b/src/main/resources/assets/betterend/textures/item/crystalite_boots.png differ diff --git a/src/main/resources/assets/betterend/textures/item/crystalite_chestplate.png b/src/main/resources/assets/betterend/textures/item/crystalite_chestplate.png index a23e12b1..98a04754 100644 Binary files a/src/main/resources/assets/betterend/textures/item/crystalite_chestplate.png and b/src/main/resources/assets/betterend/textures/item/crystalite_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/crystalite_helmet.png b/src/main/resources/assets/betterend/textures/item/crystalite_helmet.png index 0bf64398..4ec7bad8 100644 Binary files a/src/main/resources/assets/betterend/textures/item/crystalite_helmet.png and b/src/main/resources/assets/betterend/textures/item/crystalite_helmet.png differ diff --git a/src/main/resources/assets/betterend/textures/item/crystalite_leggings.png b/src/main/resources/assets/betterend/textures/item/crystalite_leggings.png index b9fa7e3c..a54ad9c5 100644 Binary files a/src/main/resources/assets/betterend/textures/item/crystalite_leggings.png and b/src/main/resources/assets/betterend/textures/item/crystalite_leggings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/crystalline_sulphur.png b/src/main/resources/assets/betterend/textures/item/crystalline_sulphur.png index cd352249..20e5c4b4 100644 Binary files a/src/main/resources/assets/betterend/textures/item/crystalline_sulphur.png and b/src/main/resources/assets/betterend/textures/item/crystalline_sulphur.png differ diff --git a/src/main/resources/assets/betterend/textures/item/elytra_armored.png b/src/main/resources/assets/betterend/textures/item/elytra_armored.png index f8dfb88b..93a62632 100644 Binary files a/src/main/resources/assets/betterend/textures/item/elytra_armored.png and b/src/main/resources/assets/betterend/textures/item/elytra_armored.png differ diff --git a/src/main/resources/assets/betterend/textures/item/elytra_armored_broken.png b/src/main/resources/assets/betterend/textures/item/elytra_armored_broken.png index fe2de9a2..009f6aa7 100644 Binary files a/src/main/resources/assets/betterend/textures/item/elytra_armored_broken.png and b/src/main/resources/assets/betterend/textures/item/elytra_armored_broken.png differ diff --git a/src/main/resources/assets/betterend/textures/item/elytra_crystalite.png b/src/main/resources/assets/betterend/textures/item/elytra_crystalite.png index 01f80018..2cc34970 100644 Binary files a/src/main/resources/assets/betterend/textures/item/elytra_crystalite.png and b/src/main/resources/assets/betterend/textures/item/elytra_crystalite.png differ diff --git a/src/main/resources/assets/betterend/textures/item/elytra_crystalite_broken.png b/src/main/resources/assets/betterend/textures/item/elytra_crystalite_broken.png index d568e329..b41df949 100644 Binary files a/src/main/resources/assets/betterend/textures/item/elytra_crystalite_broken.png and b/src/main/resources/assets/betterend/textures/item/elytra_crystalite_broken.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_fish_cooked.png b/src/main/resources/assets/betterend/textures/item/end_fish_cooked.png index 32cebbd8..2e8012ff 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_fish_cooked.png and b/src/main/resources/assets/betterend/textures/item/end_fish_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_lily_seed.png b/src/main/resources/assets/betterend/textures/item/end_lily_seed.png index eb6ec615..347e1919 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_lily_seed.png and b/src/main/resources/assets/betterend/textures/item/end_lily_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_lotus_seed.png b/src/main/resources/assets/betterend/textures/item/end_lotus_seed.png index 351633ab..64dc7dc8 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_lotus_seed.png and b/src/main/resources/assets/betterend/textures/item/end_lotus_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_lotus_sign.png b/src/main/resources/assets/betterend/textures/item/end_lotus_sign.png index 6ff9f25e..a5d42722 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_lotus_sign.png and b/src/main/resources/assets/betterend/textures/item/end_lotus_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png index 9372b7cf..8efa74e7 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png and b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite.png differ diff --git a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png index 478e770d..bfb6042f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png and b/src/main/resources/assets/betterend/textures/item/end_stone_stalactite_cavemoss.png differ diff --git a/src/main/resources/assets/betterend/textures/item/ender_shard.png b/src/main/resources/assets/betterend/textures/item/ender_shard.png index 29b0e054..0f9400c2 100644 Binary files a/src/main/resources/assets/betterend/textures/item/ender_shard.png and b/src/main/resources/assets/betterend/textures/item/ender_shard.png differ diff --git a/src/main/resources/assets/betterend/textures/item/filalux_wings.png b/src/main/resources/assets/betterend/textures/item/filalux_wings.png index e76070b4..6b0ee2a4 100644 Binary files a/src/main/resources/assets/betterend/textures/item/filalux_wings.png and b/src/main/resources/assets/betterend/textures/item/filalux_wings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/flammalix.png b/src/main/resources/assets/betterend/textures/item/flammalix.png new file mode 100644 index 00000000..80de2d85 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/flammalix.png differ diff --git a/src/main/resources/assets/betterend/textures/item/gelatine.png b/src/main/resources/assets/betterend/textures/item/gelatine.png index 75cd82f4..82dc9b9b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/gelatine.png and b/src/main/resources/assets/betterend/textures/item/gelatine.png differ diff --git a/src/main/resources/assets/betterend/textures/item/glowing_bulb.png b/src/main/resources/assets/betterend/textures/item/glowing_bulb.png index 743aa420..3e2f2d26 100644 Binary files a/src/main/resources/assets/betterend/textures/item/glowing_bulb.png and b/src/main/resources/assets/betterend/textures/item/glowing_bulb.png differ diff --git a/src/main/resources/assets/betterend/textures/item/guidebook.png b/src/main/resources/assets/betterend/textures/item/guidebook.png index a1693fd2..be3017a1 100644 Binary files a/src/main/resources/assets/betterend/textures/item/guidebook.png and b/src/main/resources/assets/betterend/textures/item/guidebook.png differ diff --git a/src/main/resources/assets/betterend/textures/item/helix_tree_door.png b/src/main/resources/assets/betterend/textures/item/helix_tree_door.png index c73b180c..52a00f33 100644 Binary files a/src/main/resources/assets/betterend/textures/item/helix_tree_door.png and b/src/main/resources/assets/betterend/textures/item/helix_tree_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/helix_tree_sign.png b/src/main/resources/assets/betterend/textures/item/helix_tree_sign.png index db835722..740cacb6 100644 Binary files a/src/main/resources/assets/betterend/textures/item/helix_tree_sign.png and b/src/main/resources/assets/betterend/textures/item/helix_tree_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/item/hydralux_petal.png b/src/main/resources/assets/betterend/textures/item/hydralux_petal.png index 2d27cea2..a9530d29 100644 Binary files a/src/main/resources/assets/betterend/textures/item/hydralux_petal.png and b/src/main/resources/assets/betterend/textures/item/hydralux_petal.png differ diff --git a/src/main/resources/assets/betterend/textures/item/hydralux_spore.png b/src/main/resources/assets/betterend/textures/item/hydralux_spore.png index 4979bb54..5041dcf0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/hydralux_spore.png and b/src/main/resources/assets/betterend/textures/item/hydralux_spore.png differ diff --git a/src/main/resources/assets/betterend/textures/item/iron_hammer.png b/src/main/resources/assets/betterend/textures/item/iron_hammer.png index 118a9d1a..3dee3871 100644 Binary files a/src/main/resources/assets/betterend/textures/item/iron_hammer.png and b/src/main/resources/assets/betterend/textures/item/iron_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/jungle_fern.png b/src/main/resources/assets/betterend/textures/item/jungle_fern.png index 862e19e1..bbe48955 100644 Binary files a/src/main/resources/assets/betterend/textures/item/jungle_fern.png and b/src/main/resources/assets/betterend/textures/item/jungle_fern.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lanceleaf_seed.png b/src/main/resources/assets/betterend/textures/item/lanceleaf_seed.png index 330ed0fc..2eb3390f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/lanceleaf_seed.png and b/src/main/resources/assets/betterend/textures/item/lanceleaf_seed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/leather_stripe.png b/src/main/resources/assets/betterend/textures/item/leather_stripe.png index ac46074d..0cf28fdc 100644 Binary files a/src/main/resources/assets/betterend/textures/item/leather_stripe.png and b/src/main/resources/assets/betterend/textures/item/leather_stripe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_door.png b/src/main/resources/assets/betterend/textures/item/lucernia_door.png index 5b172d76..24611236 100644 Binary files a/src/main/resources/assets/betterend/textures/item/lucernia_door.png and b/src/main/resources/assets/betterend/textures/item/lucernia_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lucernia_sign.png b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png index 5cb550d8..28c1ee26 100644 Binary files a/src/main/resources/assets/betterend/textures/item/lucernia_sign.png and b/src/main/resources/assets/betterend/textures/item/lucernia_sign.png differ diff --git a/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png b/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png index 5b1d1226..54b8650b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png and b/src/main/resources/assets/betterend/textures/item/lumecorn_rod.png differ diff --git a/src/main/resources/assets/betterend/textures/item/murkweed.png b/src/main/resources/assets/betterend/textures/item/murkweed.png index a5843440..39279a5b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/murkweed.png and b/src/main/resources/assets/betterend/textures/item/murkweed.png differ diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_endseeker.png b/src/main/resources/assets/betterend/textures/item/music_disc_endseeker.png index 8c4ab480..2875300f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/music_disc_endseeker.png and b/src/main/resources/assets/betterend/textures/item/music_disc_endseeker.png differ diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_eo_dracona.png b/src/main/resources/assets/betterend/textures/item/music_disc_eo_dracona.png index a4a91c3f..fd72ed07 100644 Binary files a/src/main/resources/assets/betterend/textures/item/music_disc_eo_dracona.png and b/src/main/resources/assets/betterend/textures/item/music_disc_eo_dracona.png differ diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_grasping_at_stars.png b/src/main/resources/assets/betterend/textures/item/music_disc_grasping_at_stars.png index 7d607c5b..083c42d5 100644 Binary files a/src/main/resources/assets/betterend/textures/item/music_disc_grasping_at_stars.png and b/src/main/resources/assets/betterend/textures/item/music_disc_grasping_at_stars.png differ diff --git a/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png b/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png index a6c84ad4..cc6bdd7f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png and b/src/main/resources/assets/betterend/textures/item/music_disc_strange_and_alien.png differ diff --git a/src/main/resources/assets/betterend/textures/item/netherite_hammer.png b/src/main/resources/assets/betterend/textures/item/netherite_hammer.png index b3dd3071..4c54ece9 100644 Binary files a/src/main/resources/assets/betterend/textures/item/netherite_hammer.png and b/src/main/resources/assets/betterend/textures/item/netherite_hammer.png differ diff --git a/src/main/resources/assets/betterend/textures/item/pond_anemone.png b/src/main/resources/assets/betterend/textures/item/pond_anemone.png index 32414526..6b9dd9f8 100644 Binary files a/src/main/resources/assets/betterend/textures/item/pond_anemone.png and b/src/main/resources/assets/betterend/textures/item/pond_anemone.png differ diff --git a/src/main/resources/assets/betterend/textures/item/purple_polypore.png b/src/main/resources/assets/betterend/textures/item/purple_polypore.png index 9a47237c..44ac7d39 100644 Binary files a/src/main/resources/assets/betterend/textures/item/purple_polypore.png and b/src/main/resources/assets/betterend/textures/item/purple_polypore.png differ diff --git a/src/main/resources/assets/betterend/textures/item/raw_amber.png b/src/main/resources/assets/betterend/textures/item/raw_amber.png index 76295d42..18872298 100644 Binary files a/src/main/resources/assets/betterend/textures/item/raw_amber.png and b/src/main/resources/assets/betterend/textures/item/raw_amber.png differ diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry.png b/src/main/resources/assets/betterend/textures/item/shadow_berry.png index c9ce4614..f23af1bf 100644 Binary files a/src/main/resources/assets/betterend/textures/item/shadow_berry.png and b/src/main/resources/assets/betterend/textures/item/shadow_berry.png differ diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry_cooked.png b/src/main/resources/assets/betterend/textures/item/shadow_berry_cooked.png index 9b0c8389..7771c320 100644 Binary files a/src/main/resources/assets/betterend/textures/item/shadow_berry_cooked.png and b/src/main/resources/assets/betterend/textures/item/shadow_berry_cooked.png differ diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry_jelly.png b/src/main/resources/assets/betterend/textures/item/shadow_berry_jelly.png index 6c12b368..43ad04d5 100644 Binary files a/src/main/resources/assets/betterend/textures/item/shadow_berry_jelly.png and b/src/main/resources/assets/betterend/textures/item/shadow_berry_jelly.png differ diff --git a/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png b/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png index 20afce5b..04bb4dd0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png and b/src/main/resources/assets/betterend/textures/item/shadow_berry_seeds.png differ diff --git a/src/main/resources/assets/betterend/textures/item/silk_fiber.png b/src/main/resources/assets/betterend/textures/item/silk_fiber.png index e8e0dfee..c4d6fccd 100644 Binary files a/src/main/resources/assets/betterend/textures/item/silk_fiber.png and b/src/main/resources/assets/betterend/textures/item/silk_fiber.png differ diff --git a/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png b/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png index c87a1436..69c6f367 100644 Binary files a/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png and b/src/main/resources/assets/betterend/textures/item/silk_moth_matrix.png differ diff --git a/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png b/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png index d4e8c69d..008b1a70 100644 Binary files a/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png and b/src/main/resources/assets/betterend/textures/item/small_amaranita_mushroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png index 4a149bf9..e294a664 100644 Binary files a/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png and b/src/main/resources/assets/betterend/textures/item/small_jellyshroom.png differ diff --git a/src/main/resources/assets/betterend/textures/item/sweet_berry_jelly.png b/src/main/resources/assets/betterend/textures/item/sweet_berry_jelly.png index 4e2ff978..2d5a0050 100644 Binary files a/src/main/resources/assets/betterend/textures/item/sweet_berry_jelly.png and b/src/main/resources/assets/betterend/textures/item/sweet_berry_jelly.png differ diff --git a/src/main/resources/assets/betterend/textures/item/tenanea_door.png b/src/main/resources/assets/betterend/textures/item/tenanea_door.png index dded079f..1f27e1ac 100644 Binary files a/src/main/resources/assets/betterend/textures/item/tenanea_door.png and b/src/main/resources/assets/betterend/textures/item/tenanea_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/tenanea_flowers.png b/src/main/resources/assets/betterend/textures/item/tenanea_flowers.png index 8a968bb6..5a74f541 100644 Binary files a/src/main/resources/assets/betterend/textures/item/tenanea_flowers.png and b/src/main/resources/assets/betterend/textures/item/tenanea_flowers.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png b/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png index 5f65902a..0499e1de 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png and b/src/main/resources/assets/betterend/textures/item/terminite_axe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_boots.png b/src/main/resources/assets/betterend/textures/item/terminite_boots.png index bfc2254a..560dab34 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_boots.png and b/src/main/resources/assets/betterend/textures/item/terminite_boots.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png b/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png index 90f9efd8..d10d2862 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png and b/src/main/resources/assets/betterend/textures/item/terminite_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_door.png b/src/main/resources/assets/betterend/textures/item/terminite_door.png index c5a64524..8fb90b07 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_door.png and b/src/main/resources/assets/betterend/textures/item/terminite_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_forged_plate.png b/src/main/resources/assets/betterend/textures/item/terminite_forged_plate.png index 5b203bbe..1e538400 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_forged_plate.png and b/src/main/resources/assets/betterend/textures/item/terminite_forged_plate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_helmet.png b/src/main/resources/assets/betterend/textures/item/terminite_helmet.png index 3bc9fa08..8aaa6390 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_helmet.png and b/src/main/resources/assets/betterend/textures/item/terminite_helmet.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png index 778f244e..c457aa21 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_hoe.png and b/src/main/resources/assets/betterend/textures/item/terminite_hoe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_ingot.png b/src/main/resources/assets/betterend/textures/item/terminite_ingot.png index 4c0bcfdc..78d8306b 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_ingot.png and b/src/main/resources/assets/betterend/textures/item/terminite_ingot.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png index 18503e47..4bf290a1 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_leggings.png and b/src/main/resources/assets/betterend/textures/item/terminite_leggings.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png index 42a0bbed..72977c3d 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png and b/src/main/resources/assets/betterend/textures/item/terminite_pickaxe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword.png b/src/main/resources/assets/betterend/textures/item/terminite_sword.png index ac4a40df..c8fb1703 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_sword.png and b/src/main/resources/assets/betterend/textures/item/terminite_sword.png differ diff --git a/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png index c4e35d66..cf968a25 100644 Binary files a/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png and b/src/main/resources/assets/betterend/textures/item/terminite_sword_handle.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_axe.png b/src/main/resources/assets/betterend/textures/item/thallasium_axe.png index 9ede4dce..b40443f0 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_axe.png and b/src/main/resources/assets/betterend/textures/item/thallasium_axe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png index 9f89bee0..6b515979 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png and b/src/main/resources/assets/betterend/textures/item/thallasium_chandelier.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png index 562bf4bd..54718c4a 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png and b/src/main/resources/assets/betterend/textures/item/thallasium_chestplate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_door.png b/src/main/resources/assets/betterend/textures/item/thallasium_door.png index a0f3d6ae..d8af2a49 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_door.png and b/src/main/resources/assets/betterend/textures/item/thallasium_door.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_forged_plate.png b/src/main/resources/assets/betterend/textures/item/thallasium_forged_plate.png index 2be7008f..077a1067 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_forged_plate.png and b/src/main/resources/assets/betterend/textures/item/thallasium_forged_plate.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png b/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png index d32687f0..11eeffb9 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png and b/src/main/resources/assets/betterend/textures/item/thallasium_hoe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png index 95c0dcea..cf2599d3 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png and b/src/main/resources/assets/betterend/textures/item/thallasium_ingot.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png index c02927e7..d8eeca65 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png and b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png index dcee9d06..64c1a7c6 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png and b/src/main/resources/assets/betterend/textures/item/thallasium_pickaxe_head.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_raw.png b/src/main/resources/assets/betterend/textures/item/thallasium_raw.png new file mode 100644 index 00000000..a03e9fad Binary files /dev/null and b/src/main/resources/assets/betterend/textures/item/thallasium_raw.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png b/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png index cc09eb41..16deffff 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png and b/src/main/resources/assets/betterend/textures/item/thallasium_shovel.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png index 9a13f796..4e216176 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thallasium_sword.png and b/src/main/resources/assets/betterend/textures/item/thallasium_sword.png differ diff --git a/src/main/resources/assets/betterend/textures/item/thermal fungus.png b/src/main/resources/assets/betterend/textures/item/thermal fungus.png index 201d44e8..bf1056d1 100644 Binary files a/src/main/resources/assets/betterend/textures/item/thermal fungus.png and b/src/main/resources/assets/betterend/textures/item/thermal fungus.png differ diff --git a/src/main/resources/assets/betterend/textures/item/tube_worm.png b/src/main/resources/assets/betterend/textures/item/tube_worm.png index e0ba37bc..6159c290 100644 Binary files a/src/main/resources/assets/betterend/textures/item/tube_worm.png and b/src/main/resources/assets/betterend/textures/item/tube_worm.png differ diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png index 7bcb1773..c250f97f 100644 Binary files a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png and b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_large.png differ diff --git a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png index 67383d2d..36c8cb23 100644 Binary files a/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png and b/src/main/resources/assets/betterend/textures/item/twisted_umbrella_moss_small.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png index 0a0287e8..ca84f426 100644 Binary files a/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png and b/src/main/resources/assets/betterend/textures/item/umbrella_cluster_juice.png differ diff --git a/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png b/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png index 3d877603..f1a9991c 100644 Binary files a/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png and b/src/main/resources/assets/betterend/textures/item/umbrella_tree_door.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png index ac048eec..3a44e5d3 100644 Binary files a/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png and b/src/main/resources/assets/betterend/textures/minimap/entities/cubozoa.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png index f3a11e2c..38bc39ea 100644 Binary files a/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png and b/src/main/resources/assets/betterend/textures/minimap/entities/dragonfly.png differ diff --git a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png index fb1a6fb9..ad0e9901 100644 Binary files a/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png and b/src/main/resources/assets/betterend/textures/minimap/entities/silk_moth.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_0.png b/src/main/resources/assets/betterend/textures/particle/black_spore_0.png index 082b3b48..02eaee9e 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_0.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_0.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_1.png b/src/main/resources/assets/betterend/textures/particle/black_spore_1.png index aba5d1a7..d3c98306 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_1.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_1.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_2.png b/src/main/resources/assets/betterend/textures/particle/black_spore_2.png index 28b28a3a..a0402bf7 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_2.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_2.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_3.png b/src/main/resources/assets/betterend/textures/particle/black_spore_3.png index d8aae095..5251be4e 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_3.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_3.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_4.png b/src/main/resources/assets/betterend/textures/particle/black_spore_4.png index 2f42081e..bc5533ce 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_4.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_4.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/black_spore_5.png b/src/main/resources/assets/betterend/textures/particle/black_spore_5.png index 322baa2f..00d7ea61 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/black_spore_5.png and b/src/main/resources/assets/betterend/textures/particle/black_spore_5.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png index 5360abcc..d911a8e3 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png and b/src/main/resources/assets/betterend/textures/particle/jungle_spore_0.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png index 1bba4714..eefe522e 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_1.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png index 24c8cac1..7b380f5e 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_2.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png index bbcc0ea7..e28ab943 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_3.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png index dcd27226..30fabf74 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_4.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png index 4e2c8f6a..b50f6dee 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_5.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png index 4da3d9f4..4086c0dd 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_6.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png index 5dbe73a5..bbf170de 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_7.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png index a0906550..e7530ac3 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_8.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png index 86e14dd1..3ca20b49 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png and b/src/main/resources/assets/betterend/textures/particle/smaragdant_particle_9.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_0.png b/src/main/resources/assets/betterend/textures/particle/snowflake_0.png index fcdabe94..3727e7ae 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_0.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_0.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_1.png b/src/main/resources/assets/betterend/textures/particle/snowflake_1.png index da249eb9..489df309 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_1.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_1.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_2.png b/src/main/resources/assets/betterend/textures/particle/snowflake_2.png index f0d26b8e..043cc55d 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_2.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_2.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_3.png b/src/main/resources/assets/betterend/textures/particle/snowflake_3.png index 53487c10..d8e231f5 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_3.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_3.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_4.png b/src/main/resources/assets/betterend/textures/particle/snowflake_4.png index bc5b3637..e55cf76b 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_4.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_4.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_5.png b/src/main/resources/assets/betterend/textures/particle/snowflake_5.png index d2e86d47..454a1117 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_5.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_5.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/snowflake_6.png b/src/main/resources/assets/betterend/textures/particle/snowflake_6.png index da249eb9..489df309 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/snowflake_6.png and b/src/main/resources/assets/betterend/textures/particle/snowflake_6.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/tenanea_petal_0.png b/src/main/resources/assets/betterend/textures/particle/tenanea_petal_0.png index 253203cb..b2c1fdce 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/tenanea_petal_0.png and b/src/main/resources/assets/betterend/textures/particle/tenanea_petal_0.png differ diff --git a/src/main/resources/assets/betterend/textures/particle/tenanea_petal_1.png b/src/main/resources/assets/betterend/textures/particle/tenanea_petal_1.png index 31fa92f3..b56fca7c 100644 Binary files a/src/main/resources/assets/betterend/textures/particle/tenanea_petal_1.png and b/src/main/resources/assets/betterend/textures/particle/tenanea_petal_1.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/fog.png b/src/main/resources/assets/betterend/textures/sky/fog.png index 4c6cfd0c..54583ffd 100644 Binary files a/src/main/resources/assets/betterend/textures/sky/fog.png and b/src/main/resources/assets/betterend/textures/sky/fog.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/nebula_1.png b/src/main/resources/assets/betterend/textures/sky/nebula_1.png index 19f8cb1c..3cbd9c12 100644 Binary files a/src/main/resources/assets/betterend/textures/sky/nebula_1.png and b/src/main/resources/assets/betterend/textures/sky/nebula_1.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/nebula_2.png b/src/main/resources/assets/betterend/textures/sky/nebula_2.png index 07a08ef8..bb21f563 100644 Binary files a/src/main/resources/assets/betterend/textures/sky/nebula_2.png and b/src/main/resources/assets/betterend/textures/sky/nebula_2.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/nebula_3.png b/src/main/resources/assets/betterend/textures/sky/nebula_3.png index 8f79123b..8d0779c8 100644 Binary files a/src/main/resources/assets/betterend/textures/sky/nebula_3.png and b/src/main/resources/assets/betterend/textures/sky/nebula_3.png differ diff --git a/src/main/resources/assets/betterend/textures/sky/stars.png b/src/main/resources/assets/betterend/textures/sky/stars.png index 642cc0e3..dfe50cb8 100644 Binary files a/src/main/resources/assets/betterend/textures/sky/stars.png and b/src/main/resources/assets/betterend/textures/sky/stars.png differ diff --git a/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar.png b/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar.png index c7f1cacc..eb431bca 100644 Binary files a/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar.png and b/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar.png differ diff --git a/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar_end.png b/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar_end.png index b13aa044..d1e9151e 100644 Binary files a/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar_end.png and b/src/main/resources/assets/bewitchment/textures/block/purpur_witch_altar_end.png differ diff --git a/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png b/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png index 44217c51..17007010 100644 Binary files a/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png and b/src/main/resources/assets/blockus/textures/block/chiseled_purpur.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_bricks.png b/src/main/resources/assets/blockus/textures/block/purpur_bricks.png index 2a6b681b..89ad8e15 100644 Binary files a/src/main/resources/assets/blockus/textures/block/purpur_bricks.png and b/src/main/resources/assets/blockus/textures/block/purpur_bricks.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_lines.png b/src/main/resources/assets/blockus/textures/block/purpur_lines.png index 8525a8a8..2c43e75e 100644 Binary files a/src/main/resources/assets/blockus/textures/block/purpur_lines.png and b/src/main/resources/assets/blockus/textures/block/purpur_lines.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png b/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png index 29640aad..e7cab518 100644 Binary files a/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png and b/src/main/resources/assets/blockus/textures/block/purpur_little_bricks.png differ diff --git a/src/main/resources/assets/blockus/textures/block/purpur_squares.png b/src/main/resources/assets/blockus/textures/block/purpur_squares.png index 11cba257..3aac01f2 100644 Binary files a/src/main/resources/assets/blockus/textures/block/purpur_squares.png and b/src/main/resources/assets/blockus/textures/block/purpur_squares.png differ diff --git a/src/main/resources/assets/blockus/textures/block/smooth_purpur.png b/src/main/resources/assets/blockus/textures/block/smooth_purpur.png index a6e571b3..3baca3eb 100644 Binary files a/src/main/resources/assets/blockus/textures/block/smooth_purpur.png and b/src/main/resources/assets/blockus/textures/block/smooth_purpur.png differ diff --git a/src/main/resources/assets/byg/textures/block/purpur_stone.png b/src/main/resources/assets/byg/textures/block/purpur_stone.png index 31306e84..61e671dc 100644 Binary files a/src/main/resources/assets/byg/textures/block/purpur_stone.png and b/src/main/resources/assets/byg/textures/block/purpur_stone.png differ diff --git a/src/main/resources/assets/colored_lights/light_colors.json b/src/main/resources/assets/colored_lights/light_colors.json new file mode 100644 index 00000000..27a890de --- /dev/null +++ b/src/main/resources/assets/colored_lights/light_colors.json @@ -0,0 +1,91 @@ +{ + "replace": false, + "colors": { + "betterend:smaragdant_crystal": "#17cfbd", + "betterend:smaragdant_crystal_shard": "#17cfbd", + "betterend:smaragdant_crystal_shard": "#17cfbd", + "betterend:smaragdant_crystal_bricks": "#17cfbd", + "betterend:smaragdant_crystal_bricks_slab": "#17cfbd", + "betterend:smaragdant_crystal_bricks_stairs": "#17cfbd", + "betterend:smaragdant_crystal_bricks_wall": "#17cfbd", + "betterend:smaragdant_crystal_pedestal": "#17cfbd", + "betterend:smaragdant_crystal_pillar": "#17cfbd", + "betterend:smaragdant_crystal_polished": "#17cfbd", + "betterend:smaragdant_crystal_slab": "#17cfbd", + "betterend:smaragdant_crystal_stairs": "#17cfbd", + "betterend:smaragdant_crystal_tiles": "#17cfbd", + "betterend:smaragdant_crystal_wall": "#17cfbd", + "betterend:aurora_crystal": "#f74da1", + "betterend:mossy_glowshroom_fur": "#8be6ff", + "betterend:mossy_glowshroom_hymenophore": "#8be6ff", + "betterend:umbrella_tree_cluster": "#c054f9", + "betterend:umbrella_tree_cluster": "#c054f9", + "betterend:umbrella_moss": "#ff943e", + "betterend:umbrella_moss_tall": "#ff943e", + "betterend:creeping_moss": "#0de4fc", + "betterend:twisted_umbrella_moss": "#e045d0", + "betterend:twisted_umbrella_moss_tall": "#e045d0", + "betterend:glowing_pillar_luminophor": "#ffd96c", + "betterend:glowing_pillar_leaves": "#ffd96c", + "betterend:bulb_moss": "#ffd96c", + "betterend:blue_vine_lantern": "#a6effb", + "betterend:blue_vine_fur": "#a6effb", + "betterend:purple_polypore": "#c53aec", + "betterend:aurant_polypore": "#a2d9ff", + "betterend:end_lily": "#c27dff", + "betterend:dense_vine": "#f47ffc", + "betterend:pond_anemone": "#f1f0da", + "betterend:amaranita_lantern": "#baecd9", + "betterend:amaranita_fur": "#baecd9", + + "betterend:neon_cactus": "#86f0e7", + "betterend:neon_cactus_block": "#86f0e7", + "betterend:neon_cactus_stairs": "#86f0e7", + "betterend:neon_cactus_slab": "#86f0e7", + + "betterend:iron_bulb_lantern_orange": "#ff963c", + "betterend:iron_bulb_lantern_magenta": "#d25aff", + "betterend:iron_bulb_lantern_light_blue": "#78b5ff", + "betterend:iron_bulb_lantern_yellow": "#ffff39", + "betterend:iron_bulb_lantern_lime": "#9fff1f", + "betterend:iron_bulb_lantern_pink": "#ff86ae", + "betterend:iron_bulb_lantern_cyan": "#7fd4ff", + "betterend:iron_bulb_lantern_purple": "#b65aff", + "betterend:iron_bulb_lantern_blue": "#496dff", + "betterend:iron_bulb_lantern_brown": "#ffbe80", + "betterend:iron_bulb_lantern_green": "#cdff66", + "betterend:iron_bulb_lantern_red": "#ff5555", + + "betterend:thallasium_bulb_lantern_orange": "#ff963c", + "betterend:thallasium_bulb_lantern_magenta": "#d25aff", + "betterend:thallasium_bulb_lantern_light_blue": "#78b5ff", + "betterend:thallasium_bulb_lantern_yellow": "#ffff39", + "betterend:thallasium_bulb_lantern_lime": "#9fff1f", + "betterend:thallasium_bulb_lantern_pink": "#ff86ae", + "betterend:thallasium_bulb_lantern_cyan": "#7fd4ff", + "betterend:thallasium_bulb_lantern_purple": "#b65aff", + "betterend:thallasium_bulb_lantern_blue": "#496dff", + "betterend:thallasium_bulb_lantern_brown": "#ffbe80", + "betterend:thallasium_bulb_lantern_green": "#cdff66", + "betterend:thallasium_bulb_lantern_red": "#ff5555", + + "betterend:terminite_bulb_lantern_orange": "#ff963c", + "betterend:terminite_bulb_lantern_magenta": "#d25aff", + "betterend:terminite_bulb_lantern_light_blue": "#78b5ff", + "betterend:terminite_bulb_lantern_yellow": "#ffff39", + "betterend:terminite_bulb_lantern_lime": "#9fff1f", + "betterend:terminite_bulb_lantern_pink": "#ff86ae", + "betterend:terminite_bulb_lantern_cyan": "#7fd4ff", + "betterend:terminite_bulb_lantern_purple": "#b65aff", + "betterend:terminite_bulb_lantern_blue": "#496dff", + "betterend:terminite_bulb_lantern_brown": "#ffbe80", + "betterend:terminite_bulb_lantern_green": "#cdff66", + "betterend:terminite_bulb_lantern_red": "#ff5555", + + "betterend:thallasium_chandelier": "#e0fceb", + "betterend:terminite_chandelier": "#e0fceb", + "betterend:iron_chandelier": "#e0fceb", + "betterend:gold_chandelier": "#e0fceb", + "betterend:lumecorn": "#e0fceb" + } +} diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png index 1b08edf3..e35e0e30 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png index 87d5d00d..f8b1f0fb 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png index 135782d0..fffc947a 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png index f757688d..ef365d77 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png index 8903c2dd..a447bf70 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png index 6439f421..ff96ff52 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png index 6ebfa407..f2f65591 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png index dc7d4bc3..59f292b8 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png index f3abcfc0..7442be04 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png index 972d93e4..c735c575 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png index 7087d639..c2e95e6f 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png index 5ecf596c..50ccf0a4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png index a596289d..e7f21a15 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png index ef8eb740..3705b251 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png index 59ebd87b..c97104f4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png index 2c6a6ab9..ec938419 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png index f4b2e314..d4eca12d 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/00_cave_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png index 66489430..b3db56d3 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png index afad59e1..0605e3a3 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png index 17f87ab2..41926be9 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png index ff076b69..802efb30 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png index 66afd0b7..0b69d778 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png index 4bc3438d..fa76fce5 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png index d07298d1..d9170d41 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png index bb838314..39e9fab4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png index 3a2e30bd..4bab73b4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png index 1e27b8bd..1c43f1bc 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png index b3e34e3e..3608f6d0 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png index c342d455..83b283eb 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png index fee7f640..522ada94 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png index a6642af1..aba464e8 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png index f06882d1..9b312c36 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png index 1f7a4c21..94f2c43e 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png index fa92f732..824b7ebc 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/01_end_mycelium/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png index cf819bb8..465d5358 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png index bc01affc..801faafd 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png index effc7384..fd8e7d17 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png index 30af3a9d..c22ce00f 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png index 0b74ea00..c2710df1 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png index bb1198e4..30f6aba6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png index eab2989c..a0f03d2c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png index e888cb2d..738c9da9 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png index d621f44d..9bfc4986 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png index fe25e341..8fdcc355 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png index 5eef4cad..748a1aad 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png index b1d24587..4ea91ed7 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png index dd439534..1d19f8e0 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png index aff99fbb..044a5ba4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png index decc1df6..0c455d64 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png index 3539ffee..9bd4e667 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png index 19456c06..85a9d7a2 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/02_shadow_grass/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png index 0e8a30b8..e8e22abf 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png index a279ef34..ca0324af 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png index 8f213540..cbedd02c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png index 3e2f8e4f..9e411cbd 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png index 7ac8e31f..137f7005 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png index 7e146564..aa0e6724 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png index db2cbf58..0247631c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png index a9c0943b..766f65e7 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png index 03fb198b..ca7445f0 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png index c298da04..8fd26cfd 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png index b3aab034..34a8f1b2 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png index 3d319553..c69de7e8 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png index 8a49840f..7edf53a1 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png index a338a2e9..a3a54f27 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png index faf95c26..4fc10095 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png index 80bc0611..7a864223 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png index 87bb5c50..892730d8 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/03_pink_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png index 057d32f9..c7ce97eb 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png index 9594e510..ad5ae8b6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png index 732e8e8a..d8f0cb1f 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png index ddc6c4e9..15338b50 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png index 7373cf41..bb282269 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png index 65761543..ba7f8862 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png index 4d49254f..bab62dfa 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png index dba78f68..ae07790e 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png index 112d9b5c..f0dbcdb4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png index 9279002d..9c685e7b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png index f50499f0..e12468a9 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png index 9f8bed30..e811f505 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png index a4365c8a..14426459 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png index 9ebf8e71..b5d78b6a 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png index cc2d5b7a..dd9ef897 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png index af2b1b2f..59c827c4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png index fa238e33..1261fea2 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/04_crystal_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png index 8e3d4cf1..f4627524 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png index 83823914..ab7e5acb 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png index f623c7bd..35bfd8fc 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png index bef6508c..46f56d24 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png index 6e9b01bb..e5e7653b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png index 82fc46bb..a726a29d 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png index 42c137e2..bb715e9b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png index b9dcf33b..7dfc8b2c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png index c0393d14..4e650050 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png index f392e546..25d449ab 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png index c9ba7fc2..afc94eb6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png index ea9eec42..45d760c7 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png index e310bbba..9a87e827 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png index 489a5a54..a8c1df6c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png index 9bc9721c..2cb304e3 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png index 49794325..f905aade 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png index 434b7583..afe52a24 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/05_chorus_nylium/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png index 2a25ff4e..a03ee9fa 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png index b2a070a8..690e721b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png index f0ae41cd..77f674d8 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png index bd38bc7a..4521db24 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png index 09de79e7..7b98c48e 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png index 1d506846..f1112101 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png index 032f429d..bf3d3ecf 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png index a31f1211..dbbdf295 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png index 574f4558..e766d0d1 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png index 7d5bcb39..caf58486 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png index 19214a1b..d4c8417d 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png index cde72ff0..ed389ea9 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png index 28aa99ee..9b30d8cc 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png index 9d190d75..d552e74d 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png index 19041ceb..bed058cb 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png index 9fbfc238..a9286d3d 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png index 14fdd580..3788424e 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/06_end_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png index 8db7ca1f..1c7a1419 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png index 54eeb8c0..3a1ad64f 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png index a3218431..200ad38a 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png index b3a93ac7..71e680e4 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png index 1b2d4715..9eb57038 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png index 3998baf8..afeac637 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png index 21a2a1d9..a3cd5fb3 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png index 1aa8e0be..31a7e901 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png index 51651b61..556d1171 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png index fd9ca0bb..f5cf4f71 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png index a62a37e5..101b9e62 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png index 236fc41e..cc6315e6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png index 78df1b23..54aec74c 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png index 13177059..a1722234 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png index 0828a363..fa6c59fa 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png index 84c01406..f746c58b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png index 36a53fdb..a48f14f7 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/07_jungle_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png index 825c5a61..64a79612 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/0.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png index ffcddb8b..f668523a 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/1.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png index 95ae3e9b..0bf9f4aa 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/10.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png index 61a75bc8..7df0bdd2 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/11.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png index d6a962bf..cd6ab240 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/12.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png index bf7e550d..db816de0 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/13.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png index 17ddf5d3..575e0622 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/14.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png index bae0ee46..fdca200b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/15.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png index cc1dfd7d..bb054f68 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/16.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png index 15620fc3..02657aaa 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/2.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png index becaaa5b..c2427c79 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/3.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png index abe4f264..b939f32b 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/4.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png index f556156b..7f737726 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/5.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png index 987fbde5..74395dd6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/6.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png index be6227d8..67f93834 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/7.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png index 8f0a7609..a020e139 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/8.png differ diff --git a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png index e8b707d4..d3c12ed6 100644 Binary files a/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png and b/src/main/resources/assets/minecraft/optifine/ctm/_overlays/08_amber_moss/9.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/andesite_pillar.png b/src/main/resources/assets/minecraft/textures/block/andesite_pillar.png index c6af95fc..8d71ded8 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/andesite_pillar.png and b/src/main/resources/assets/minecraft/textures/block/andesite_pillar.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/diorite_pillar.png b/src/main/resources/assets/minecraft/textures/block/diorite_pillar.png index 3da66679..bed31af4 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/diorite_pillar.png and b/src/main/resources/assets/minecraft/textures/block/diorite_pillar.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/granite_pillar.png b/src/main/resources/assets/minecraft/textures/block/granite_pillar.png index 2e1e0541..c3fbfdda 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/granite_pillar.png and b/src/main/resources/assets/minecraft/textures/block/granite_pillar.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/purpur_block.png b/src/main/resources/assets/minecraft/textures/block/purpur_block.png index 361c099a..4b12900a 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/purpur_block.png and b/src/main/resources/assets/minecraft/textures/block/purpur_block.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/purpur_pillar.png b/src/main/resources/assets/minecraft/textures/block/purpur_pillar.png index 6047dc55..4113a913 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/purpur_pillar.png and b/src/main/resources/assets/minecraft/textures/block/purpur_pillar.png differ diff --git a/src/main/resources/assets/minecraft/textures/block/purpur_pillar_top.png b/src/main/resources/assets/minecraft/textures/block/purpur_pillar_top.png index df441003..a2a4e774 100644 Binary files a/src/main/resources/assets/minecraft/textures/block/purpur_pillar_top.png and b/src/main/resources/assets/minecraft/textures/block/purpur_pillar_top.png differ diff --git a/src/main/resources/assets/minecraft/textures/entity/shulker/shulker.png b/src/main/resources/assets/minecraft/textures/entity/shulker/shulker.png index 9c2b811c..49d633c9 100644 Binary files a/src/main/resources/assets/minecraft/textures/entity/shulker/shulker.png and b/src/main/resources/assets/minecraft/textures/entity/shulker/shulker.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png index f6051cad..69da1276 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png index cc99c6b5..ee2caadf 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png index 5019c1ce..324011ce 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png index 26bda1e9..effa931f 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png index 42b159fe..0f954570 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png index 692a470d..6654b4fc 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/crystalite_overlay_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png index b2ba4409..85623658 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png index c4711e2d..b609bf78 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png index 228612cf..7517e1fb 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png index 9d1f79b1..75f6cbaf 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/thallasium_layer_2.png differ diff --git a/src/main/resources/betterend.accesswidener b/src/main/resources/betterend.accesswidener new file mode 100644 index 00000000..1c8e98af --- /dev/null +++ b/src/main/resources/betterend.accesswidener @@ -0,0 +1,4 @@ +accessWidener v1 named + +# Classes +accessible class net/minecraft/world/level/levelgen/SurfaceRules$SurfaceRule diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 084bbab4..1ce18df4 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -2,23 +2,20 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.client", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "client": [ "AbstractSoundInstanceAccessor", - "ClientPlayNetworkHandlerMixin", - "HumanoidMobRendererMixin", - "ArmorStandRendererMixin", - "ClientRecipeBookMixin", + "HumanoidMobRendererMixin", + "ArmorStandRendererMixin", "MinecraftClientMixin", - "PlayerRendererMixin", - "WorldRendererMixin", + "PlayerRendererMixin", "MusicTrackerMixin", - "AnvilScreenMixin", "BiomeColorsMixin", + "LocalPlayerMixin", "ModelLoaderMixin", - "LocalPlayerMixin", - "CapeLayerMixin", - "ItemStackMixin" + "EndEffectsMixin", + "CapeLayerMixin", + "ItemStackMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index e4d533ea..c92e2fc1 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -2,30 +2,26 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.common", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "mixins": [ - "BiomeGenerationSettingsAccessor", - "NoiseBasedChunkGeneratorMixin", - "ChunkBiomeContainerMixin", - "WeightedBiomePickerMixin", "ChorusPlantFeatureMixin", "PlayerAdvancementsMixin", "ChorusFlowerBlockMixin", - "ComposterBlockAccessor", + "StructureFeaturesMixin", + "NoiseInterpolatorMixin", "ChorusPlantBlockMixin", "EndPodiumFeatureMixin", - "PotionBrewingAccessor", - "MinecraftServerMixin", "EndDragonFightMixin", + "WorldGenRegionMixin", "BlockBehaviourMixin", + "NoiseChunkAccessor", "DimensionTypeMixin", "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", - "SpikeFeatureMixin", + "SpikeFeatureMixin", "ServerLevelMixin", - "PlayerListMixin", - "AnvilMenuMixin", + "NoiseChunkMixin", "EnderManMixin", "EndSpikeMixin", "MonsterMixin", diff --git a/src/main/resources/betterend.mixins.shadow.json b/src/main/resources/betterend.mixins.shadow.json new file mode 100644 index 00000000..08955be4 --- /dev/null +++ b/src/main/resources/betterend.mixins.shadow.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "shadow.fabric.mixin.client.rendering", + "compatibilityLevel": "JAVA_16", + "client": [ + "MixinArmorFeatureRenderer", + "MixinItem" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/chorus_forest.json b/src/main/resources/data/betterend/loot_tables/chests/chorus_forest.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/chorus_forest.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/common.json b/src/main/resources/data/betterend/loot_tables/chests/common.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/common.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/foggy_mushroomland.json b/src/main/resources/data/betterend/loot_tables/chests/foggy_mushroomland.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/foggy_mushroomland.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/lantern_woods.json b/src/main/resources/data/betterend/loot_tables/chests/lantern_woods.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/lantern_woods.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/shadow_forest.json b/src/main/resources/data/betterend/loot_tables/chests/shadow_forest.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/shadow_forest.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/loot_tables/chests/umbrella_jungle.json b/src/main/resources/data/betterend/loot_tables/chests/umbrella_jungle.json new file mode 100644 index 00000000..c135faf3 --- /dev/null +++ b/src/main/resources/data/betterend/loot_tables/chests/umbrella_jungle.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:chest", + "pools": [] +} diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json new file mode 100644 index 00000000..26fc50b9 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json @@ -0,0 +1,5 @@ +{ + "name": "Biome", + "description": "Bald verfügabr...", + "icon": "betterend:end_mycelium" +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json new file mode 100644 index 00000000..1b0b44fb --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json @@ -0,0 +1,6 @@ +{ + "name": "Crafting", + "description": "Bald verfügabr...", + "icon": "betterend:iron_hammer", + "sortnum": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json new file mode 100644 index 00000000..fc2d51d3 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json @@ -0,0 +1,6 @@ +{ + "name": "Endschleier", + "description": "Schaue den Enderman ohne Furcht tief in die Augen.", + "icon": "betterend:textures/mob_effect/end_veil.png", + "sortnum": 3 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json new file mode 100644 index 00000000..308b16fc --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json @@ -0,0 +1,6 @@ +{ + "name": "Rituale", + "description": "Mystische Künste aus dem End. Diese in der Oberwelt lang vergessenen Rituale eröffnen Dir neue Wege und Möglichkeiten.", + "icon": "betterend:infusion_pedestal", + "sortnum": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json new file mode 100644 index 00000000..c093f043 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json @@ -0,0 +1,44 @@ +{ + "name": "Rituale der Ewigkeit", + "icon": "betterend:eternal_pedestal", + "read_by_default": true, + "category": "betterend:rituals", + "pages": [ + { + "type": "text", + "text": "\"Ein steiniger Weg zurück in die Oberwelt.\"$(br2)Auf Deinen Reisen durch das End wirst du gelegentlich alte Ruinen finden.$(br2)Alte Mythen erzählen von einem (vielleicht schon) zerstörten Rahme aus $(bold)Flavolitrune$(), der von sechs Sockeln umringt ist." + }, + { + "type": "image", + "text": "", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_structure.png" + ] + }, + { + "type": "text", + "text": "Es sind die letzte überbleibsel eines majestätischen Protals, dass einst eine Pforte zwischen der Oberwelt und dem End bildete.$(br2)Um das Protal wieder zum leben zu erwecken, musst Du zuerst die Teile des Rahmens finden und vervollständigen." + }, + { + "type": "image", + "text": "Platziere dann 6 $(bold)Ewige Kristalle$() auf den Sockeln.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_frame_full.png" + ] + }, + { + "type": "image", + "text": "Sobald der letzte Kirstall paltziert wurde,", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/ritual_finished.png" + ] + }, + { + "type": "text", + "text": "wird das Portal aus seinem Schlummer erwachen und die Welten verbinden. Die $(bold)Flavolitrune$() (um den Rahmen zu reparieren) und die $(bold)Ewige Kristalle$() können durch ein $(l:rituals/infusion_ritual)Infusionsritual$(/l) erschaffen werden." + } + ] +} diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json new file mode 100644 index 00000000..df3583ed --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json @@ -0,0 +1,64 @@ +{ + "name": "Elementarritual", + "icon": "betterend:infusion_pedestal", + "read_by_default": true, + "category": "betterend:rituals", + "pages": [ + { + "type": "text", + "text": "Hauche deinen Gegenständen die Macht der Elemente ein." + }, + { + "type": "crafting", + "title": "Der Ritualplatz", + "text": "Zuerst musst Du einen $(bold)Elementarsockel$() sowie 8 weitere Sockel eines $(bold)beliebigen$() Typs herstellen.", + "recipe": "betterend:infusion_pedestal" + }, + { + "type": "image", + "text": "Stelle den Elementarsockel umringt von den restlichen Sockeln (Abb. 2) auf.", + "border": true, + "images": [ + "betterend:textures/images/infusion_ritual/infusion_ritual_start.png", + "betterend:textures/images/infusion_ritual/infusion_ritual_full.png" + ] + }, + { + "type": "image", + "title": "Verschmelzen", + "text": "Damit ist der Ritualplatz fertig, und kann verwendet werden.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_structure.png" + ] + }, + { + "type": "image", + "text": "Setzte den Hauptwirkstoff umringt von den Katalysatoren", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_ready.png" + ] + }, + { + "type": "text", + "text": "auf den $(bold)Elementarsockel$().$(br2)Alle möglichen Rezepte findest du zum Beispiel mit $(l:https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items)REI$(/l).$(br2)Um den Prozess zu starten, plaziere den Hauptwirkstoff zuletzt oder klicke den $(bold)Elementarsockel$() mit der rechten Moustaste an." + }, + { + "type": "image", + "text": "Die Sockel verschmelzen nun die Zutaten. ", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_started.png" + ] + }, + { + "type": "image", + "text": "Nach einer kurzen Zeit sind die Katalysatoren verbraucht und das Ritual ist beendet.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_finished.png" + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json index dc587602..596563f9 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json @@ -2,7 +2,7 @@ "name": "Eternal Ritual", "icon": "betterend:eternal_pedestal", "read_by_default": true, - "category": "rituals", + "category": "betterend:rituals", "pages": [ { "type": "text", diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json index a588ebf8..da553170 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json @@ -2,7 +2,7 @@ "name": "Infusion Ritual", "icon": "betterend:infusion_pedestal", "read_by_default": true, - "category": "rituals", + "category": "betterend:rituals", "pages": [ { "type": "text", diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/biomes.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/biomes.json new file mode 100644 index 00000000..d0d81f6c --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/biomes.json @@ -0,0 +1,5 @@ +{ + "name": "Biomas", + "description": "En progreso...", + "icon": "betterend:end_mycelium" +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/crafting.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/crafting.json new file mode 100644 index 00000000..6faeb86e --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/crafting.json @@ -0,0 +1,6 @@ +{ + "name": "Crafteo", + "description": "", + "icon": "betterend:iron_hammer", + "sortnum": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/end_veil.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/end_veil.json new file mode 100644 index 00000000..0632316e --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/end_veil.json @@ -0,0 +1,6 @@ +{ + "name": "Velo del End", + "description": "Mira sin temor a los ojos de los Enderman.", + "icon": "betterend:textures/mob_effect/end_veil.png", + "sortnum": 3 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/rituals.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/rituals.json new file mode 100644 index 00000000..9e5cbe82 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/categories/rituals.json @@ -0,0 +1,6 @@ +{ + "name": "Rituales", + "description": "El místico arte del End, ritales secretos que abren nuevos caminos y oportunidades.", + "icon": "betterend:infusion_pedestal", + "sortnum": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/eternal_ritual.json new file mode 100644 index 00000000..ce0d520e --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/eternal_ritual.json @@ -0,0 +1,44 @@ +{ + "name": "Ritual Eterno", + "icon": "betterend:eternal_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "\"Una manera no tan simple de volver al Overworld.\"$(br2)Mientras viajas por el mundo del End, puedes encontrar ruinas antiguas." + }, + { + "type": "image", + "text": "Hay un marco destruido (o no) de $(bold)Flavolita de Runa$() y 6 pedestales alrededor suya.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_structure.png" + ] + }, + { + "type": "text", + "text": "Estos son los restos de portales majestuosos que en algún momento enlazaban los mundos del End y del Overworld.$(br2)Para activar el portal necesitas reconstruir el marco (si está roto)." + }, + { + "type": "image", + "text": "Y colocar 6 $(bold)Cristales Eternos$() en los pedestales.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_frame_full.png" + ] + }, + { + "type": "image", + "text": "Después de que hayas colocado el último cristal, el portal será activado.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/ritual_finished.png" + ] + }, + { + "type": "text", + "text": "$(bold)Flavolita de Runa$() (para reconstruir el marco) y $(bold)Cristales Eternos$() pueden ser obtenidos por $(l:rituals/infusion_ritual)Ritual de Infusión$(/l)." + } + ] +} diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/infusion_ritual.json new file mode 100644 index 00000000..5a6cde5c --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/es_es/entries/rituals/infusion_ritual.json @@ -0,0 +1,64 @@ +{ + "name": "Ritual de Infusión", + "icon": "betterend:infusion_pedestal", + "read_by_default": true, + "category": "rituals", + "pages": [ + { + "type": "text", + "text": "Infunde objetos con el poder de los elementos." + }, + { + "type": "crafting", + "title": "Preparar la estructura", + "text": "Primero, deberás craftear $(bold)Pedestal de Infusión$() y 8 pedestales de $(bold)cualquier$() otro tipo.", + "recipe": "betterend:infusion_pedestal" + }, + { + "type": "image", + "text": "Luego debes de colocar el Pedestal de Infusión en el centro y los otros pedestales alrededor.", + "border": true, + "images": [ + "betterend:textures/images/infusion_ritual/infusion_ritual_start.png", + "betterend:textures/images/infusion_ritual/infusion_ritual_full.png" + ] + }, + { + "type": "image", + "title": "Infusión", + "text": "Cuando la estructura para el ritual esté lista puedes empezar la infusión.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_structure.png" + ] + }, + { + "type": "image", + "text": "Coloca el ingrediente principal en el $(bold)Pedestal de Infusión$() y cataliza los otros.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_ready.png" + ] + }, + { + "type": "text", + "text": "Puedes mirar recetas en el $(l:https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items)REI$(/l).$(br2)Para empezar la Infusión coloca el ingrediente principal al final o dale clic derecho al $(bold)Pedestal de Infusión$()." + }, + { + "type": "image", + "text": "Entonces debes de esperar hasta que el ritual termine.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_started.png" + ] + }, + { + "type": "image", + "text": "Y obtén el resultado.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_finished.png" + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_1.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_1.nbt new file mode 100644 index 00000000..da0d98d1 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_2.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_2.nbt new file mode 100644 index 00000000..cbcad4f5 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/house_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/jellyshroom_cluster.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/jellyshroom_cluster.nbt new file mode 100644 index 00000000..c20d8cf4 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/jellyshroom_cluster.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_1.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_1.nbt new file mode 100644 index 00000000..cba96af8 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_1.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_2.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_2.nbt new file mode 100644 index 00000000..3082767d Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_2.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_3.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_3.nbt new file mode 100644 index 00000000..8528b77a Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_3.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_4.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_4.nbt new file mode 100644 index 00000000..af5967d1 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_4.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_5.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_5.nbt new file mode 100644 index 00000000..7f22a0b3 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_5.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_6.nbt b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_6.nbt new file mode 100644 index 00000000..23202848 Binary files /dev/null and b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/ruins_6.nbt differ diff --git a/src/main/resources/data/betterend/structures/biome/umbrella_jungle/structures.json b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/structures.json new file mode 100644 index 00000000..cd3fe4ec --- /dev/null +++ b/src/main/resources/data/betterend/structures/biome/umbrella_jungle/structures.json @@ -0,0 +1,13 @@ +{ + "structures": [ + { "nbt": "jellyshroom_cluster", "offsetY": -1, "terrainMerge": "surface" }, + { "nbt": "house_1", "offsetY": -1, "terrainMerge": "surface" }, + { "nbt": "house_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_1", "offsetY": -1, "terrainMerge": "none" }, + { "nbt": "ruins_2", "offsetY": -1, "terrainMerge": "none" }, + { "nbt": "ruins_3", "offsetY": -1, "terrainMerge": "none" }, + { "nbt": "ruins_4", "offsetY": -1, "terrainMerge": "none" }, + { "nbt": "ruins_5", "offsetY": -1, "terrainMerge": "none" }, + { "nbt": "ruins_6", "offsetY": -1, "terrainMerge": "none" } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/c/tags/blocks/bookshelves.json b/src/main/resources/data/c/tags/blocks/bookshelves.json deleted file mode 100644 index 98dee3c8..00000000 --- a/src/main/resources/data/c/tags/blocks/bookshelves.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": "false", - "values": [ - "minecraft:bookshelf" - ] -} \ No newline at end of file diff --git a/src/main/resources/data/fabric/tags/items/hammers.json b/src/main/resources/data/fabric/tags/items/hammers.json deleted file mode 100644 index 847bbc95..00000000 --- a/src/main/resources/data/fabric/tags/items/hammers.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "replace": false, - "values": [ - "betterend:iron_hammer", - "betterend:golden_hammer", - "betterend:diamond_hammer", - "betterend:netherite_hammer", - "betterend:terminite_hammer", - "betterend:aeternium_hammer" - ] -} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b880fc77..0ff26b83 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -8,6 +8,7 @@ "authors": [ "paulevs (code & art)", "Bulldog83 (code & art)", + "Frank (code)", "Edos (building)", "Yuki (art)", "Seaward (art)", @@ -31,26 +32,26 @@ "ru.betterend.client.BetterEndClient" ], "rei_plugins": [ - "ru.betterend.integration.rei.REIPlugin" - ], - "rei_containers": [ - "ru.betterend.integration.rei.REIContainer" - ] + "ru.betterend.integration.rei.REIPlugin" + ] }, + "accessWidener" : "betterend.accesswidener", "mixins": [ "betterend.mixins.common.json", - "betterend.mixins.client.json" + "betterend.mixins.client.json", + "betterend.mixins.shadow.json" ], "depends": { - "fabricloader": ">=0.11.0", - "fabric": ">=0.32.0", - "minecraft": ">=1.16.4", - "bclib": ">=0.1.38" + "fabricloader": ">=0.12.9", + "fabric": ">=0.44.0", + "minecraft": "1.18.x", + "bclib": ">=1.2.5" }, "suggests": { "byg": ">=1.1.3", "blockus": ">=2.0.2", - "nourish": ">=1.2.0" + "nourish": ">=1.2.0", + "colored_lights": ">=1.0.3" } }