mirror of
https://github.com/Ellpeck/NaturesAura.git
synced 2024-11-25 04:58:33 +01:00
Compare commits
No commits in common. "1880bf785d93138df111cca8c3e10e0b6d20a873" and "d079f5aa97b96c95158e01b4d5ce8f66fb9cc8dd" have entirely different histories.
1880bf785d
...
d079f5aa97
215 changed files with 3807 additions and 3855 deletions
|
@ -1,7 +1,7 @@
|
|||
# NaturesAura
|
||||
|
||||
Nature's Aura is a mod about collecting, using and replenishing the Aura
|
||||
naturally present in the level to create useful devices and unique mechanics.
|
||||
naturally present in the world to create useful devices and unique mechanics.
|
||||
|
||||
## Maven
|
||||
|
||||
|
|
31
build.gradle
31
build.gradle
|
@ -1,11 +1,11 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
// These repositories are only for Gradle plugins, put any other repositories in the repository block further below
|
||||
maven { url = 'https://maven.minecraftforge.net' }
|
||||
maven { url = 'https://files.minecraftforge.net/maven' }
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true
|
||||
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
|
||||
}
|
||||
}
|
||||
apply plugin: 'net.minecraftforge.gradle'
|
||||
|
@ -20,11 +20,10 @@ archivesBaseName = 'NaturesAura'
|
|||
if (System.getenv('BUILD_NUMBER') != null) {
|
||||
version += "." + System.getenv('BUILD_NUMBER')
|
||||
}
|
||||
|
||||
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
|
||||
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
|
||||
|
||||
minecraft {
|
||||
mappings channel: 'official', version: '1.18'
|
||||
mappings channel: 'snapshot', version: '20200723-1.16.1'
|
||||
|
||||
runs {
|
||||
client {
|
||||
|
@ -102,22 +101,18 @@ repositories {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
minecraft 'net.minecraftforge:forge:1.18-38.0.14'
|
||||
minecraft 'net.minecraftforge:forge:1.16.5-36.1.3'
|
||||
|
||||
// TODO JEI
|
||||
/* compileOnly fg.deobf("mezz.jei:jei-1.16.5:7.6.1.75:api")
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-1.16.5:7.6.1.75")*/
|
||||
compileOnly fg.deobf("mezz.jei:jei-1.16.5:7.6.1.75:api")
|
||||
runtimeOnly fg.deobf("mezz.jei:jei-1.16.5:7.6.1.75")
|
||||
|
||||
// TDOO Patchouli
|
||||
/* compileOnly fg.deobf("vazkii.patchouli:Patchouli:1.16.4-50:api")
|
||||
runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:1.16.4-50")*/
|
||||
compileOnly fg.deobf("vazkii.patchouli:Patchouli:1.16.4-50:api")
|
||||
runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:1.16.4-50")
|
||||
|
||||
// TODO Curios
|
||||
/* runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.0")
|
||||
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.0:api")*/
|
||||
runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.0")
|
||||
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.0:api")
|
||||
|
||||
// TODO Enchantability
|
||||
/* compile fg.deobf("quarris.enchantability:Enchantability:11.0.48")*/
|
||||
compile fg.deobf("quarris.enchantability:Enchantability:11.0.48")
|
||||
}
|
||||
|
||||
// Example for how to get properties into the manifest for reading by the runtime..
|
||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,5 +1,6 @@
|
|||
#Sun Oct 20 21:47:13 CEST 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
|
||||
|
|
286
gradlew
vendored
286
gradlew
vendored
|
@ -1,129 +1,78 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# 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.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# 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/.
|
||||
#
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# 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 ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
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
|
||||
|
@ -132,7 +81,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
|
||||
|
@ -140,95 +89,84 @@ location of your Java installation."
|
|||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
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
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
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" )
|
||||
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
|
||||
# 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.
|
||||
# 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
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# 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.
|
||||
#
|
||||
# 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
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
|
43
gradlew.bat
vendored
43
gradlew.bat
vendored
|
@ -1,19 +1,3 @@
|
|||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
|
@ -29,18 +13,15 @@ if "%DIRNAME%" == "" set DIRNAME=.
|
|||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
@ -54,7 +35,7 @@ goto fail
|
|||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
|
@ -64,14 +45,28 @@ 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 %*
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
|
|
|
@ -1,64 +1,74 @@
|
|||
package de.ellpeck.naturesaura;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
||||
import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityImpl;
|
||||
import de.ellpeck.naturesaura.chunk.AuraChunk;
|
||||
import de.ellpeck.naturesaura.misc.LevelData;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
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.decoration.ItemFrame;
|
||||
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.crafting.Ingredient;
|
||||
import net.minecraft.world.level.ChunkPos;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.properties.Property;
|
||||
import net.minecraft.world.level.chunk.LevelChunk;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import de.ellpeck.naturesaura.compat.Compat;
|
||||
import de.ellpeck.naturesaura.misc.WorldData;
|
||||
import net.minecraft.advancements.Advancement;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.item.ItemFrameEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.nbt.INBT;
|
||||
import net.minecraft.state.Property;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.chunk.AbstractChunkProvider;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.capabilities.CapabilityManager;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import net.minecraftforge.registries.IForgeRegistry;
|
||||
import net.minecraftforge.registries.IForgeRegistryEntry;
|
||||
import org.apache.commons.lang3.tuple.ImmutableTriple;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import top.theillusivec4.curios.api.CuriosApi;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public final class Helper {
|
||||
|
||||
public static boolean getBlockEntitiesInArea(Level level, BlockPos pos, int radius, Function<BlockEntity, Boolean> consumer) {
|
||||
for (var x = pos.getX() - radius >> 4; x <= pos.getX() + radius >> 4; x++) {
|
||||
for (var z = pos.getZ() - radius >> 4; z <= pos.getZ() + radius >> 4; z++) {
|
||||
var chunk = getLoadedChunk(level, x, z);
|
||||
public static boolean getTileEntitiesInArea(IWorld world, BlockPos pos, int radius, Function<TileEntity, Boolean> consumer) {
|
||||
for (int x = pos.getX() - radius >> 4; x <= pos.getX() + radius >> 4; x++) {
|
||||
for (int z = pos.getZ() - radius >> 4; z <= pos.getZ() + radius >> 4; z++) {
|
||||
Chunk chunk = getLoadedChunk(world, x, z);
|
||||
if (chunk != null) {
|
||||
for (var tilePos : chunk.getBlockEntitiesPos()) {
|
||||
if (tilePos.distSqr(pos) <= radius * radius)
|
||||
if (consumer.apply(chunk.getBlockEntity(tilePos)))
|
||||
for (BlockPos tilePos : chunk.getTileEntitiesPos()) {
|
||||
if (tilePos.distanceSq(pos) <= radius * radius)
|
||||
if (consumer.apply(chunk.getTileEntity(tilePos)))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -67,86 +77,99 @@ public final class Helper {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static void getAuraChunksWithSpotsInArea(Level level, BlockPos pos, int radius, Consumer<AuraChunk> consumer) {
|
||||
var data = (LevelData) ILevelData.getLevelData(level);
|
||||
for (var x = pos.getX() - radius >> 4; x <= pos.getX() + radius >> 4; x++) {
|
||||
for (var z = pos.getZ() - radius >> 4; z <= pos.getZ() + radius >> 4; z++) {
|
||||
var chunk = data.auraChunksWithSpots.get(ChunkPos.asLong(x, z));
|
||||
public static void getAuraChunksWithSpotsInArea(World world, BlockPos pos, int radius, Consumer<AuraChunk> consumer) {
|
||||
WorldData data = (WorldData) IWorldData.getWorldData(world);
|
||||
for (int x = pos.getX() - radius >> 4; x <= pos.getX() + radius >> 4; x++) {
|
||||
for (int z = pos.getZ() - radius >> 4; z <= pos.getZ() + radius >> 4; z++) {
|
||||
AuraChunk chunk = data.auraChunksWithSpots.get(ChunkPos.asLong(x, z));
|
||||
if (chunk != null)
|
||||
consumer.accept(chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static List<ItemFrame> getAttachedItemFrames(Level level, BlockPos pos) {
|
||||
var frames = level.getEntitiesOfClass(ItemFrame.class, new AABB(pos).inflate(0.25));
|
||||
for (var i = frames.size() - 1; i >= 0; i--) {
|
||||
var frame = frames.get(i);
|
||||
var framePos = frame.getPos().relative(frame.getDirection().getOpposite());
|
||||
public static List<ItemFrameEntity> getAttachedItemFrames(World world, BlockPos pos) {
|
||||
List<ItemFrameEntity> frames = world.getEntitiesWithinAABB(ItemFrameEntity.class, new AxisAlignedBB(pos).grow(0.25));
|
||||
for (int i = frames.size() - 1; i >= 0; i--) {
|
||||
ItemFrameEntity frame = frames.get(i);
|
||||
BlockPos framePos = frame.getHangingPosition().offset(frame.getHorizontalFacing().getOpposite());
|
||||
if (!pos.equals(framePos))
|
||||
frames.remove(i);
|
||||
}
|
||||
return frames;
|
||||
}
|
||||
|
||||
public static LevelChunk getLoadedChunk(Level level, int x, int z) {
|
||||
public static Chunk getLoadedChunk(IWorld world, int x, int z) {
|
||||
// DO NOT EDIT PLEASE FOR THE LOVE OF GOD
|
||||
// This is very finicky and easily causes the game to hang for some reason
|
||||
var provider = level.getChunkSource();
|
||||
if (provider.hasChunk(x, z))
|
||||
AbstractChunkProvider provider = world.getChunkProvider();
|
||||
if (provider.isChunkLoaded(new ChunkPos(x, z)))
|
||||
return provider.getChunk(x, z, false);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int blendColors(int c1, int c2, float ratio) {
|
||||
var a = (int) ((c1 >> 24 & 0xFF) * ratio + (c2 >> 24 & 0xFF) * (1 - ratio));
|
||||
var r = (int) ((c1 >> 16 & 0xFF) * ratio + (c2 >> 16 & 0xFF) * (1 - ratio));
|
||||
var g = (int) ((c1 >> 8 & 0xFF) * ratio + (c2 >> 8 & 0xFF) * (1 - ratio));
|
||||
var b = (int) ((c1 & 0xFF) * ratio + (c2 & 0xFF) * (1 - ratio));
|
||||
int a = (int) ((c1 >> 24 & 0xFF) * ratio + (c2 >> 24 & 0xFF) * (1 - ratio));
|
||||
int r = (int) ((c1 >> 16 & 0xFF) * ratio + (c2 >> 16 & 0xFF) * (1 - ratio));
|
||||
int g = (int) ((c1 >> 8 & 0xFF) * ratio + (c2 >> 8 & 0xFF) * (1 - ratio));
|
||||
int b = (int) ((c1 & 0xFF) * ratio + (c2 & 0xFF) * (1 - ratio));
|
||||
return (a & 255) << 24 | (r & 255) << 16 | (g & 255) << 8 | b & 255;
|
||||
}
|
||||
|
||||
public static boolean areItemsEqual(ItemStack first, ItemStack second, boolean nbt) {
|
||||
if (!ItemStack.isSame(first, second))
|
||||
if (!ItemStack.areItemsEqual(first, second))
|
||||
return false;
|
||||
return !nbt || ItemStack.tagMatches(first, second);
|
||||
return !nbt || ItemStack.areItemStackTagsEqual(first, second);
|
||||
}
|
||||
|
||||
public static InteractionResult putStackOnTile(Player player, InteractionHand hand, BlockPos pos, int slot, boolean sound) {
|
||||
var tile = player.level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityImpl) {
|
||||
var handler = ((BlockEntityImpl) tile).getItemHandler();
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static void renderItemInGui(ItemStack stack, int x, int y, float scale) {
|
||||
RenderSystem.pushMatrix();
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.enableDepthTest();
|
||||
RenderSystem.enableRescaleNormal();
|
||||
RenderSystem.translatef(x, y, 0);
|
||||
RenderSystem.scalef(scale, scale, scale);
|
||||
Minecraft.getInstance().getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
|
||||
Minecraft.getInstance().getItemRenderer().renderItemOverlayIntoGUI(Minecraft.getInstance().fontRenderer, stack, 0, 0, null);
|
||||
RenderSystem.popMatrix();
|
||||
}
|
||||
|
||||
public static ActionResultType putStackOnTile(PlayerEntity player, Hand hand, BlockPos pos, int slot, boolean sound) {
|
||||
TileEntity tile = player.world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityImpl) {
|
||||
IItemHandlerModifiable handler = ((TileEntityImpl) tile).getItemHandler();
|
||||
if (handler != null) {
|
||||
var handStack = player.getItemInHand(hand);
|
||||
ItemStack handStack = player.getHeldItem(hand);
|
||||
if (!handStack.isEmpty()) {
|
||||
var remain = handler.insertItem(slot, handStack, player.level.isClientSide);
|
||||
if (!ItemStack.isSame(remain, handStack)) {
|
||||
ItemStack remain = handler.insertItem(slot, handStack, player.world.isRemote);
|
||||
if (!ItemStack.areItemStacksEqual(remain, handStack)) {
|
||||
if (sound)
|
||||
player.level.playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
|
||||
SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.PLAYERS, 0.75F, 1F);
|
||||
if (!player.level.isClientSide)
|
||||
player.setItemInHand(hand, remain);
|
||||
return InteractionResult.SUCCESS;
|
||||
player.world.playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
|
||||
SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.PLAYERS, 0.75F, 1F);
|
||||
if (!player.world.isRemote)
|
||||
player.setHeldItem(hand, remain);
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (!handler.getStackInSlot(slot).isEmpty()) {
|
||||
if (sound)
|
||||
player.level.playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
|
||||
SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.PLAYERS, 0.75F, 1F);
|
||||
if (!player.level.isClientSide) {
|
||||
var stack = handler.getStackInSlot(slot);
|
||||
if (!player.addItem(stack)) {
|
||||
var item = new ItemEntity(player.level, player.getX(), player.getY(), player.getZ(), stack);
|
||||
player.level.addFreshEntity(item);
|
||||
player.world.playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5,
|
||||
SoundEvents.ENTITY_ITEM_FRAME_REMOVE_ITEM, SoundCategory.PLAYERS, 0.75F, 1F);
|
||||
if (!player.world.isRemote) {
|
||||
ItemStack stack = handler.getStackInSlot(slot);
|
||||
if (!player.addItemStackToInventory(stack)) {
|
||||
ItemEntity item = new ItemEntity(player.world, player.getPosX(), player.getPosY(), player.getPosZ(), stack);
|
||||
player.world.addEntity(item);
|
||||
}
|
||||
handler.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
return InteractionResult.CONSUME;
|
||||
return ActionResultType.CONSUME;
|
||||
}
|
||||
|
||||
public static ICapabilityProvider makeRechargeProvider(ItemStack stack, boolean needsSelected) {
|
||||
|
@ -168,8 +191,8 @@ public final class Helper {
|
|||
}
|
||||
|
||||
public static boolean rechargeAuraItem(ItemStack stack, IAuraContainer container, int toDrain) {
|
||||
if (stack.getDamageValue() > 0 && container.drainAura(toDrain, true) >= toDrain) {
|
||||
stack.setDamageValue(stack.getDamageValue() - 1);
|
||||
if (stack.getDamage() > 0 && container.drainAura(toDrain, true) >= toDrain) {
|
||||
stack.setDamage(stack.getDamage() - 1);
|
||||
container.drainAura(toDrain, false);
|
||||
return true;
|
||||
}
|
||||
|
@ -177,15 +200,15 @@ public final class Helper {
|
|||
}
|
||||
|
||||
public static BlockState getStateFromString(String raw) {
|
||||
var split = raw.split("\\[");
|
||||
var block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0]));
|
||||
String[] split = raw.split("\\[");
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0]));
|
||||
if (block != null) {
|
||||
var state = block.defaultBlockState();
|
||||
BlockState state = block.getDefaultState();
|
||||
if (split.length > 1) {
|
||||
for (var part : split[1].replace("]", "").split(",")) {
|
||||
var keyValue = part.split("=");
|
||||
for (var prop : state.getProperties()) {
|
||||
var changed = findProperty(state, prop, keyValue[0], keyValue[1]);
|
||||
for (String part : split[1].replace("]", "").split(",")) {
|
||||
String[] keyValue = part.split("=");
|
||||
for (Property<?> prop : state.getProperties()) {
|
||||
BlockState changed = findProperty(state, prop, keyValue[0], keyValue[1]);
|
||||
if (changed != null) {
|
||||
state = changed;
|
||||
break;
|
||||
|
@ -200,23 +223,39 @@ public final class Helper {
|
|||
|
||||
private static <T extends Comparable<T>> BlockState findProperty(BlockState state, Property<T> prop, String key, String newValue) {
|
||||
if (key.equals(prop.getName()))
|
||||
for (var value : prop.getPossibleValues())
|
||||
for (T value : prop.getAllowedValues())
|
||||
if (prop.getName(value).equals(newValue))
|
||||
return state.setValue(prop, value);
|
||||
return state.with(prop, value);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void addAdvancement(Player player, ResourceLocation advancement, String criterion) {
|
||||
if (!(player instanceof ServerPlayer playerMp))
|
||||
public static <T> void registerCap(Class<T> type) {
|
||||
CapabilityManager.INSTANCE.register(type, new Capability.IStorage<T>() {
|
||||
@Override
|
||||
public void readNBT(Capability<T> capability, T instance, Direction side, INBT nbt) {
|
||||
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public INBT writeNBT(Capability capability, Object instance, Direction side) {
|
||||
return null;
|
||||
}
|
||||
}, () -> null);
|
||||
}
|
||||
|
||||
public static void addAdvancement(PlayerEntity player, ResourceLocation advancement, String criterion) {
|
||||
if (!(player instanceof ServerPlayerEntity))
|
||||
return;
|
||||
var adv = playerMp.getLevel().getServer().getAdvancements().getAdvancement(advancement);
|
||||
ServerPlayerEntity playerMp = (ServerPlayerEntity) player;
|
||||
Advancement adv = playerMp.getServerWorld().getServer().getAdvancementManager().getAdvancement(advancement);
|
||||
if (adv != null)
|
||||
playerMp.getAdvancements().award(adv, criterion);
|
||||
playerMp.getAdvancements().grantCriterion(adv, criterion);
|
||||
}
|
||||
|
||||
public static int getIngredientAmount(Ingredient ingredient) {
|
||||
var highestAmount = 0;
|
||||
for (var stack : ingredient.getItems())
|
||||
int highestAmount = 0;
|
||||
for (ItemStack stack : ingredient.getMatchingStacks())
|
||||
if (stack.getCount() > highestAmount)
|
||||
highestAmount = stack.getCount();
|
||||
return highestAmount;
|
||||
|
@ -250,9 +289,9 @@ public final class Helper {
|
|||
GL11.glVertex3d(x, y, z);
|
||||
}
|
||||
|
||||
public static boolean isHoldingItem(Player player, Item item) {
|
||||
for (var hand : InteractionHand.values()) {
|
||||
var stack = player.getItemInHand(hand);
|
||||
public static boolean isHoldingItem(PlayerEntity player, Item item) {
|
||||
for (Hand hand : Hand.values()) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (!stack.isEmpty() && stack.getItem() == item)
|
||||
return true;
|
||||
}
|
||||
|
@ -260,22 +299,22 @@ public final class Helper {
|
|||
}
|
||||
|
||||
public static boolean isEmpty(IItemHandler handler) {
|
||||
for (var i = 0; i < handler.getSlots(); i++)
|
||||
for (int i = 0; i < handler.getSlots(); i++)
|
||||
if (!handler.getStackInSlot(i).isEmpty())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static AABB aabb(Vec3 pos) {
|
||||
return new AABB(pos.x, pos.y, pos.z, pos.x, pos.y, pos.z);
|
||||
public static AxisAlignedBB aabb(Vector3d pos) {
|
||||
return new AxisAlignedBB(pos.x, pos.y, pos.z, pos.x, pos.y, pos.z);
|
||||
}
|
||||
|
||||
// This is how @ObjectHolder SHOULD work...
|
||||
public static <T extends IForgeRegistryEntry<T>> void populateObjectHolders(Class<?> clazz, IForgeRegistry<T> registry) {
|
||||
for (var entry : clazz.getFields()) {
|
||||
// This is how @ObjectHolder _SHOULD_ work...
|
||||
public static <T extends IForgeRegistryEntry<T>> void populateObjectHolders(Class clazz, IForgeRegistry<T> registry) {
|
||||
for (Field entry : clazz.getFields()) {
|
||||
if (!Modifier.isStatic(entry.getModifiers()))
|
||||
continue;
|
||||
var location = new ResourceLocation(NaturesAura.MOD_ID, entry.getName().toLowerCase(Locale.ROOT));
|
||||
ResourceLocation location = new ResourceLocation(NaturesAura.MOD_ID, entry.getName().toLowerCase(Locale.ROOT));
|
||||
if (!registry.containsKey(location)) {
|
||||
NaturesAura.LOGGER.fatal("Couldn't find entry named " + location + " in registry " + registry.getRegistryName());
|
||||
continue;
|
||||
|
@ -288,15 +327,14 @@ public final class Helper {
|
|||
}
|
||||
}
|
||||
|
||||
public static ItemStack getEquippedItem(Predicate<ItemStack> predicate, Player player) {
|
||||
// TODO Curios
|
||||
/* if (Compat.hasCompat("curios")) {
|
||||
public static ItemStack getEquippedItem(Predicate<ItemStack> predicate, PlayerEntity player) {
|
||||
if (Compat.hasCompat("curios")) {
|
||||
Optional<ItemStack> stack = CuriosApi.getCuriosHelper().findEquippedCurio(predicate, player).map(ImmutableTriple::getRight);
|
||||
if (stack.isPresent())
|
||||
return stack.get();
|
||||
}*/
|
||||
for (var i = 0; i < player.getInventory().getContainerSize(); i++) {
|
||||
var slot = player.getInventory().getItem(i);
|
||||
}
|
||||
for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
|
||||
ItemStack slot = player.inventory.getStackInSlot(i);
|
||||
if (!slot.isEmpty() && predicate.test(slot))
|
||||
return slot;
|
||||
}
|
||||
|
|
|
@ -3,18 +3,18 @@ package de.ellpeck.naturesaura;
|
|||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.api.multiblock.IMultiblock;
|
||||
import de.ellpeck.naturesaura.blocks.multi.Multiblock;
|
||||
import de.ellpeck.naturesaura.misc.LevelData;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import de.ellpeck.naturesaura.misc.WorldData;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.commons.lang3.mutable.MutableFloat;
|
||||
import org.apache.commons.lang3.mutable.MutableInt;
|
||||
import org.apache.commons.lang3.mutable.MutableObject;
|
||||
|
@ -27,16 +27,16 @@ import java.util.function.BiConsumer;
|
|||
public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
||||
|
||||
@Override
|
||||
public boolean extractAuraFromPlayer(Player player, int amount, boolean simulate) {
|
||||
public boolean extractAuraFromPlayer(PlayerEntity player, int amount, boolean simulate) {
|
||||
return this.auraPlayerInteraction(player, amount, true, simulate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean insertAuraIntoPlayer(Player player, int amount, boolean simulate) {
|
||||
public boolean insertAuraIntoPlayer(PlayerEntity player, int amount, boolean simulate) {
|
||||
return this.auraPlayerInteraction(player, amount, false, simulate);
|
||||
}
|
||||
|
||||
private boolean auraPlayerInteraction(Player player, int amount, boolean extract, boolean simulate) {
|
||||
private boolean auraPlayerInteraction(PlayerEntity player, int amount, boolean extract, boolean simulate) {
|
||||
if (extract && player.isCreative())
|
||||
return true;
|
||||
ItemStack stack = Helper.getEquippedItem(s -> s.getCapability(NaturesAuraAPI.capAuraContainer).isPresent(), player);
|
||||
|
@ -90,18 +90,18 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<Tuple<Vector3d, Integer>> getActiveEffectPowders(Level level, AxisAlignedBB area, ResourceLocation name) {
|
||||
public List<Tuple<Vector3d, Integer>> getActiveEffectPowders(World world, AxisAlignedBB area, ResourceLocation name) {
|
||||
List<Tuple<Vector3d, Integer>> found = new ArrayList<>();
|
||||
for (Tuple<Vector3d, Integer> powder : ((LevelData) ILevelData.getLevelData(level)).effectPowders.get(name))
|
||||
for (Tuple<Vector3d, Integer> powder : ((WorldData) IWorldData.getWorldData(world)).effectPowders.get(name))
|
||||
if (area.contains(powder.getA()))
|
||||
found.add(powder);
|
||||
return found;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEffectPowderActive(Level level, BlockPos pos, ResourceLocation name) {
|
||||
public boolean isEffectPowderActive(World world, BlockPos pos, ResourceLocation name) {
|
||||
Vector3d posVec = new Vector3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
|
||||
List<Tuple<Vector3d, Integer>> powders = this.getActiveEffectPowders(level, new AxisAlignedBB(pos).grow(64), name);
|
||||
List<Tuple<Vector3d, Integer>> powders = this.getActiveEffectPowders(world, new AxisAlignedBB(pos).grow(64), name);
|
||||
for (Tuple<Vector3d, Integer> powder : powders) {
|
||||
AxisAlignedBB bounds = Helper.aabb(powder.getA()).grow(powder.getB());
|
||||
if (bounds.contains(posVec))
|
||||
|
@ -111,29 +111,29 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void getAuraSpotsInArea(Level level, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) {
|
||||
Helper.getAuraChunksWithSpotsInArea(level, pos, radius, chunk -> chunk.getSpotsInArea(pos, radius, consumer));
|
||||
public void getAuraSpotsInArea(World world, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) {
|
||||
Helper.getAuraChunksWithSpotsInArea(world, pos, radius, chunk -> chunk.getSpotsInArea(pos, radius, consumer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSpotAmountInArea(Level level, BlockPos pos, int radius) {
|
||||
public int getSpotAmountInArea(World world, BlockPos pos, int radius) {
|
||||
MutableInt result = new MutableInt();
|
||||
this.getAuraSpotsInArea(level, pos, radius, (blockpos, drainSpot) -> result.increment());
|
||||
this.getAuraSpotsInArea(world, pos, radius, (blockpos, drainSpot) -> result.increment());
|
||||
return result.intValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAuraInArea(Level level, BlockPos pos, int radius) {
|
||||
public int getAuraInArea(World world, BlockPos pos, int radius) {
|
||||
MutableInt result = new MutableInt(IAuraChunk.DEFAULT_AURA);
|
||||
this.getAuraSpotsInArea(level, pos, radius, (blockPos, drainSpot) -> result.add(drainSpot));
|
||||
this.getAuraSpotsInArea(world, pos, radius, (blockPos, drainSpot) -> result.add(drainSpot));
|
||||
return result.intValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<Integer, Integer> getAuraAndSpotAmountInArea(Level level, BlockPos pos, int radius) {
|
||||
public Pair<Integer, Integer> getAuraAndSpotAmountInArea(World world, BlockPos pos, int radius) {
|
||||
MutableInt spots = new MutableInt();
|
||||
MutableInt aura = new MutableInt(IAuraChunk.DEFAULT_AURA);
|
||||
this.getAuraSpotsInArea(level, pos, radius, (blockPos, drainSpot) -> {
|
||||
this.getAuraSpotsInArea(world, pos, radius, (blockPos, drainSpot) -> {
|
||||
aura.add(drainSpot);
|
||||
spots.increment();
|
||||
});
|
||||
|
@ -141,9 +141,9 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int triangulateAuraInArea(Level level, BlockPos pos, int radius) {
|
||||
public int triangulateAuraInArea(World world, BlockPos pos, int radius) {
|
||||
MutableFloat result = new MutableFloat(IAuraChunk.DEFAULT_AURA);
|
||||
IAuraChunk.getSpotsInArea(level, pos, radius, (blockPos, spot) -> {
|
||||
IAuraChunk.getSpotsInArea(world, pos, radius, (blockPos, spot) -> {
|
||||
float percentage = 1F - (float) Math.sqrt(pos.distanceSq(blockPos)) / radius;
|
||||
result.add(spot * percentage);
|
||||
});
|
||||
|
@ -151,10 +151,10 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getLowestAuraDrainSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
public BlockPos getLowestAuraDrainSpot(World world, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
MutableInt lowestAmount = new MutableInt(Integer.MAX_VALUE);
|
||||
MutableObject<BlockPos> lowestSpot = new MutableObject<>();
|
||||
this.getAuraSpotsInArea(level, pos, radius, (blockPos, drainSpot) -> {
|
||||
this.getAuraSpotsInArea(world, pos, radius, (blockPos, drainSpot) -> {
|
||||
if (drainSpot < lowestAmount.intValue()) {
|
||||
lowestAmount.setValue(drainSpot);
|
||||
lowestSpot.setValue(blockPos);
|
||||
|
@ -167,10 +167,10 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getHighestAuraDrainSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
public BlockPos getHighestAuraDrainSpot(World world, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
MutableInt highestAmount = new MutableInt(Integer.MIN_VALUE);
|
||||
MutableObject<BlockPos> highestSpot = new MutableObject<>();
|
||||
this.getAuraSpotsInArea(level, pos, radius, (blockPos, drainSpot) -> {
|
||||
this.getAuraSpotsInArea(world, pos, radius, (blockPos, drainSpot) -> {
|
||||
if (drainSpot > highestAmount.intValue()) {
|
||||
highestAmount.setValue(drainSpot);
|
||||
highestSpot.setValue(blockPos);
|
||||
|
|
|
@ -46,7 +46,7 @@ public final class ModConfig {
|
|||
public ConfigValue<Integer> auraBarLocation;
|
||||
public ConfigValue<Integer> cacheBarLocation;
|
||||
public ConfigValue<Boolean> debugText;
|
||||
public ConfigValue<Boolean> debugLevel;
|
||||
public ConfigValue<Boolean> debugWorld;
|
||||
public ConfigValue<Boolean> renderItemsOnPlayer;
|
||||
|
||||
public ModConfig(ForgeConfigSpec.Builder builder) {
|
||||
|
@ -131,7 +131,7 @@ public final class ModConfig {
|
|||
.translation("config." + NaturesAura.MOD_ID + ".oreEffect")
|
||||
.define("oreEffect", true);
|
||||
this.auraBlooms = builder
|
||||
.comment("If Aura Blooms and Aura Cacti should generate in the level")
|
||||
.comment("If Aura Blooms and Aura Cacti should generate in the world")
|
||||
.translation("config." + NaturesAura.MOD_ID + ".auraBlooms")
|
||||
.define("auraBlooms", true);
|
||||
this.netherGrassEffect = builder
|
||||
|
@ -165,10 +165,10 @@ public final class ModConfig {
|
|||
.comment("If debug information about Aura around the player should be displayed in the F3 debug menu if the player is in creative mode")
|
||||
.translation("config." + NaturesAura.MOD_ID + ".debugText")
|
||||
.define("debugText", true);
|
||||
this.debugLevel = builder
|
||||
.comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the level for debug purposes")
|
||||
.translation("config." + NaturesAura.MOD_ID + ".debugLevel")
|
||||
.define("debugLevel", false);
|
||||
this.debugWorld = builder
|
||||
.comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the world for debug purposes")
|
||||
.translation("config." + NaturesAura.MOD_ID + ".debugWorld")
|
||||
.define("debugWorld", false);
|
||||
this.renderItemsOnPlayer = builder
|
||||
.comment("If certain equippable items, like the Environmental Eye, should be rendered on the player")
|
||||
.translation("config." + NaturesAura.MOD_ID + ".renderItemsOnPlayer")
|
||||
|
|
|
@ -5,7 +5,7 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
|||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
||||
import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.blocks.multi.Multiblocks;
|
||||
import de.ellpeck.naturesaura.chunk.effect.DrainSpotEffects;
|
||||
import de.ellpeck.naturesaura.compat.Compat;
|
||||
|
@ -17,10 +17,11 @@ import de.ellpeck.naturesaura.proxy.IProxy;
|
|||
import de.ellpeck.naturesaura.proxy.ServerProxy;
|
||||
import de.ellpeck.naturesaura.recipes.ModRecipes;
|
||||
import de.ellpeck.naturesaura.reg.ModRegistry;
|
||||
import net.minecraft.world.item.CreativeModeTab;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.item.ItemGroup;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.common.ForgeConfigSpec;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.DeferredWorkQueue;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
|
@ -36,9 +37,9 @@ public final class NaturesAura {
|
|||
public static final String MOD_NAME = "Nature's Aura";
|
||||
|
||||
public static final Logger LOGGER = LogManager.getLogger(MOD_NAME);
|
||||
public static final CreativeModeTab CREATIVE_TAB = new CreativeModeTab(MOD_ID) {
|
||||
public static final ItemGroup CREATIVE_TAB = new ItemGroup(MOD_ID) {
|
||||
@Override
|
||||
public ItemStack makeIcon() {
|
||||
public ItemStack createIcon() {
|
||||
return new ItemStack(ModItems.GOLD_LEAF);
|
||||
}
|
||||
};
|
||||
|
@ -64,7 +65,7 @@ public final class NaturesAura {
|
|||
Helper.registerCap(IAuraContainer.class);
|
||||
Helper.registerCap(IAuraRecharge.class);
|
||||
Helper.registerCap(IAuraChunk.class);
|
||||
Helper.registerCap(ILevelData.class);
|
||||
Helper.registerCap(IWorldData.class);
|
||||
|
||||
Compat.setup(event);
|
||||
PacketHandler.init();
|
||||
|
|
|
@ -8,24 +8,24 @@ import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
|||
import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge;
|
||||
import de.ellpeck.naturesaura.api.aura.type.BasicAuraType;
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.api.misc.WeatherType;
|
||||
import de.ellpeck.naturesaura.api.misc.WeightedOre;
|
||||
import de.ellpeck.naturesaura.api.multiblock.IMultiblock;
|
||||
import de.ellpeck.naturesaura.api.multiblock.Matcher;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
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.AABB;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.capabilities.CapabilityManager;
|
||||
import net.minecraftforge.common.capabilities.CapabilityToken;
|
||||
import net.minecraftforge.common.capabilities.CapabilityInject;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -46,34 +46,34 @@ public final class NaturesAuraAPI {
|
|||
public static final String API_ID = MOD_ID + "api";
|
||||
public static final String VERSION = "9";
|
||||
/**
|
||||
* A map of all the block states that the Botanist's Pickaxe can convert
|
||||
* A map of all of the block states that the Botanist's Pickaxe can convert
|
||||
* into their mossy variations. Contains mossy brick and mossy cobblestone
|
||||
* by default, along with all blocks specified in the config file
|
||||
*/
|
||||
public static final BiMap<BlockState, BlockState> BOTANIST_PICKAXE_CONVERSIONS = HashBiMap.create();
|
||||
/**
|
||||
* A map of all {@link IAuraType} instances which are types of Aura present
|
||||
* in different types of levels. {@link BasicAuraType} instances can be
|
||||
* in different types of worlds. {@link BasicAuraType} instances can be
|
||||
* easily registered using {@link BasicAuraType#register()}.
|
||||
*/
|
||||
public static final Map<ResourceLocation, IAuraType> AURA_TYPES = new HashMap<>();
|
||||
public static final BasicAuraType TYPE_OVERWORLD = new BasicAuraType(new ResourceLocation(MOD_ID, "overworld"), Level.OVERWORLD, 0x89cc37, 0).register();
|
||||
public static final BasicAuraType TYPE_NETHER = new BasicAuraType(new ResourceLocation(MOD_ID, "nether"), Level.NETHER, 0x871c0c, 0).register();
|
||||
public static final BasicAuraType TYPE_END = new BasicAuraType(new ResourceLocation(MOD_ID, "end"), Level.END, 0x302624, 0).register();
|
||||
public static final BasicAuraType TYPE_OVERWORLD = new BasicAuraType(new ResourceLocation(MOD_ID, "overworld"), World.field_234918_g_, 0x89cc37, 0).register();
|
||||
public static final BasicAuraType TYPE_NETHER = new BasicAuraType(new ResourceLocation(MOD_ID, "nether"), World.field_234919_h_, 0x871c0c, 0).register();
|
||||
public static final BasicAuraType TYPE_END = new BasicAuraType(new ResourceLocation(MOD_ID, "end"), World.field_234920_i_, 0x302624, 0).register();
|
||||
public static final BasicAuraType TYPE_OTHER = new BasicAuraType(new ResourceLocation(MOD_ID, "other"), null, 0x2fa8a0, Integer.MIN_VALUE).register();
|
||||
/**
|
||||
* A map of all {@link IDrainSpotEffect} suppliers which are effects that
|
||||
* happen passively at every spot that Aura has been drained from in the
|
||||
* level. These effects include things like vegetational increase and
|
||||
* world. These effects include things like vegetational increase and
|
||||
* natural decay. To register your own drain spot effects, just add a
|
||||
* supplier for them to this map, and they will automatically be executed
|
||||
* supplier for them to this map and they will automatically be executed
|
||||
* once a second for every drain spot currently loaded.
|
||||
*/
|
||||
public static final Map<ResourceLocation, Supplier<IDrainSpotEffect>> DRAIN_SPOT_EFFECTS = new HashMap<>();
|
||||
/**
|
||||
* A map of all effect powder type. The integer the effect is registered to
|
||||
* is the color that the powder and its effect should have. To check if a
|
||||
* powder is active in any given area, use {@link IInternalHooks#isEffectPowderActive(Level,
|
||||
* powder is active in any given area, use {@link IInternalHooks#isEffectPowderActive(World,
|
||||
* BlockPos, ResourceLocation)}
|
||||
*/
|
||||
public static final Map<ResourceLocation, Integer> EFFECT_POWDERS = new HashMap<>();
|
||||
|
@ -90,50 +90,48 @@ public final class NaturesAuraAPI {
|
|||
public static final List<WeightedOre> OVERWORLD_ORES = new ArrayList<>();
|
||||
/**
|
||||
* A list of all {@link WeightedOre} objects that represent ores that can
|
||||
* spawn inside netherrack blocks in the nether
|
||||
* spawn inside of netherrack blocks in the nether
|
||||
*/
|
||||
public static final List<WeightedOre> NETHER_ORES = new ArrayList<>();
|
||||
/**
|
||||
* A map of all the entities' registry names to the amounts of aura they
|
||||
* A map of all of the entities' registry names to the amounts of aura they
|
||||
* each generate in the projectile generator
|
||||
*/
|
||||
public static final Map<EntityType<?>, Integer> PROJECTILE_GENERATIONS = new HashMap<>();
|
||||
public static final Map<EntityType, Integer> PROJECTILE_GENERATIONS = new HashMap<>();
|
||||
/**
|
||||
* A map of all the items that cause the {@link WeatherType} to be changed
|
||||
* using the weather changer
|
||||
* A map of all of the items that cause the {@link WeatherType} to be
|
||||
* changed using the weather changer
|
||||
*/
|
||||
public static final Map<ItemStack, WeatherType> WEATHER_CHANGER_CONVERSIONS = new HashMap<>();
|
||||
/**
|
||||
* The capability for any item or block that stores Aura in the form of an
|
||||
* {@link IAuraContainer}
|
||||
*/
|
||||
public static Capability<IAuraContainer> capAuraContainer = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
@CapabilityInject(IAuraContainer.class)
|
||||
public static Capability<IAuraContainer> capAuraContainer;
|
||||
/**
|
||||
* The capability for any item that can be recharged from an Aura storage
|
||||
* container like the Aura Cache in the form of {@link IAuraRecharge} by a
|
||||
* player holding it in their hand
|
||||
*/
|
||||
public static Capability<IAuraRecharge> capAuraRecharge = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
@CapabilityInject(IAuraRecharge.class)
|
||||
public static Capability<IAuraRecharge> capAuraRecharge;
|
||||
/**
|
||||
* The capability that any chunk in a level has to store Aura in it. As this
|
||||
* is only applicable to chunks and all chunks in the level automatically
|
||||
* The capability that any chunk in a world has to store Aura in it. As this
|
||||
* is only applicable to chunks and all chunks in the world automatically
|
||||
* get assigned this capability, using it directly is not necessary for
|
||||
* addon developers. To retrieve this capability from any chunk, use the
|
||||
* helper method {@link IAuraChunk#getAuraChunk(net.minecraft.world.level.Level,
|
||||
* BlockPos)}.
|
||||
* helper method {@link IAuraChunk#getAuraChunk(IWorld, BlockPos)}.
|
||||
*/
|
||||
public static Capability<IAuraChunk> capAuraChunk = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
@CapabilityInject(IAuraChunk.class)
|
||||
public static Capability<IAuraChunk> capAuraChunk;
|
||||
/**
|
||||
* The capability that any level has to store Nature's Aura specific data in
|
||||
* it. To retrieve this capability from any level, use the helper methods
|
||||
* {@link ILevelData#getLevelData(net.minecraft.world.level.Level)} or
|
||||
* {@link ILevelData#getOverworldData(net.minecraft.world.level.Level)}.
|
||||
* The capability that any world has to store Nature's Aura specific data in
|
||||
* it. To retrieve this capability from any world, use the helper methods
|
||||
* {@link IWorldData#getWorldData(World)} or {@link IWorldData#getOverworldData(World)}.
|
||||
*/
|
||||
public static Capability<ILevelData> capLevelData = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
@CapabilityInject(IWorldData.class)
|
||||
public static Capability<IWorldData> capWorldData;
|
||||
private static final IInternalHooks INSTANCE;
|
||||
|
||||
static {
|
||||
|
@ -171,7 +169,7 @@ public final class NaturesAuraAPI {
|
|||
* @param simulate If the extraction should be simulated
|
||||
* @return If the extraction was successful
|
||||
*/
|
||||
boolean extractAuraFromPlayer(Player player, int amount, boolean simulate);
|
||||
boolean extractAuraFromPlayer(PlayerEntity player, int amount, boolean simulate);
|
||||
|
||||
/**
|
||||
* Helper method to insert aura into an {@link IAuraContainer} in the
|
||||
|
@ -183,7 +181,7 @@ public final class NaturesAuraAPI {
|
|||
* @param simulate If the insertion should be simulated
|
||||
* @return If the insertion was successful
|
||||
*/
|
||||
boolean insertAuraIntoPlayer(Player player, int amount, boolean simulate);
|
||||
boolean insertAuraIntoPlayer(PlayerEntity player, int amount, boolean simulate);
|
||||
|
||||
/**
|
||||
* This method can be used to spawn the magic particle effect used by
|
||||
|
@ -264,65 +262,65 @@ public final class NaturesAuraAPI {
|
|||
IMultiblock createMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers);
|
||||
|
||||
/**
|
||||
* Get all the active effect powders in the given area and consume the
|
||||
* position and the range that they have. To register a powder with the
|
||||
* supplied name, use {@link #EFFECT_POWDERS}
|
||||
* Get all of the active effect powders in the given area and consume
|
||||
* the position and the range that they have. To register a powder with
|
||||
* the supplied name, use {@link #EFFECT_POWDERS}
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param area The area to find powders in
|
||||
* @param name The registry name of the powder
|
||||
* @return A list of powders' positions and ranges
|
||||
*/
|
||||
List<Tuple<Vec3, Integer>> getActiveEffectPowders(Level level, AABB area, ResourceLocation name);
|
||||
List<Tuple<Vector3d, Integer>> getActiveEffectPowders(World world, AxisAlignedBB area, ResourceLocation name);
|
||||
|
||||
/**
|
||||
* Returns true if there is an effect powder entity active anywhere
|
||||
* around the given position based on the radius it has. This is a
|
||||
* shorthand function of {@link #getActiveEffectPowders(Level,
|
||||
* net.minecraft.world.phys.AABB, ResourceLocation)} that returns true
|
||||
* if the list is non-empty
|
||||
* shorthand function of {@link #getActiveEffectPowders(World,
|
||||
* AxisAlignedBB, ResourceLocation)} that returns true if the list is
|
||||
* non-empty
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param name The registry name of the powder
|
||||
* @return If the effect is currently inhibited by any inhibitors
|
||||
*/
|
||||
boolean isEffectPowderActive(Level level, BlockPos pos, ResourceLocation name);
|
||||
boolean isEffectPowderActive(World world, BlockPos pos, ResourceLocation name);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getSpotsInArea(Level, BlockPos, int, BiConsumer)
|
||||
* @see IAuraChunk#getSpotsInArea(IWorld, BlockPos, int, BiConsumer)
|
||||
*/
|
||||
void getAuraSpotsInArea(Level level, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer);
|
||||
void getAuraSpotsInArea(World world, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getSpotAmountInArea(Level, BlockPos, int)
|
||||
* @see IAuraChunk#getSpotAmountInArea(IWorld, BlockPos, int)
|
||||
*/
|
||||
int getSpotAmountInArea(Level level, BlockPos pos, int radius);
|
||||
int getSpotAmountInArea(World world, BlockPos pos, int radius);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getAuraInArea(Level, BlockPos, int)
|
||||
* @see IAuraChunk#getAuraInArea(IWorld, BlockPos, int)
|
||||
*/
|
||||
int getAuraInArea(Level level, BlockPos pos, int radius);
|
||||
int getAuraInArea(World world, BlockPos pos, int radius);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getAuraAndSpotAmountInArea(Level, BlockPos, int)
|
||||
* @see IAuraChunk#getAuraAndSpotAmountInArea(World, BlockPos, int)
|
||||
*/
|
||||
Pair<Integer, Integer> getAuraAndSpotAmountInArea(Level level, BlockPos pos, int radius);
|
||||
Pair<Integer, Integer> getAuraAndSpotAmountInArea(World world, BlockPos pos, int radius);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#triangulateAuraInArea(Level, BlockPos, int)
|
||||
* @see IAuraChunk#triangulateAuraInArea(IWorld, BlockPos, int)
|
||||
*/
|
||||
int triangulateAuraInArea(Level level, BlockPos pos, int radius);
|
||||
int triangulateAuraInArea(World world, BlockPos pos, int radius);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getLowestSpot(Level, BlockPos, int, BlockPos)
|
||||
* @see IAuraChunk#getLowestSpot(IWorld, BlockPos, int, BlockPos)
|
||||
*/
|
||||
BlockPos getLowestAuraDrainSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot);
|
||||
BlockPos getLowestAuraDrainSpot(World world, BlockPos pos, int radius, BlockPos defaultSpot);
|
||||
|
||||
/**
|
||||
* @see IAuraChunk#getHighestSpot(Level, BlockPos, int, BlockPos)
|
||||
* @see IAuraChunk#getHighestSpot(IWorld, BlockPos, int, BlockPos)
|
||||
*/
|
||||
BlockPos getHighestAuraDrainSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot);
|
||||
BlockPos getHighestAuraDrainSpot(World world, BlockPos pos, int radius, BlockPos defaultSpot);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,10 +2,11 @@ package de.ellpeck.naturesaura.api.aura.chunk;
|
|||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.chunk.LevelChunk;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraftforge.common.util.INBTSerializable;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
|
@ -13,13 +14,13 @@ import java.util.function.BiConsumer;
|
|||
|
||||
/**
|
||||
* A class whose instances hold information about the aura present in any given
|
||||
* {@link net.minecraft.world.level.chunk.LevelChunk}. To get an instance for a
|
||||
* chunk, use {@link #getAuraChunk(Level, BlockPos)}.
|
||||
* {@link Chunk}. To get an instance for a chunk, use {@link
|
||||
* #getAuraChunk(IWorld, BlockPos)}.
|
||||
* <p>
|
||||
* It is not intended for API users to create custom implementation of this
|
||||
* class.
|
||||
*/
|
||||
public interface IAuraChunk extends INBTSerializable<CompoundTag> {
|
||||
public interface IAuraChunk extends INBTSerializable<CompoundNBT> {
|
||||
|
||||
/**
|
||||
* The default amount of Aura that a chunk has stored
|
||||
|
@ -30,12 +31,12 @@ public interface IAuraChunk extends INBTSerializable<CompoundTag> {
|
|||
* This method is used to get information about the Aura in any given chunk.
|
||||
* This is a convenience method.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos A position that the chunk contains
|
||||
* @return The {@link IAuraChunk} instance belonging to the chunk
|
||||
*/
|
||||
static IAuraChunk getAuraChunk(Level level, BlockPos pos) {
|
||||
LevelChunk chunk = (LevelChunk) level.getChunk(pos);
|
||||
static IAuraChunk getAuraChunk(IWorld world, BlockPos pos) {
|
||||
Chunk chunk = (Chunk) world.getChunk(pos);
|
||||
return chunk.getCapability(NaturesAuraAPI.capAuraChunk, null).orElse(null);
|
||||
}
|
||||
|
||||
|
@ -44,78 +45,78 @@ public interface IAuraChunk extends INBTSerializable<CompoundTag> {
|
|||
* spots, represented as a position and the number of Aura in them, in any
|
||||
* given area.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @param consumer A consumer that gets given the position and amount of
|
||||
* aura in each drain spot found
|
||||
*/
|
||||
static void getSpotsInArea(Level level, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) {
|
||||
NaturesAuraAPI.instance().getAuraSpotsInArea(level, pos, radius, consumer);
|
||||
static void getSpotsInArea(IWorld world, BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) {
|
||||
NaturesAuraAPI.instance().getAuraSpotsInArea((World) world, pos, radius, consumer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method that adds up the amount of aura spots from {@link
|
||||
* #getSpotsInArea(Level, BlockPos, int, BiConsumer)} and returns it.
|
||||
* #getSpotsInArea(IWorld, BlockPos, int, BiConsumer)} and returns it.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @return The amount of spots found in the area
|
||||
*/
|
||||
static int getSpotAmountInArea(Level level, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getSpotAmountInArea(level, pos, radius);
|
||||
static int getSpotAmountInArea(IWorld world, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getSpotAmountInArea((World) world, pos, radius);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method that adds up all of the aura from each drain spot from
|
||||
* {@link #getSpotsInArea(Level, BlockPos, int, BiConsumer)} and
|
||||
* {@link #getSpotsInArea(IWorld, BlockPos, int, BiConsumer)} and
|
||||
* conveniently returns it. For a better visual display with a more gradual
|
||||
* increase, use {@link #triangulateAuraInArea(Level, BlockPos, int)}.
|
||||
* increase, use {@link #triangulateAuraInArea(IWorld, BlockPos, int)}.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @return The amount of Aura present in that area, based on the drain spots
|
||||
* that are found
|
||||
*/
|
||||
static int getAuraInArea(Level level, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getAuraInArea(level, pos, radius);
|
||||
static int getAuraInArea(IWorld world, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getAuraInArea((World) world, pos, radius);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method that combines {@link #getAuraInArea(Level, BlockPos,
|
||||
* int)} and {@link #getSpotAmountInArea(Level, BlockPos, int)} to increase
|
||||
* Convenience method that combines {@link #getAuraInArea(IWorld, BlockPos,
|
||||
* int)} and {@link #getSpotAmountInArea(IWorld, BlockPos, int)} to increase
|
||||
* performance.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @return A pair of the amount of aura in the area as the {@link
|
||||
* Pair#getLeft()} entry, and the amount of aura spots in the area as the
|
||||
* {@link Pair#getRight()} entry
|
||||
*/
|
||||
static Pair<Integer, Integer> getAuraAndSpotAmountInArea(Level level, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getAuraAndSpotAmountInArea(level, pos, radius);
|
||||
static Pair<Integer, Integer> getAuraAndSpotAmountInArea(World world, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().getAuraAndSpotAmountInArea(world, pos, radius);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method that adds up all of the aura from each drain spot from
|
||||
* {@link #getSpotsInArea(Level, BlockPos, int, BiConsumer)}, but multiplies
|
||||
* their amount by the percentual distance to the supplied position. This
|
||||
* will cause for a lot more gradual of an increase and decrease of Aura
|
||||
* when moving closer to actual spots. This should be used for visual
|
||||
* purposes as it is more performance intensive than {@link
|
||||
* #getAuraInArea(Level, BlockPos, int)}.
|
||||
* {@link #getSpotsInArea(IWorld, BlockPos, int, BiConsumer)}, but
|
||||
* multiplies their amount by the percentual distance to the supplied
|
||||
* position. This will cause for a lot more gradual of an increase and
|
||||
* decrease of Aura when moving closer to actual spots. This should be used
|
||||
* for visual purposes as it is more performance intensive than {@link
|
||||
* #getAuraInArea(IWorld, BlockPos, int)}.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @return The amount of Aura presetn in that area, based on the drain spots
|
||||
* that are found and their distance to the center
|
||||
*/
|
||||
static int triangulateAuraInArea(Level level, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().triangulateAuraInArea(level, pos, radius);
|
||||
static int triangulateAuraInArea(IWorld world, BlockPos pos, int radius) {
|
||||
return NaturesAuraAPI.instance().triangulateAuraInArea((World) world, pos, radius);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -125,15 +126,15 @@ public interface IAuraChunk extends INBTSerializable<CompoundTag> {
|
|||
* drained spots get selected first. Note that, when there is no drain spot
|
||||
* with an amount lower than 0, the default will always be returned.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @param defaultSpot A position that will be used to create a new drain
|
||||
* spot when none are found
|
||||
* @return The position of the lowest drain spot
|
||||
*/
|
||||
static BlockPos getLowestSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
return NaturesAuraAPI.instance().getLowestAuraDrainSpot(level, pos, radius, defaultSpot);
|
||||
static BlockPos getLowestSpot(IWorld world, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
return NaturesAuraAPI.instance().getLowestAuraDrainSpot((World) world, pos, radius, defaultSpot);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -143,15 +144,15 @@ public interface IAuraChunk extends INBTSerializable<CompoundTag> {
|
|||
* amount are drained first. Note that, when there is no drain spot with an
|
||||
* amount greater than 0, the defautl will always be returned.
|
||||
*
|
||||
* @param level The level
|
||||
* @param world The world
|
||||
* @param pos The center position
|
||||
* @param radius The radius around the center to search for spots in
|
||||
* @param defaultSpot A position that will be used to create a new drain
|
||||
* spot when none are found
|
||||
* @return The position of the highest drain spot
|
||||
*/
|
||||
static BlockPos getHighestSpot(Level level, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
return NaturesAuraAPI.instance().getHighestAuraDrainSpot(level, pos, radius, defaultSpot);
|
||||
static BlockPos getHighestSpot(IWorld world, BlockPos pos, int radius, BlockPos defaultSpot) {
|
||||
return NaturesAuraAPI.instance().getHighestAuraDrainSpot((World) world, pos, radius, defaultSpot);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
package de.ellpeck.naturesaura.api.aura.chunk;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.chunk.LevelChunk;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
|
||||
public interface IDrainSpotEffect {
|
||||
|
||||
void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot);
|
||||
void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot);
|
||||
|
||||
boolean appliesHere(LevelChunk chunk, IAuraChunk auraChunk, IAuraType type);
|
||||
boolean appliesHere(Chunk chunk, IAuraChunk auraChunk, IAuraType type);
|
||||
|
||||
ResourceLocation getName();
|
||||
|
||||
default ActiveType isActiveHere(Player player, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot) {
|
||||
default ActiveType isActiveHere(PlayerEntity player, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot) {
|
||||
return ActiveType.INACTIVE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package de.ellpeck.naturesaura.api.aura.container;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
|
||||
public class BasicAuraContainer implements IAuraContainer {
|
||||
|
||||
|
@ -52,11 +52,11 @@ public class BasicAuraContainer implements IAuraContainer {
|
|||
return this.type == null || type.isSimilar(this.type);
|
||||
}
|
||||
|
||||
public void writeNBT(CompoundTag compound) {
|
||||
public void writeNBT(CompoundNBT compound) {
|
||||
compound.putInt("aura", this.aura);
|
||||
}
|
||||
|
||||
public void readNBT(CompoundTag compound) {
|
||||
public void readNBT(CompoundNBT compound) {
|
||||
this.aura = compound.getInt("aura");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.api.aura.container;
|
|||
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
|
||||
public class ItemAuraContainer implements IAuraContainer {
|
||||
|
||||
|
@ -38,7 +38,7 @@ public class ItemAuraContainer implements IAuraContainer {
|
|||
|
||||
private void setAura(int amount) {
|
||||
if (!this.stack.hasTag()) {
|
||||
this.stack.setTag(new CompoundTag());
|
||||
this.stack.setTag(new CompoundNBT());
|
||||
}
|
||||
this.stack.getTag().putInt("aura", amount);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package de.ellpeck.naturesaura.api.aura.type;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.util.RegistryKey;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
@ -15,12 +16,12 @@ public class BasicAuraType implements IAuraType {
|
|||
private final int priority;
|
||||
private final Set<ResourceLocation> dimensions = new HashSet<>();
|
||||
|
||||
public BasicAuraType(ResourceLocation name, ResourceKey<Level> dimension, int color, int priority) {
|
||||
public BasicAuraType(ResourceLocation name, RegistryKey<World> dimension, int color, int priority) {
|
||||
this.name = name;
|
||||
this.color = color;
|
||||
this.priority = priority;
|
||||
if (dimension != null)
|
||||
this.dimensions.add(dimension.location());
|
||||
this.dimensions.add(dimension.func_240901_a_());
|
||||
}
|
||||
|
||||
public BasicAuraType register() {
|
||||
|
@ -34,8 +35,8 @@ public class BasicAuraType implements IAuraType {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isPresentInLevel(Level level) {
|
||||
return this.dimensions.isEmpty() || this.dimensions.contains(level.dimension().location());
|
||||
public boolean isPresentInWorld(IWorld world) {
|
||||
return this.dimensions.isEmpty() || this.dimensions.contains(((World) world).func_234923_W_().func_240901_a_());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
package de.ellpeck.naturesaura.api.aura.type;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.IWorld;
|
||||
|
||||
public interface IAuraType {
|
||||
|
||||
static IAuraType forLevel(Level level) {
|
||||
static IAuraType forWorld(IWorld world) {
|
||||
IAuraType highestType = NaturesAuraAPI.TYPE_OTHER;
|
||||
for (IAuraType type : NaturesAuraAPI.AURA_TYPES.values())
|
||||
if (type.isPresentInLevel(level) && type.getPriority() > highestType.getPriority())
|
||||
if (type.isPresentInWorld(world) && type.getPriority() > highestType.getPriority())
|
||||
highestType = type;
|
||||
return highestType;
|
||||
}
|
||||
|
||||
ResourceLocation getName();
|
||||
|
||||
boolean isPresentInLevel(Level level);
|
||||
boolean isPresentInWorld(IWorld world);
|
||||
|
||||
int getColor();
|
||||
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
package de.ellpeck.naturesaura.api.misc;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.INBTSerializable;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
|
||||
public interface ILevelData extends ICapabilityProvider, INBTSerializable<CompoundTag> {
|
||||
|
||||
static ILevelData getLevelData(Level level) {
|
||||
return level.getCapability(NaturesAuraAPI.capLevelData, null).orElse(null);
|
||||
}
|
||||
|
||||
static ILevelData getOverworldData(Level level) {
|
||||
if (!level.isClientSide)
|
||||
return getLevelData(level.getServer().getLevel(Level.OVERWORLD));
|
||||
return getLevelData(level);
|
||||
}
|
||||
|
||||
IItemHandlerModifiable getEnderStorage(String name);
|
||||
|
||||
boolean isEnderStorageLocked(String name);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package de.ellpeck.naturesaura.api.misc;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.INBTSerializable;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
|
||||
public interface IWorldData extends ICapabilityProvider, INBTSerializable<CompoundNBT> {
|
||||
|
||||
static IWorldData getWorldData(World world) {
|
||||
return world.getCapability(NaturesAuraAPI.capWorldData, null).orElse(null);
|
||||
}
|
||||
|
||||
static IWorldData getOverworldData(World world) {
|
||||
if (!world.isRemote)
|
||||
return getWorldData(world.getServer().getWorld(World.field_234918_g_));
|
||||
return getWorldData(world);
|
||||
}
|
||||
|
||||
IItemHandlerModifiable getEnderStorage(String name);
|
||||
|
||||
boolean isEnderStorageLocked(String name);
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
package de.ellpeck.naturesaura.api.misc;
|
||||
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.random.WeightedEntry;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.WeightedRandom;
|
||||
|
||||
public class WeightedOre extends WeightedEntry.IntrusiveBase {
|
||||
public class WeightedOre extends WeightedRandom.Item {
|
||||
|
||||
public final ResourceLocation tag;
|
||||
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
package de.ellpeck.naturesaura.api.multiblock;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public interface IMultiblock {
|
||||
|
||||
boolean isComplete(Level level, BlockPos center);
|
||||
boolean isComplete(World world, BlockPos center);
|
||||
|
||||
boolean forEach(BlockPos center, char c, BiFunction<BlockPos, Matcher, Boolean> function);
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package de.ellpeck.naturesaura.api.multiblock;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.tags.Tag;
|
||||
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.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.tags.ITag;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class Matcher {
|
||||
|
||||
|
@ -18,11 +18,11 @@ public class Matcher {
|
|||
}
|
||||
|
||||
public static Matcher wildcard() {
|
||||
return new Matcher(Blocks.AIR.defaultBlockState(), null);
|
||||
return new Matcher(Blocks.AIR.getDefaultState(), null);
|
||||
}
|
||||
|
||||
public static Matcher tag(Block defaultBlock, Tag.Named<?> tag) {
|
||||
return new Matcher(defaultBlock.defaultBlockState(), (level, start, offset, pos, state, c) -> state.getBlock().getTags().contains(tag.getName()));
|
||||
public static Matcher tag(Block defaultBlock, ITag.INamedTag tag) {
|
||||
return new Matcher(defaultBlock.getDefaultState(), (world, start, offset, pos, state, c) -> state.getBlock().getTags().contains(tag.getName()));
|
||||
}
|
||||
|
||||
public BlockState getDefaultState() {
|
||||
|
@ -34,7 +34,6 @@ public class Matcher {
|
|||
}
|
||||
|
||||
public interface ICheck {
|
||||
|
||||
boolean matches(Level level, BlockPos start, BlockPos offset, BlockPos pos, BlockState state, char c);
|
||||
boolean matches(World world, BlockPos start, BlockPos offset, BlockPos pos, BlockState state, char c);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,14 +2,14 @@ package de.ellpeck.naturesaura.api.render;
|
|||
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public interface ITrinketItem {
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
void render(ItemStack stack, Player player, RenderType type, MatrixStack matrices, IRenderTypeBuffer buffer, int packedLight, boolean isHolding);
|
||||
void render(ItemStack stack, PlayerEntity player, RenderType type, MatrixStack matrices, IRenderTypeBuffer buffer, int packedLight, boolean isHolding);
|
||||
|
||||
enum RenderType {
|
||||
HEAD, BODY
|
||||
|
|
|
@ -2,15 +2,15 @@ package de.ellpeck.naturesaura.api.render;
|
|||
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public interface IVisualizable {
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos);
|
||||
AxisAlignedBB getVisualizationBounds(World world, BlockPos pos);
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
int getVisualizationColor(Level level, BlockPos pos);
|
||||
int getVisualizationColor(World world, BlockPos pos);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAncientLeaves;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAncientLeaves;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.*;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -11,11 +11,11 @@ import net.minecraft.block.material.Material;
|
|||
import net.minecraft.block.material.MaterialColor;
|
||||
import net.minecraft.client.renderer.color.IBlockColor;
|
||||
import net.minecraft.client.renderer.color.IItemColor;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -27,7 +27,7 @@ public class BlockAncientLeaves extends LeavesBlock implements IModItem, IColorP
|
|||
public BlockAncientLeaves() {
|
||||
super(Properties.create(Material.LEAVES, MaterialColor.PINK).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT));
|
||||
ModRegistry.add(this);
|
||||
ModRegistry.add(new ModTileType<>(BlockEntityAncientLeaves::new, this));
|
||||
ModRegistry.add(new ModTileType<>(TileEntityAncientLeaves::new, this));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -37,19 +37,19 @@ public class BlockAncientLeaves extends LeavesBlock implements IModItem, IColorP
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockEntity createBlockEntity(BlockState state, IBlockReader level) {
|
||||
return new BlockEntityAncientLeaves();
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new TileEntityAncientLeaves();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBlockEntity(BlockState state) {
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public IBlockColor getBlockColor() {
|
||||
return (state, levelIn, pos, tintIndex) -> 0xE55B97;
|
||||
return (state, worldIn, pos, tintIndex) -> 0xE55B97;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -60,12 +60,12 @@ public class BlockAncientLeaves extends LeavesBlock implements IModItem, IColorP
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
super.animateTick(stateIn, levelIn, pos, rand);
|
||||
if (rand.nextFloat() >= 0.95F && !levelIn.getBlockState(pos.down()).isOpaqueCube(levelIn, pos)) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityAncientLeaves) {
|
||||
if (((BlockEntityAncientLeaves) tile).getAuraContainer().getStoredAura() > 0) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
super.animateTick(stateIn, worldIn, pos, rand);
|
||||
if (rand.nextFloat() >= 0.95F && !worldIn.getBlockState(pos.down()).isOpaqueCube(worldIn, pos)) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityAncientLeaves) {
|
||||
if (((TileEntityAncientLeaves) tile).getAuraContainer().getStoredAura() > 0) {
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
pos.getX() + rand.nextDouble(), pos.getY(), pos.getZ() + rand.nextDouble(),
|
||||
0F, 0F, 0F, 0xCC4780,
|
||||
|
@ -79,13 +79,13 @@ public class BlockAncientLeaves extends LeavesBlock implements IModItem, IColorP
|
|||
}
|
||||
|
||||
@Override
|
||||
public void randomTick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) {
|
||||
super.randomTick(state, levelIn, pos, random);
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityAncientLeaves) {
|
||||
if (((BlockEntityAncientLeaves) tile).getAuraContainer().getStoredAura() <= 0) {
|
||||
levelIn.setBlockState(pos, ModBlocks.DECAYED_LEAVES.getDefaultState());
|
||||
public void randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
|
||||
super.randomTick(state, worldIn, pos, random);
|
||||
if (!worldIn.isRemote) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityAncientLeaves) {
|
||||
if (((TileEntityAncientLeaves) tile).getAuraContainer().getStoredAura() <= 0) {
|
||||
worldIn.setBlockState(pos, ModBlocks.DECAYED_LEAVES.getDefaultState());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.data.ItemModelGenerator;
|
||||
import de.ellpeck.naturesaura.gen.ModFeatures;
|
||||
import de.ellpeck.naturesaura.gen.LevelGenAncientTree;
|
||||
import de.ellpeck.naturesaura.gen.WorldGenAncientTree;
|
||||
import de.ellpeck.naturesaura.reg.*;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -12,9 +12,9 @@ import net.minecraft.state.StateContainer;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.event.ForgeEventFactory;
|
||||
|
||||
import java.util.Random;
|
||||
|
@ -29,17 +29,17 @@ public class BlockAncientSapling extends BushBlock implements IGrowable, IModIte
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomTick(BlockState state, ServerLevel level, BlockPos pos, Random random) {
|
||||
if (!level.isClientSide) {
|
||||
super.randomTick(state, level, pos, random);
|
||||
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||
if (!world.isRemote) {
|
||||
super.randomTick(state, world, pos, random);
|
||||
|
||||
if (level.getLight(pos.up()) >= 9 && random.nextInt(7) == 0) {
|
||||
this.grow(level, random, pos, state);
|
||||
if (world.getLight(pos.up()) >= 9 && random.nextInt(7) == 0) {
|
||||
this.grow(world, random, pos, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -55,21 +55,21 @@ public class BlockAncientSapling extends BushBlock implements IGrowable, IModIte
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean canGrow(IBlockReader levelIn, BlockPos pos, BlockState state, boolean isClient) {
|
||||
public boolean canGrow(IBlockReader worldIn, BlockPos pos, BlockState state, boolean isClient) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUseBonemeal(Level level, Random rand, BlockPos pos, BlockState state) {
|
||||
return level.rand.nextFloat() < 0.45F;
|
||||
public boolean canUseBonemeal(World world, Random rand, BlockPos pos, BlockState state) {
|
||||
return world.rand.nextFloat() < 0.45F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void grow(ServerLevel level, Random rand, BlockPos pos, BlockState state) {
|
||||
public void grow(ServerWorld world, Random rand, BlockPos pos, BlockState state) {
|
||||
if (state.get(SaplingBlock.STAGE) == 0) {
|
||||
level.setBlockState(pos, state.func_235896_a_(SaplingBlock.STAGE), 4);
|
||||
} else if (ForgeEventFactory.saplingGrowTree(level, rand, pos)) {
|
||||
ModFeatures.ANCIENT_TREE.func_241855_a(level, level.getChunkProvider().getChunkGenerator(), rand, pos, LevelGenAncientTree.CONFIG);
|
||||
world.setBlockState(pos, state.func_235896_a_(SaplingBlock.STAGE), 4);
|
||||
} else if (ForgeEventFactory.saplingGrowTree(world, rand, pos)) {
|
||||
ModFeatures.ANCIENT_TREE.func_241855_a(world, world.getChunkProvider().getChunkGenerator(), rand, pos, WorldGenAncientTree.CONFIG);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAnimalContainer;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAnimalContainer;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -21,7 +21,7 @@ public class BlockAnimalContainer extends BlockContainerImpl implements IVisuali
|
|||
private static final VoxelShape SHAPE = makeCuboidShape(5, 0, 5, 11, 13, 11);
|
||||
|
||||
public BlockAnimalContainer() {
|
||||
super("animal_container", BlockEntityAnimalContainer::new, Properties.from(Blocks.STONE));
|
||||
super("animal_container", TileEntityAnimalContainer::new, Properties.from(Blocks.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -30,16 +30,16 @@ public class BlockAnimalContainer extends BlockContainerImpl implements IVisuali
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityAnimalContainer) {
|
||||
int radius = ((BlockEntityAnimalContainer) tile).getRadius();
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityAnimalContainer) {
|
||||
int radius = ((TileEntityAnimalContainer) tile).getRadius();
|
||||
if (radius > 0)
|
||||
return new AxisAlignedBB(pos).grow(radius);
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ public class BlockAnimalContainer extends BlockContainerImpl implements IVisuali
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x42ddf5;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAnimalGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAnimalGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
|
@ -14,11 +14,11 @@ import net.minecraft.entity.INPC;
|
|||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.monster.IMob;
|
||||
import net.minecraft.entity.passive.AnimalEntity;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
@ -30,7 +30,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||
|
||||
public class BlockAnimalGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
public BlockAnimalGenerator() {
|
||||
super("animal_generator", BlockEntityAnimalGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
super("animal_generator", TileEntityAnimalGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
@ -38,9 +38,9 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
|
|||
@SubscribeEvent
|
||||
public void onLivingUpdate(LivingEvent.LivingUpdateEvent event) {
|
||||
LivingEntity entity = event.getEntityLiving();
|
||||
if (entity.level.isClientSide || entity.level.getGameTime() % 40 != 0 || !(entity instanceof AnimalEntity) || entity instanceof IMob || entity instanceof INPC)
|
||||
if (entity.world.isRemote || entity.world.getGameTime() % 40 != 0 || !(entity instanceof AnimalEntity) || entity instanceof IMob || entity instanceof INPC)
|
||||
return;
|
||||
CompoundTag data = entity.getPersistentData();
|
||||
CompoundNBT data = entity.getPersistentData();
|
||||
int timeAlive = data.getInt(NaturesAura.MOD_ID + ":time_alive");
|
||||
data.putInt(NaturesAura.MOD_ID + ":time_alive", timeAlive + 40);
|
||||
}
|
||||
|
@ -48,15 +48,15 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
|
|||
@SubscribeEvent
|
||||
public void onEntityDeath(LivingDeathEvent event) {
|
||||
LivingEntity entity = event.getEntityLiving();
|
||||
if (entity.level.isClientSide || !(entity instanceof AnimalEntity) || entity instanceof IMob || entity instanceof INPC)
|
||||
if (entity.world.isRemote || !(entity instanceof AnimalEntity) || entity instanceof IMob || entity instanceof INPC)
|
||||
return;
|
||||
BlockPos pos = entity.getPosition();
|
||||
Helper.getBlockEntitiesInArea(entity.level, pos, 5, tile -> {
|
||||
if (!(tile instanceof BlockEntityAnimalGenerator))
|
||||
Helper.getTileEntitiesInArea(entity.world, pos, 5, tile -> {
|
||||
if (!(tile instanceof TileEntityAnimalGenerator))
|
||||
return false;
|
||||
BlockEntityAnimalGenerator gen = (BlockEntityAnimalGenerator) tile;
|
||||
TileEntityAnimalGenerator gen = (TileEntityAnimalGenerator) tile;
|
||||
|
||||
CompoundTag data = entity.getPersistentData();
|
||||
CompoundNBT data = entity.getPersistentData();
|
||||
data.putBoolean(NaturesAura.MOD_ID + ":no_drops", true);
|
||||
|
||||
if (gen.isBusy())
|
||||
|
@ -67,14 +67,14 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
|
|||
float amountMod = child ? 0.667F : 1;
|
||||
|
||||
int timeAlive = data.getInt(NaturesAura.MOD_ID + ":time_alive");
|
||||
int time = Math.min(Mth.floor((timeAlive - 15000) / 500F * timeMod), 200);
|
||||
int amount = Math.min(Mth.floor((timeAlive - 8000) / 2F * amountMod), 25000);
|
||||
int time = Math.min(MathHelper.floor((timeAlive - 15000) / 500F * timeMod), 200);
|
||||
int amount = Math.min(MathHelper.floor((timeAlive - 8000) / 2F * amountMod), 25000);
|
||||
if (time <= 0 || amount <= 0)
|
||||
return false;
|
||||
gen.setGenerationValues(time, amount);
|
||||
|
||||
BlockPos genPos = gen.getPos();
|
||||
PacketHandler.sendToAllAround(entity.level, pos, 32, new PacketParticles(
|
||||
PacketHandler.sendToAllAround(entity.world, pos, 32, new PacketParticles(
|
||||
(float) entity.getPosX(), (float) entity.getPosY(), (float) entity.getPosZ(), PacketParticles.Type.ANIMAL_GEN_CONSUME,
|
||||
child ? 1 : 0,
|
||||
(int) (entity.getEyeHeight() * 10F),
|
||||
|
@ -100,13 +100,13 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(5);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x11377a;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAnimalSpawner;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAnimalSpawner;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
||||
public class BlockAnimalSpawner extends BlockContainerImpl {
|
||||
public BlockAnimalSpawner() {
|
||||
super("animal_spawner", BlockEntityAnimalSpawner::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
super("animal_spawner", TileEntityAnimalSpawner::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraBloom;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAuraBloom;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.data.ItemModelGenerator;
|
||||
import de.ellpeck.naturesaura.reg.*;
|
||||
|
@ -11,15 +11,15 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevelReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Arrays;
|
||||
|
@ -39,25 +39,25 @@ public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockS
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, ILevelReader levelIn, BlockPos pos) {
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
BlockPos down = pos.down();
|
||||
return this.isValidGround(levelIn.getBlockState(down), levelIn, down);
|
||||
return this.isValidGround(worldIn.getBlockState(down), worldIn, down);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isValidGround(BlockState state, IBlockReader levelIn, BlockPos pos) {
|
||||
protected boolean isValidGround(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
return Arrays.stream(this.allowedGround).anyMatch(state::isIn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntityCollision(BlockState state, Level levelIn, BlockPos pos, Entity entityIn) {
|
||||
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
|
||||
if (this == ModBlocks.AURA_CACTUS)
|
||||
entityIn.attackEntityFrom(DamageSource.CACTUS, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
Vector3d vec3d = state.getOffset(levelIn, pos);
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
Vector3d vec3d = state.getOffset(worldIn, pos);
|
||||
return SHAPE.withOffset(vec3d.x, vec3d.y, vec3d.z);
|
||||
}
|
||||
|
||||
|
@ -83,12 +83,12 @@ public class BlockAuraBloom extends BushBlock implements IModItem, ICustomBlockS
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockEntity createBlockEntity(BlockState state, IBlockReader level) {
|
||||
return new BlockEntityAuraBloom();
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new TileEntityAuraBloom();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBlockEntity(BlockState state) {
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraDetector;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAuraDetector;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockAuraDetector extends BlockContainerImpl {
|
||||
|
||||
public BlockAuraDetector() {
|
||||
super("aura_detector", BlockEntityAuraDetector::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
super("aura_detector", TileEntityAuraDetector::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -20,10 +20,10 @@ public class BlockAuraDetector extends BlockContainerImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getComparatorInputOverride(BlockState blockState, Level levelIn, BlockPos pos) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityAuraDetector)
|
||||
return ((BlockEntityAuraDetector) tile).redstonePower;
|
||||
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityAuraDetector)
|
||||
return ((TileEntityAuraDetector) tile).redstonePower;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraTimer;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAuraTimer;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderAuraTimer;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
|
@ -12,13 +12,13 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Tuple;
|
||||
|
@ -26,9 +26,9 @@ import net.minecraft.util.math.BlockPos;
|
|||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -36,12 +36,12 @@ import java.util.Random;
|
|||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockState, ITESRProvider<BlockEntityAuraTimer>, ICustomRenderType {
|
||||
public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockState, ITESRProvider<TileEntityAuraTimer>, ICustomRenderType {
|
||||
|
||||
private static final VoxelShape SHAPE = makeCuboidShape(1, 0, 1, 15, 15, 15);
|
||||
|
||||
public BlockAuraTimer() {
|
||||
super("aura_timer", BlockEntityAuraTimer::new, Properties.from(Blocks.SMOOTH_STONE));
|
||||
super("aura_timer", TileEntityAuraTimer::new, Properties.from(Blocks.SMOOTH_STONE));
|
||||
this.setDefaultState(this.getDefaultState().with(BlockStateProperties.POWERED, false));
|
||||
}
|
||||
|
||||
|
@ -51,13 +51,13 @@ public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockSt
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public Tuple<BlockEntityType<BlockEntityAuraTimer>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityAuraTimer>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityAuraTimer>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityAuraTimer>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.AURA_TIMER, () -> RenderAuraTimer::new);
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,7 @@ public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockSt
|
|||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult p_225533_6_) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult p_225533_6_) {
|
||||
return Helper.putStackOnTile(player, handIn, pos, 0, true);
|
||||
}
|
||||
|
||||
|
@ -82,15 +82,15 @@ public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockSt
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getWeakPower(BlockState state, IBlockReader level, BlockPos pos, Direction side) {
|
||||
public int getWeakPower(BlockState state, IBlockReader world, BlockPos pos, Direction side) {
|
||||
return state.get(BlockStateProperties.POWERED) ? 15 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) {
|
||||
super.tick(state, levelIn, pos, random);
|
||||
public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
|
||||
super.tick(state, worldIn, pos, random);
|
||||
if (state.get(BlockStateProperties.POWERED))
|
||||
levelIn.setBlockState(pos, state.with(BlockStateProperties.POWERED, false));
|
||||
worldIn.setBlockState(pos, state.with(BlockStateProperties.POWERED, false));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAutoCrafter;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAutoCrafter;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -16,7 +16,7 @@ public class BlockAutoCrafter extends BlockContainerImpl implements ICustomBlock
|
|||
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
|
||||
|
||||
public BlockAutoCrafter() {
|
||||
super("auto_crafter", BlockEntityAutoCrafter::new, Properties.create(Material.WOOD).hardnessAndResistance(1.5F).sound(SoundType.WOOD));
|
||||
super("auto_crafter", TileEntityAutoCrafter::new, Properties.create(Material.WOOD).hardnessAndResistance(1.5F).sound(SoundType.WOOD));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityBlastFurnaceBooster;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityBlastFurnaceBooster;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -13,15 +13,15 @@ import net.minecraft.state.StateContainer;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
public class BlockBlastFurnaceBooster extends BlockContainerImpl implements ICustomBlockState {
|
||||
public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING;
|
||||
private static final VoxelShape SHAPE = Shapes.create(1 / 16F, 0, 1 / 16F, 15 / 16F, 1, 15 / 16F);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(1 / 16F, 0, 1 / 16F, 15 / 16F, 1, 15 / 16F);
|
||||
|
||||
public BlockBlastFurnaceBooster() {
|
||||
super("blast_furnace_booster", BlockEntityBlastFurnaceBooster::new, Block.Properties.from(Blocks.BLAST_FURNACE).setLightLevel(s -> 0));
|
||||
super("blast_furnace_booster", TileEntityBlastFurnaceBooster::new, Block.Properties.from(Blocks.BLAST_FURNACE).setLightLevel(s -> 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -30,7 +30,7 @@ public class BlockBlastFurnaceBooster extends BlockContainerImpl implements ICus
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,8 @@ import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
||||
|
||||
public class BlockCatalyst extends BlockImpl implements ICustomBlockState {
|
||||
public static final BooleanProperty NETHER = BlockNatureAltar.NETHER;
|
||||
|
@ -20,7 +20,7 @@ public class BlockCatalyst extends BlockImpl implements ICustomBlockState {
|
|||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
boolean nether = IAuraType.forLevel(context.getLevel()).isSimilar(NaturesAuraAPI.TYPE_NETHER);
|
||||
boolean nether = IAuraType.forWorld(context.getWorld()).isSimilar(NaturesAuraAPI.TYPE_NETHER);
|
||||
return super.getStateForPlacement(context).with(NETHER, nether);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityChorusGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityChorusGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
|
||||
public class BlockChorusGenerator extends BlockContainerImpl implements ICustomBlockState {
|
||||
public BlockChorusGenerator() {
|
||||
super("chorus_generator", BlockEntityChorusGenerator::new, Properties.from(Blocks.END_STONE));
|
||||
super("chorus_generator", TileEntityChorusGenerator::new, Properties.from(Blocks.END_STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -4,7 +4,7 @@ import de.ellpeck.naturesaura.ModConfig;
|
|||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityChunkLoader;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityChunkLoader;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -12,15 +12,15 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -33,7 +33,7 @@ public class BlockChunkLoader extends BlockContainerImpl implements IVisualizabl
|
|||
private static final VoxelShape SHAPE = makeCuboidShape(4, 4, 4, 12, 12, 12);
|
||||
|
||||
public BlockChunkLoader() {
|
||||
super("chunk_loader", BlockEntityChunkLoader::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
super("chunk_loader", TileEntityChunkLoader::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -43,17 +43,17 @@ public class BlockChunkLoader extends BlockContainerImpl implements IVisualizabl
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityChunkLoader) {
|
||||
int range = ((BlockEntityChunkLoader) tile).range();
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityChunkLoader) {
|
||||
int range = ((TileEntityChunkLoader) tile).range();
|
||||
if (range > 0) {
|
||||
return new AxisAlignedBB(
|
||||
(pos.getX() - range) >> 4 << 4,
|
||||
0,
|
||||
(pos.getZ() - range) >> 4 << 4,
|
||||
((pos.getX() + range) >> 4 << 4) + 16,
|
||||
level.getHeight(),
|
||||
world.getHeight(),
|
||||
((pos.getZ() + range) >> 4 << 4) + 16);
|
||||
}
|
||||
}
|
||||
|
@ -62,28 +62,28 @@ public class BlockChunkLoader extends BlockContainerImpl implements IVisualizabl
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
if (!ModConfig.instance.chunkLoader.get())
|
||||
return;
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityChunkLoader) {
|
||||
int range = ((BlockEntityChunkLoader) tile).range();
|
||||
for (int i = Mth.ceil(range / 8F); i > 0; i--) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityChunkLoader) {
|
||||
int range = ((TileEntityChunkLoader) tile).range();
|
||||
for (int i = MathHelper.ceil(range / 8F); i > 0; i--) {
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
pos.getX() + levelIn.rand.nextFloat(), pos.getY() + levelIn.rand.nextFloat(), pos.getZ() + levelIn.rand.nextFloat(),
|
||||
0, 0, 0, 0xa12dff, 1F + levelIn.rand.nextFloat(), 100, 0, false, true);
|
||||
pos.getX() + worldIn.rand.nextFloat(), pos.getY() + worldIn.rand.nextFloat(), pos.getZ() + worldIn.rand.nextFloat(),
|
||||
0, 0, 0, 0xa12dff, 1F + worldIn.rand.nextFloat(), 100, 0, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0xc159f9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
|
@ -93,8 +93,8 @@ public class BlockChunkLoader extends BlockContainerImpl implements IVisualizabl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void addInformation(ItemStack stack, @Nullable IBlockReader levelIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
|
||||
super.addInformation(stack, levelIn, tooltip, flagIn);
|
||||
public void addInformation(ItemStack stack, @Nullable IBlockReader worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
|
||||
super.addInformation(stack, worldIn, tooltip, flagIn);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,42 +1,40 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityImpl;
|
||||
import de.ellpeck.naturesaura.reg.IModItem;
|
||||
import de.ellpeck.naturesaura.reg.ModRegistry;
|
||||
import de.ellpeck.naturesaura.reg.ModTileType;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.fluid.FluidState;
|
||||
import net.minecraft.fluid.Fluids;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.loot.LootContext;
|
||||
import net.minecraft.loot.LootParameters;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tags.FluidTags;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.level.block.BaseEntityBlock;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockContainerImpl extends BaseEntityBlock implements IModItem {
|
||||
public class BlockContainerImpl extends ContainerBlock implements IModItem {
|
||||
|
||||
private final String baseName;
|
||||
private final ModTileType<? extends BlockEntity> tileType;
|
||||
private final ModTileType<? extends TileEntity> tileType;
|
||||
|
||||
public BlockContainerImpl(String baseName, Supplier<BlockEntity> tileSupplier, Block.Properties properties) {
|
||||
public BlockContainerImpl(String baseName, Supplier<TileEntity> tileSupplier, Block.Properties properties) {
|
||||
super(properties);
|
||||
|
||||
this.baseName = baseName;
|
||||
|
@ -65,17 +63,17 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, ILevel levelIn, BlockPos currentPos, BlockPos facingPos) {
|
||||
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
|
||||
if (this.hasWaterlogging() && stateIn.get(BlockStateProperties.WATERLOGGED))
|
||||
levelIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(levelIn));
|
||||
return super.updatePostPlacement(stateIn, facing, facingState, levelIn, currentPos, facingPos);
|
||||
worldIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(worldIn));
|
||||
return super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
if (this.hasWaterlogging()) {
|
||||
FluidState state = context.getLevel().getFluidState(context.getPos());
|
||||
FluidState state = context.getWorld().getFluidState(context.getPos());
|
||||
return this.getDefaultState().with(BlockStateProperties.WATERLOGGED, state.isTagged(FluidTags.WATER) && state.getLevel() == 8);
|
||||
}
|
||||
return super.getStateForPlacement(context);
|
||||
|
@ -83,7 +81,7 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockEntity createNewBlockEntity(IBlockReader levelIn) {
|
||||
public TileEntity createNewTileEntity(IBlockReader worldIn) {
|
||||
return this.tileType.type.create();
|
||||
}
|
||||
|
||||
|
@ -98,20 +96,20 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerDestroy(ILevel levelIn, BlockPos pos, BlockState state) {
|
||||
super.onPlayerDestroy(levelIn, pos, state);
|
||||
public void onPlayerDestroy(IWorld worldIn, BlockPos pos, BlockState state) {
|
||||
super.onPlayerDestroy(worldIn, pos, state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
List<ItemStack> drops = super.getDrops(state, builder);
|
||||
|
||||
BlockEntity tile = builder.get(LootParameters.BLOCK_ENTITY);
|
||||
if (tile instanceof BlockEntityImpl) {
|
||||
TileEntity tile = builder.get(LootParameters.BLOCK_ENTITY);
|
||||
if (tile instanceof TileEntityImpl) {
|
||||
for (ItemStack stack : drops) {
|
||||
if (stack.getItem() != this.asItem())
|
||||
continue;
|
||||
((BlockEntityImpl) tile).modifyDrop(stack);
|
||||
((TileEntityImpl) tile).modifyDrop(stack);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -119,57 +117,57 @@ public class BlockContainerImpl extends BaseEntityBlock implements IModItem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, Level levelIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (state.getBlock() != newState.getBlock()) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityImpl)
|
||||
((BlockEntityImpl) tile).dropInventory();
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityImpl)
|
||||
((TileEntityImpl) tile).dropInventory();
|
||||
}
|
||||
super.onReplaced(state, levelIn, pos, newState, isMoving);
|
||||
super.onReplaced(state, worldIn, pos, newState, isMoving);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void harvestBlock(Level levelIn, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) {
|
||||
super.harvestBlock(levelIn, player, pos, state, te, stack);
|
||||
levelIn.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
public void harvestBlock(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack) {
|
||||
super.harvestBlock(worldIn, player, pos, state, te, stack);
|
||||
worldIn.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPlacedBy(Level levelIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityImpl)
|
||||
((BlockEntityImpl) tile).loadDataOnPlace(stack);
|
||||
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityImpl)
|
||||
((TileEntityImpl) tile).loadDataOnPlace(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockAdded(BlockState state, Level levelIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
this.updateRedstoneState(levelIn, pos);
|
||||
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
this.updateRedstoneState(worldIn, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void neighborChanged(BlockState state, Level levelIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
||||
this.updateRedstoneState(levelIn, pos);
|
||||
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
||||
this.updateRedstoneState(worldIn, pos);
|
||||
}
|
||||
|
||||
private void updateRedstoneState(Level level, BlockPos pos) {
|
||||
if (!level.isClientSide) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityImpl) {
|
||||
BlockEntityImpl impl = (BlockEntityImpl) tile;
|
||||
int newPower = level.getRedstonePowerFromNeighbors(pos);
|
||||
private void updateRedstoneState(World world, BlockPos pos) {
|
||||
if (!world.isRemote) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityImpl) {
|
||||
TileEntityImpl impl = (TileEntityImpl) tile;
|
||||
int newPower = world.getRedstonePowerFromNeighbors(pos);
|
||||
if (impl.redstonePower != newPower)
|
||||
level.getPendingBlockTicks().scheduleTick(pos, this, 4);
|
||||
world.getPendingBlockTicks().scheduleTick(pos, this, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) {
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityImpl) {
|
||||
BlockEntityImpl impl = (BlockEntityImpl) tile;
|
||||
int newPower = levelIn.getRedstonePowerFromNeighbors(pos);
|
||||
public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
|
||||
if (!worldIn.isRemote) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityImpl) {
|
||||
TileEntityImpl impl = (TileEntityImpl) tile;
|
||||
int newPower = worldIn.getRedstonePowerFromNeighbors(pos);
|
||||
if (impl.redstonePower != newPower)
|
||||
impl.onRedstonePowerChange(newPower);
|
||||
}
|
||||
|
|
|
@ -9,8 +9,8 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.function.Supplier;
|
||||
|
@ -22,9 +22,9 @@ public class BlockDecayedLeaves extends BlockImpl implements ICustomBlockState,
|
|||
}
|
||||
|
||||
@Override
|
||||
public void tick(BlockState state, ServerLevel level, BlockPos pos, Random random) {
|
||||
if (!level.isClientSide) {
|
||||
level.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
public void tick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
||||
if (!world.isRemote) {
|
||||
world.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ public class BlockDecayedLeaves extends BlockImpl implements ICustomBlockState,
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getOpacity(BlockState state, IBlockReader levelIn, BlockPos pos) {
|
||||
public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.minecart.AbstractMinecartEntity;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.state.EnumProperty;
|
||||
import net.minecraft.state.Property;
|
||||
|
@ -28,10 +28,10 @@ import net.minecraft.util.*;
|
|||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.gen.Heightmap;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.util.ITeleporter;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
@ -42,10 +42,10 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
|
|||
public static final EnumProperty<RailShape> SHAPE = BlockStateProperties.RAIL_SHAPE;
|
||||
|
||||
private final String name;
|
||||
private final RegistryKey<Level> goalDim;
|
||||
private final RegistryKey<Level>[] canUseDims;
|
||||
private final RegistryKey<World> goalDim;
|
||||
private final RegistryKey<World>[] canUseDims;
|
||||
|
||||
public BlockDimensionRail(String name, RegistryKey<Level> goalDim, RegistryKey<Level>... canUseDims) {
|
||||
public BlockDimensionRail(String name, RegistryKey<World> goalDim, RegistryKey<World>... canUseDims) {
|
||||
super(false, Properties.from(Blocks.RAIL));
|
||||
this.name = name;
|
||||
this.goalDim = goalDim;
|
||||
|
@ -54,77 +54,77 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
|
|||
ModRegistry.add(this);
|
||||
}
|
||||
|
||||
private boolean canUseHere(RegistryKey<Level> dimension) {
|
||||
for (RegistryKey<Level> dim : this.canUseDims)
|
||||
private boolean canUseHere(RegistryKey<World> dimension) {
|
||||
for (RegistryKey<World> dim : this.canUseDims)
|
||||
if (dim == dimension)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand hand, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() == ModItems.RANGE_VISUALIZER) {
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockPos goalPos = this.getGoalCoords(levelIn, pos);
|
||||
CompoundTag data = new CompoundTag();
|
||||
if (!worldIn.isRemote) {
|
||||
BlockPos goalPos = this.getGoalCoords(worldIn, pos);
|
||||
CompoundNBT data = new CompoundNBT();
|
||||
data.putString("dim", this.goalDim.func_240901_a_().toString());
|
||||
data.putLong("pos", goalPos.toLong());
|
||||
PacketHandler.sendTo(player, new PacketClient(0, data));
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
return InteractionResult.FAIL;
|
||||
return ActionResultType.FAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMinecartPass(BlockState state, Level level, BlockPos pos, AbstractMinecartEntity cart) {
|
||||
if (level.isClientSide)
|
||||
public void onMinecartPass(BlockState state, World world, BlockPos pos, AbstractMinecartEntity cart) {
|
||||
if (world.isRemote)
|
||||
return;
|
||||
if (cart.isBeingRidden())
|
||||
return;
|
||||
if (!this.canUseHere(level.func_234923_W_()))
|
||||
if (!this.canUseHere(world.func_234923_W_()))
|
||||
return;
|
||||
|
||||
AxisAlignedBB box = cart.getBoundingBox();
|
||||
PacketHandler.sendToAllAround(level, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, PacketParticles.Type.DIMENSION_RAIL, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F)));
|
||||
level.playSound(null, pos, SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.BLOCKS, 1F, 1F);
|
||||
PacketHandler.sendToAllAround(world, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, PacketParticles.Type.DIMENSION_RAIL, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F)));
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.BLOCKS, 1F, 1F);
|
||||
|
||||
BlockPos goalCoords = this.getGoalCoords(level, pos);
|
||||
cart.changeDimension(level.getServer().getLevel(this.goalDim), new ITeleporter() {
|
||||
BlockPos goalCoords = this.getGoalCoords(world, pos);
|
||||
cart.changeDimension(world.getServer().getWorld(this.goalDim), new ITeleporter() {
|
||||
@Override
|
||||
public Entity placeEntity(Entity entity, ServerLevel currentLevel, ServerLevel destLevel, float yaw, Function<Boolean, Entity> repositionEntity) {
|
||||
public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destWorld, float yaw, Function<Boolean, Entity> repositionEntity) {
|
||||
// repositionEntity always causes a NPE because why wouldn't it, so this is a fixed copy
|
||||
entity.level.getProfiler().endStartSection("reloading");
|
||||
Entity result = entity.getType().create(destLevel);
|
||||
entity.world.getProfiler().endStartSection("reloading");
|
||||
Entity result = entity.getType().create(destWorld);
|
||||
if (result != null) {
|
||||
result.copyDataFromOld(entity);
|
||||
destLevel.addFromAnotherDimension(result);
|
||||
destWorld.addFromAnotherDimension(result);
|
||||
result.moveToBlockPosAndAngles(goalCoords, yaw, result.rotationPitch);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(level, pos, 35, pos);
|
||||
IAuraChunk.getAuraChunk(level, spot).drainAura(spot, 50000);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(world, pos, 35, pos);
|
||||
IAuraChunk.getAuraChunk(world, spot).drainAura(spot, 50000);
|
||||
}
|
||||
|
||||
private BlockPos getGoalCoords(Level level, BlockPos pos) {
|
||||
MinecraftServer server = level.getServer();
|
||||
private BlockPos getGoalCoords(World world, BlockPos pos) {
|
||||
MinecraftServer server = world.getServer();
|
||||
if (this == ModBlocks.DIMENSION_RAIL_NETHER) {
|
||||
// travel to the nether from the overworld
|
||||
return new BlockPos(pos.getX() / 8, pos.getY() / 2, pos.getZ() / 8);
|
||||
} else if (this == ModBlocks.DIMENSION_RAIL_END) {
|
||||
// travel to the end from the overworld
|
||||
return ServerLevel.field_241108_a_.up(8);
|
||||
return ServerWorld.field_241108_a_.up(8);
|
||||
} else {
|
||||
if (level.func_234923_W_() == Level.field_234919_h_) {
|
||||
if (world.func_234923_W_() == World.field_234919_h_) {
|
||||
// travel to the overworld from the nether
|
||||
return new BlockPos(pos.getX() * 8, pos.getY() * 2, pos.getZ() * 8);
|
||||
} else {
|
||||
// travel to the overworld from the end
|
||||
ServerLevel overworld = server.getLevel(this.goalDim);
|
||||
ServerWorld overworld = server.getWorld(this.goalDim);
|
||||
BlockPos spawn = overworld.func_241135_u_();
|
||||
BlockPos ret = new BlockPos(spawn.getX(), 0, spawn.getZ());
|
||||
return ret.up(overworld.getHeight(Heightmap.Type.WORLD_SURFACE, spawn.getX(), spawn.getZ()));
|
||||
|
@ -138,12 +138,12 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlexibleRail(BlockState state, IBlockReader level, BlockPos pos) {
|
||||
public boolean isFlexibleRail(BlockState state, IBlockReader world, BlockPos pos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canMakeSlopes(BlockState state, IBlockReader level, BlockPos pos) {
|
||||
public boolean canMakeSlopes(BlockState state, IBlockReader world, BlockPos pos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEndFlower;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityEndFlower;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.data.ItemModelGenerator;
|
||||
import de.ellpeck.naturesaura.reg.*;
|
||||
|
@ -9,21 +9,21 @@ import net.minecraft.block.material.Material;
|
|||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.boss.dragon.EnderDragonEntity;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.fluid.FluidState;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.loot.LootContext;
|
||||
import net.minecraft.loot.LootParameters;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevelReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.gen.Heightmap;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.gen.Heightmap;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
@ -40,44 +40,44 @@ public class BlockEndFlower extends BushBlock implements IModItem, ICustomBlockS
|
|||
super(Properties.create(Material.PLANTS).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.PLANT));
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
ModRegistry.add(this);
|
||||
ModRegistry.add(new ModTileType<>(BlockEntityEndFlower::new, this));
|
||||
ModRegistry.add(new ModTileType<>(TileEntityEndFlower::new, this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
Vector3d vec3d = state.getOffset(levelIn, pos);
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
Vector3d vec3d = state.getOffset(worldIn, pos);
|
||||
return SHAPE.withOffset(vec3d.x, vec3d.y, vec3d.z);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onDragonTick(LivingUpdateEvent event) {
|
||||
LivingEntity living = event.getEntityLiving();
|
||||
if (living.level.isClientSide || !(living instanceof EnderDragonEntity))
|
||||
if (living.world.isRemote || !(living instanceof EnderDragonEntity))
|
||||
return;
|
||||
EnderDragonEntity dragon = (EnderDragonEntity) living;
|
||||
if (dragon.deathTicks < 150 || dragon.deathTicks % 10 != 0)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
int x = dragon.level.rand.nextInt(256) - 128;
|
||||
int z = dragon.level.rand.nextInt(256) - 128;
|
||||
BlockPos pos = new BlockPos(x, dragon.level.getHeight(Heightmap.Type.WORLD_SURFACE, x, z), z);
|
||||
if (!dragon.level.isBlockLoaded(pos))
|
||||
int x = dragon.world.rand.nextInt(256) - 128;
|
||||
int z = dragon.world.rand.nextInt(256) - 128;
|
||||
BlockPos pos = new BlockPos(x, dragon.world.getHeight(Heightmap.Type.WORLD_SURFACE, x, z), z);
|
||||
if (!dragon.world.isBlockLoaded(pos))
|
||||
continue;
|
||||
if (dragon.level.getBlockState(pos.down()).getBlock() != Blocks.END_STONE)
|
||||
if (dragon.world.getBlockState(pos.down()).getBlock() != Blocks.END_STONE)
|
||||
continue;
|
||||
dragon.level.setBlockState(pos, this.getDefaultState());
|
||||
dragon.world.setBlockState(pos, this.getDefaultState());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isValidGround(BlockState state, IBlockReader levelIn, BlockPos pos) {
|
||||
protected boolean isValidGround(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
return state.getBlock() == Blocks.END_STONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, ILevelReader levelIn, BlockPos pos) {
|
||||
return levelIn.getBlockState(pos.down()).getBlock() == Blocks.END_STONE;
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
return worldIn.getBlockState(pos.down()).getBlock() == Blocks.END_STONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -87,30 +87,30 @@ public class BlockEndFlower extends BushBlock implements IModItem, ICustomBlockS
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockEntity createBlockEntity(BlockState state, IBlockReader level) {
|
||||
return new BlockEntityEndFlower();
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new TileEntityEndFlower();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasBlockEntity(BlockState state) {
|
||||
public boolean hasTileEntity(BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) {
|
||||
return willHarvest || super.removedByPlayer(state, level, pos, player, willHarvest, fluid);
|
||||
public boolean removedByPlayer(BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, FluidState fluid) {
|
||||
return willHarvest || super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void harvestBlock(Level levelIn, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) {
|
||||
super.harvestBlock(levelIn, player, pos, state, te, stack);
|
||||
levelIn.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
public void harvestBlock(World worldIn, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity te, ItemStack stack) {
|
||||
super.harvestBlock(worldIn, player, pos, state, te, stack);
|
||||
worldIn.setBlockState(pos, Blocks.AIR.getDefaultState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) {
|
||||
BlockEntity tile = builder.get(LootParameters.BLOCK_ENTITY);
|
||||
if (tile instanceof BlockEntityEndFlower && ((BlockEntityEndFlower) tile).isDrainMode)
|
||||
TileEntity tile = builder.get(LootParameters.BLOCK_ENTITY);
|
||||
if (tile instanceof TileEntityEndFlower && ((TileEntityEndFlower) tile).isDrainMode)
|
||||
return NonNullList.create();
|
||||
return super.getDrops(state, builder);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityEnderCrate;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderEnderCrate;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.items.ModItems;
|
||||
|
@ -13,19 +13,19 @@ import net.minecraft.block.AnvilBlock;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.ServerPlayer;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.particles.ParticleTypes;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -33,8 +33,8 @@ import net.minecraft.util.math.BlockRayTraceResult;
|
|||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.util.text.StringTextComponent;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
@ -50,13 +50,13 @@ import java.util.Random;
|
|||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider<BlockEntityEnderCrate>, ICustomBlockState {
|
||||
public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider<TileEntityEnderCrate>, ICustomBlockState {
|
||||
|
||||
// This is terrible but I can't see a better solution right now so oh well
|
||||
private static final ThreadLocal<WeakReference<Level>> CACHED_WORLD = new ThreadLocal<>();
|
||||
private static final ThreadLocal<WeakReference<World>> CACHED_WORLD = new ThreadLocal<>();
|
||||
|
||||
public BlockEnderCrate() {
|
||||
super("ender_crate", BlockEntityEnderCrate::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).setLightLevel(s -> 7).sound(SoundType.STONE));
|
||||
super("ender_crate", TileEntityEnderCrate::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).setLightLevel(s -> 7).sound(SoundType.STONE));
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
@ -79,18 +79,18 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
|
|||
|
||||
@SubscribeEvent
|
||||
public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
|
||||
Level level = event.getLevel();
|
||||
World world = event.getWorld();
|
||||
BlockPos pos = event.getPos();
|
||||
BlockState state = level.getBlockState(pos);
|
||||
BlockState state = world.getBlockState(pos);
|
||||
if (state.getBlock() instanceof AnvilBlock) {
|
||||
CACHED_WORLD.set(new WeakReference<>(level));
|
||||
CACHED_WORLD.set(new WeakReference<>(world));
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onAnvilUpdate(AnvilUpdateEvent event) {
|
||||
WeakReference<Level> level = CACHED_WORLD.get();
|
||||
if (level == null || level.get() == null)
|
||||
WeakReference<World> world = CACHED_WORLD.get();
|
||||
if (world == null || world.get() == null)
|
||||
return;
|
||||
ItemStack stack = event.getLeft();
|
||||
if (stack.getItem() != Item.getItemFromBlock(this) && stack.getItem() != ModItems.ENDER_ACCESS)
|
||||
|
@ -101,7 +101,7 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
|
|||
String name = event.getName();
|
||||
if (name == null || name.isEmpty())
|
||||
return;
|
||||
if (ILevelData.getOverworldData(level.get()).isEnderStorageLocked(name))
|
||||
if (IWorldData.getOverworldData(world.get()).isEnderStorageLocked(name))
|
||||
return;
|
||||
ItemStack output = stack.copy();
|
||||
output.getOrCreateTag().putString(NaturesAura.MOD_ID + ":ender_name", name);
|
||||
|
@ -111,29 +111,29 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
|
|||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityEnderCrate) {
|
||||
BlockEntityEnderCrate crate = (BlockEntityEnderCrate) tile;
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
if (!worldIn.isRemote) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityEnderCrate) {
|
||||
TileEntityEnderCrate crate = (TileEntityEnderCrate) tile;
|
||||
if (crate.canOpen()) {
|
||||
crate.drainAura(2500);
|
||||
NetworkHooks.openGui((ServerPlayer) player, crate, pos);
|
||||
NetworkHooks.openGui((ServerPlayerEntity) player, crate, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void addInformation(ItemStack stack, @Nullable IBlockReader levelIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
|
||||
public void addInformation(ItemStack stack, @Nullable IBlockReader worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn) {
|
||||
addEnderNameInfo(stack, tooltip);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
int j = rand.nextInt(2) * 2 - 1;
|
||||
int k = rand.nextInt(2) * 2 - 1;
|
||||
|
@ -143,12 +143,12 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
|
|||
double d3 = rand.nextFloat() * (float) j;
|
||||
double d4 = ((double) rand.nextFloat() - 0.5D) * 0.125D;
|
||||
double d5 = rand.nextFloat() * (float) k;
|
||||
levelIn.addParticle(ParticleTypes.PORTAL, d0, d1, d2, d3, d4, d5);
|
||||
worldIn.addParticle(ParticleTypes.PORTAL, d0, d1, d2, d3, d4, d5);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityEnderCrate>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityEnderCrate>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityEnderCrate>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityEnderCrate>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.ENDER_CRATE, () -> RenderEnderCrate::new);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityFieldCreator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityFieldCreator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import de.ellpeck.naturesaura.reg.ICustomRenderType;
|
||||
|
@ -10,15 +10,15 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.text.TranslationTextComponent;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -27,28 +27,28 @@ import java.util.function.Supplier;
|
|||
|
||||
public class BlockFieldCreator extends BlockContainerImpl implements ICustomBlockState, ICustomRenderType {
|
||||
public BlockFieldCreator() {
|
||||
super("field_creator", BlockEntityFieldCreator::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).notSolid().sound(SoundType.STONE));
|
||||
super("field_creator", TileEntityFieldCreator::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).notSolid().sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult p_225533_6_) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityFieldCreator) {
|
||||
if (!levelIn.isClientSide) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult p_225533_6_) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityFieldCreator) {
|
||||
if (!worldIn.isRemote) {
|
||||
String key = NaturesAura.MOD_ID + ":field_creator_pos";
|
||||
CompoundTag compound = player.getPersistentData();
|
||||
CompoundNBT compound = player.getPersistentData();
|
||||
if (!player.isSneaking() && compound.contains(key)) {
|
||||
BlockPos stored = BlockPos.fromLong(compound.getLong(key));
|
||||
BlockEntityFieldCreator creator = (BlockEntityFieldCreator) tile;
|
||||
TileEntityFieldCreator creator = (TileEntityFieldCreator) tile;
|
||||
if (!pos.equals(stored)) {
|
||||
if (creator.isCloseEnough(stored)) {
|
||||
BlockEntity otherTile = levelIn.getBlockEntity(stored);
|
||||
if (otherTile instanceof BlockEntityFieldCreator) {
|
||||
TileEntity otherTile = worldIn.getTileEntity(stored);
|
||||
if (otherTile instanceof TileEntityFieldCreator) {
|
||||
creator.connectionOffset = stored.subtract(pos);
|
||||
creator.isMain = true;
|
||||
creator.sendToClients();
|
||||
|
||||
BlockEntityFieldCreator otherCreator = (BlockEntityFieldCreator) otherTile;
|
||||
TileEntityFieldCreator otherCreator = (TileEntityFieldCreator) otherTile;
|
||||
otherCreator.connectionOffset = pos.subtract(stored);
|
||||
otherCreator.isMain = false;
|
||||
otherCreator.sendToClients();
|
||||
|
@ -66,17 +66,17 @@ public class BlockFieldCreator extends BlockContainerImpl implements ICustomBloc
|
|||
player.sendStatusMessage(new TranslationTextComponent("info." + NaturesAura.MOD_ID + ".stored_pos"), true);
|
||||
}
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
} else
|
||||
return InteractionResult.FAIL;
|
||||
return ActionResultType.FAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityFieldCreator) {
|
||||
BlockEntityFieldCreator creator = (BlockEntityFieldCreator) tile;
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityFieldCreator) {
|
||||
TileEntityFieldCreator creator = (TileEntityFieldCreator) tile;
|
||||
if (creator.isCharged) {
|
||||
BlockPos connected = creator.getConnectedPos();
|
||||
if (connected != null)
|
||||
|
|
|
@ -1,31 +1,31 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityFireworkGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityFireworkGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockFireworkGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
public BlockFireworkGenerator() {
|
||||
super("firework_generator", BlockEntityFireworkGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
super("firework_generator", TileEntityFireworkGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(4);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0xa442f4;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityFlowerGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityFlowerGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockFlowerGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
|
||||
public BlockFlowerGenerator() {
|
||||
super("flower_generator", BlockEntityFlowerGenerator::new, Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(2F));
|
||||
super("flower_generator", TileEntityFlowerGenerator::new, Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(2F));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(3, 1, 3);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0xffed2b;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityFurnaceHeater;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityFurnaceHeater;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -11,13 +11,13 @@ import net.minecraft.item.BlockItemUseContext;
|
|||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.ToolType;
|
||||
|
@ -38,7 +38,7 @@ public class BlockFurnaceHeater extends BlockContainerImpl implements ICustomBlo
|
|||
};
|
||||
|
||||
public BlockFurnaceHeater() {
|
||||
super("furnace_heater", BlockEntityFurnaceHeater::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).harvestLevel(1).harvestTool(ToolType.PICKAXE));
|
||||
super("furnace_heater", TileEntityFurnaceHeater::new, Properties.create(Material.ROCK).hardnessAndResistance(3F).harvestLevel(1).harvestTool(ToolType.PICKAXE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -48,9 +48,9 @@ public class BlockFurnaceHeater extends BlockContainerImpl implements ICustomBlo
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityFurnaceHeater && ((BlockEntityFurnaceHeater) tile).isActive) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityFurnaceHeater && ((TileEntityFurnaceHeater) tile).isActive) {
|
||||
Direction facing = stateIn.get(FACING);
|
||||
|
||||
float x;
|
||||
|
@ -80,7 +80,7 @@ public class BlockFurnaceHeater extends BlockContainerImpl implements ICustomBlo
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPES[state.get(FACING).getIndex()];
|
||||
}
|
||||
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityGeneratorLimitRemover;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityGeneratorLimitRemover;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderGeneratorLimitRemover;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import de.ellpeck.naturesaura.reg.ITESRProvider;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.Tuple;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockGeneratorLimitRemover extends BlockContainerImpl implements ITESRProvider<BlockEntityGeneratorLimitRemover>, ICustomBlockState {
|
||||
public class BlockGeneratorLimitRemover extends BlockContainerImpl implements ITESRProvider<TileEntityGeneratorLimitRemover>, ICustomBlockState {
|
||||
|
||||
public BlockGeneratorLimitRemover() {
|
||||
super("generator_limit_remover", BlockEntityGeneratorLimitRemover::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
super("generator_limit_remover", TileEntityGeneratorLimitRemover::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityGeneratorLimitRemover>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityGeneratorLimitRemover>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityGeneratorLimitRemover>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityGeneratorLimitRemover>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.GENERATOR_LIMIT_REMOVER, () -> RenderGeneratorLimitRemover::new);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,11 +21,11 @@ import net.minecraft.util.Direction;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.ILevelReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
@ -71,39 +71,39 @@ public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock,
|
|||
|
||||
@Override
|
||||
public IBlockColor getBlockColor() {
|
||||
return (state, levelIn, pos, tintIndex) -> 0xf4cb42;
|
||||
return (state, worldIn, pos, tintIndex) -> 0xf4cb42;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPES[getShapeIndex(state)];
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
IBlockReader iblockreader = context.getLevel();
|
||||
IBlockReader iblockreader = context.getWorld();
|
||||
BlockPos blockpos = context.getPos();
|
||||
return this.getDefaultState().with(WEST, this.getSide(iblockreader, blockpos, Direction.WEST)).with(EAST, this.getSide(iblockreader, blockpos, Direction.EAST)).with(NORTH, this.getSide(iblockreader, blockpos, Direction.NORTH)).with(SOUTH, this.getSide(iblockreader, blockpos, Direction.SOUTH));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, ILevel levelIn, BlockPos currentPos, BlockPos facingPos) {
|
||||
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, BlockPos facingPos) {
|
||||
if (facing == Direction.DOWN) {
|
||||
return stateIn;
|
||||
} else {
|
||||
return facing == Direction.UP ? stateIn.with(WEST, this.getSide(levelIn, currentPos, Direction.WEST)).with(EAST, this.getSide(levelIn, currentPos, Direction.EAST)).with(NORTH, this.getSide(levelIn, currentPos, Direction.NORTH)).with(SOUTH, this.getSide(levelIn, currentPos, Direction.SOUTH)) : stateIn.with(RedstoneWireBlock.FACING_PROPERTY_MAP.get(facing), this.getSide(levelIn, currentPos, facing));
|
||||
return facing == Direction.UP ? stateIn.with(WEST, this.getSide(worldIn, currentPos, Direction.WEST)).with(EAST, this.getSide(worldIn, currentPos, Direction.EAST)).with(NORTH, this.getSide(worldIn, currentPos, Direction.NORTH)).with(SOUTH, this.getSide(worldIn, currentPos, Direction.SOUTH)) : stateIn.with(RedstoneWireBlock.FACING_PROPERTY_MAP.get(facing), this.getSide(worldIn, currentPos, facing));
|
||||
}
|
||||
}
|
||||
|
||||
private RedstoneSide getSide(IBlockReader levelIn, BlockPos pos, Direction face) {
|
||||
private RedstoneSide getSide(IBlockReader worldIn, BlockPos pos, Direction face) {
|
||||
BlockPos blockpos = pos.offset(face);
|
||||
BlockState blockstate = levelIn.getBlockState(blockpos);
|
||||
BlockState blockstate = worldIn.getBlockState(blockpos);
|
||||
BlockPos blockpos1 = pos.up();
|
||||
BlockState blockstate1 = levelIn.getBlockState(blockpos1);
|
||||
if (!blockstate1.isNormalCube(levelIn, blockpos1)) {
|
||||
boolean flag = blockstate.isSolidSide(levelIn, blockpos, Direction.UP) || blockstate.getBlock() == Blocks.HOPPER;
|
||||
if (flag && this.canConnectTo(levelIn.getBlockState(blockpos.up()))) {
|
||||
if (blockstate.hasOpaqueCollisionShape(levelIn, blockpos)) {
|
||||
BlockState blockstate1 = worldIn.getBlockState(blockpos1);
|
||||
if (!blockstate1.isNormalCube(worldIn, blockpos1)) {
|
||||
boolean flag = blockstate.isSolidSide(worldIn, blockpos, Direction.UP) || blockstate.getBlock() == Blocks.HOPPER;
|
||||
if (flag && this.canConnectTo(worldIn.getBlockState(blockpos.up()))) {
|
||||
if (blockstate.hasOpaqueCollisionShape(worldIn, blockpos)) {
|
||||
return RedstoneSide.UP;
|
||||
}
|
||||
|
||||
|
@ -111,7 +111,7 @@ public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock,
|
|||
}
|
||||
}
|
||||
|
||||
return !this.canConnectTo(blockstate) && (blockstate.isNormalCube(levelIn, blockpos) || !this.canConnectTo(levelIn.getBlockState(blockpos.down()))) ? RedstoneSide.NONE : RedstoneSide.SIDE;
|
||||
return !this.canConnectTo(blockstate) && (blockstate.isNormalCube(worldIn, blockpos) || !this.canConnectTo(worldIn.getBlockState(blockpos.down()))) ? RedstoneSide.NONE : RedstoneSide.SIDE;
|
||||
}
|
||||
|
||||
protected boolean canConnectTo(BlockState blockState) {
|
||||
|
@ -120,32 +120,32 @@ public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock,
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidPosition(BlockState state, ILevelReader levelIn, BlockPos pos) {
|
||||
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
|
||||
BlockPos blockpos = pos.down();
|
||||
BlockState blockstate = levelIn.getBlockState(blockpos);
|
||||
return blockstate.isSolidSide(levelIn, blockpos, Direction.UP) || blockstate.getBlock() == Blocks.HOPPER;
|
||||
BlockState blockstate = worldIn.getBlockState(blockpos);
|
||||
return blockstate.isSolidSide(worldIn, blockpos, Direction.UP) || blockstate.getBlock() == Blocks.HOPPER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getCollisionShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
return Shapes.empty();
|
||||
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return VoxelShapes.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockAdded(BlockState state, Level levelIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
if (oldState.getBlock() != state.getBlock() && !levelIn.isClientSide) {
|
||||
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
|
||||
if (oldState.getBlock() != state.getBlock() && !worldIn.isRemote) {
|
||||
for (Direction direction : Direction.Plane.VERTICAL) {
|
||||
levelIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
worldIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
}
|
||||
for (Direction direction1 : Direction.Plane.HORIZONTAL) {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, pos.offset(direction1));
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, pos.offset(direction1));
|
||||
}
|
||||
for (Direction direction2 : Direction.Plane.HORIZONTAL) {
|
||||
BlockPos blockpos = pos.offset(direction2);
|
||||
if (levelIn.getBlockState(blockpos).isNormalCube(levelIn, blockpos)) {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, blockpos.up());
|
||||
if (worldIn.getBlockState(blockpos).isNormalCube(worldIn, blockpos)) {
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, blockpos.up());
|
||||
} else {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, blockpos.down());
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, blockpos.down());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,22 +153,22 @@ public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock,
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, Level levelIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (!isMoving && state.getBlock() != newState.getBlock()) {
|
||||
super.onReplaced(state, levelIn, pos, newState, isMoving);
|
||||
if (!levelIn.isClientSide) {
|
||||
super.onReplaced(state, worldIn, pos, newState, isMoving);
|
||||
if (!worldIn.isRemote) {
|
||||
for (Direction direction : Direction.values()) {
|
||||
levelIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
worldIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
}
|
||||
for (Direction direction1 : Direction.Plane.HORIZONTAL) {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, pos.offset(direction1));
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, pos.offset(direction1));
|
||||
}
|
||||
for (Direction direction2 : Direction.Plane.HORIZONTAL) {
|
||||
BlockPos blockpos = pos.offset(direction2);
|
||||
if (levelIn.getBlockState(blockpos).isNormalCube(levelIn, blockpos)) {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, blockpos.up());
|
||||
if (worldIn.getBlockState(blockpos).isNormalCube(worldIn, blockpos)) {
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, blockpos.up());
|
||||
} else {
|
||||
this.notifyWireNeighborsOfStateChange(levelIn, blockpos.down());
|
||||
this.notifyWireNeighborsOfStateChange(worldIn, blockpos.down());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,47 +177,47 @@ public class BlockGoldPowder extends BlockImpl implements IColorProvidingBlock,
|
|||
}
|
||||
|
||||
@Override
|
||||
public void neighborChanged(BlockState state, Level levelIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
||||
if (!levelIn.isClientSide) {
|
||||
if (!state.isValidPosition(levelIn, pos)) {
|
||||
spawnDrops(state, levelIn, pos);
|
||||
levelIn.removeBlock(pos, false);
|
||||
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
||||
if (!worldIn.isRemote) {
|
||||
if (!state.isValidPosition(worldIn, pos)) {
|
||||
spawnDrops(state, worldIn, pos);
|
||||
worldIn.removeBlock(pos, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDiagonalNeighbors(BlockState state, ILevel levelIn, BlockPos pos, int flags, int recursionLeft) {
|
||||
public void updateDiagonalNeighbors(BlockState state, IWorld worldIn, BlockPos pos, int flags, int recursionLeft) {
|
||||
BlockPos.Mutable pool = new BlockPos.Mutable();
|
||||
for (Direction direction : Direction.Plane.HORIZONTAL) {
|
||||
RedstoneSide redstoneside = state.get(RedstoneWireBlock.FACING_PROPERTY_MAP.get(direction));
|
||||
if (redstoneside != RedstoneSide.NONE && levelIn.getBlockState(pool.setPos(pos).move(direction)).getBlock() != this) {
|
||||
if (redstoneside != RedstoneSide.NONE && worldIn.getBlockState(pool.setPos(pos).move(direction)).getBlock() != this) {
|
||||
pool.move(Direction.DOWN);
|
||||
BlockState blockstate = levelIn.getBlockState(pool);
|
||||
BlockState blockstate = worldIn.getBlockState(pool);
|
||||
if (blockstate.getBlock() != Blocks.OBSERVER) {
|
||||
BlockPos blockpos = pool.offset(direction.getOpposite());
|
||||
BlockState blockstate1 = blockstate.updatePostPlacement(direction.getOpposite(), levelIn.getBlockState(blockpos), levelIn, pool, blockpos);
|
||||
replaceBlock(blockstate, blockstate1, levelIn, pool, flags);
|
||||
BlockState blockstate1 = blockstate.updatePostPlacement(direction.getOpposite(), worldIn.getBlockState(blockpos), worldIn, pool, blockpos);
|
||||
replaceBlock(blockstate, blockstate1, worldIn, pool, flags);
|
||||
}
|
||||
|
||||
pool.setPos(pos).move(direction).move(Direction.UP);
|
||||
BlockState blockstate3 = levelIn.getBlockState(pool);
|
||||
BlockState blockstate3 = worldIn.getBlockState(pool);
|
||||
if (blockstate3.getBlock() != Blocks.OBSERVER) {
|
||||
BlockPos blockpos1 = pool.offset(direction.getOpposite());
|
||||
BlockState blockstate2 = blockstate3.updatePostPlacement(direction.getOpposite(), levelIn.getBlockState(blockpos1), levelIn, pool, blockpos1);
|
||||
replaceBlock(blockstate3, blockstate2, levelIn, pool, flags);
|
||||
BlockState blockstate2 = blockstate3.updatePostPlacement(direction.getOpposite(), worldIn.getBlockState(blockpos1), worldIn, pool, blockpos1);
|
||||
replaceBlock(blockstate3, blockstate2, worldIn, pool, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void notifyWireNeighborsOfStateChange(Level levelIn, BlockPos pos) {
|
||||
if (levelIn.getBlockState(pos).getBlock() == this) {
|
||||
levelIn.notifyNeighborsOfStateChange(pos, this);
|
||||
private void notifyWireNeighborsOfStateChange(World worldIn, BlockPos pos) {
|
||||
if (worldIn.getBlockState(pos).getBlock() == this) {
|
||||
worldIn.notifyNeighborsOfStateChange(pos, this);
|
||||
|
||||
for (Direction direction : Direction.values()) {
|
||||
levelIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
worldIn.notifyNeighborsOfStateChange(pos.offset(direction), this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,9 +16,9 @@ import net.minecraft.state.IntegerProperty;
|
|||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.biome.BiomeColors;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeColors;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -34,11 +34,11 @@ public class BlockGoldenLeaves extends LeavesBlock implements IModItem, IColorPr
|
|||
ModRegistry.add(this);
|
||||
}
|
||||
|
||||
public static boolean convert(Level level, BlockPos pos) {
|
||||
BlockState state = level.getBlockState(pos);
|
||||
public static boolean convert(World world, BlockPos pos) {
|
||||
BlockState state = world.getBlockState(pos);
|
||||
if (state.getBlock() instanceof LeavesBlock && !(state.getBlock() instanceof BlockAncientLeaves || state.getBlock() instanceof BlockGoldenLeaves)) {
|
||||
if (!level.isClientSide) {
|
||||
level.setBlockState(pos, ModBlocks.GOLDEN_LEAVES.getDefaultState()
|
||||
if (!world.isRemote) {
|
||||
world.setBlockState(pos, ModBlocks.GOLDEN_LEAVES.getDefaultState()
|
||||
.with(DISTANCE, state.hasProperty(DISTANCE) ? state.get(DISTANCE) : 1)
|
||||
.with(PERSISTENT, state.hasProperty(PERSISTENT) ? state.get(PERSISTENT) : false));
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ public class BlockGoldenLeaves extends LeavesBlock implements IModItem, IColorPr
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
if (stateIn.get(STAGE) == HIGHEST_STAGE && rand.nextFloat() >= 0.75F)
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
pos.getX() + rand.nextFloat(),
|
||||
|
@ -73,10 +73,10 @@ public class BlockGoldenLeaves extends LeavesBlock implements IModItem, IColorPr
|
|||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public IBlockColor getBlockColor() {
|
||||
return (state, levelIn, pos, tintIndex) -> {
|
||||
return (state, worldIn, pos, tintIndex) -> {
|
||||
int color = 0xF2FF00;
|
||||
if (state != null && levelIn != null && pos != null) {
|
||||
int foliage = BiomeColors.getFoliageColor(levelIn, pos);
|
||||
if (state != null && worldIn != null && pos != null) {
|
||||
int foliage = BiomeColors.getFoliageColor(worldIn, pos);
|
||||
return Helper.blendColors(color, foliage, state.get(STAGE) / (float) HIGHEST_STAGE);
|
||||
} else {
|
||||
return color;
|
||||
|
@ -91,18 +91,18 @@ public class BlockGoldenLeaves extends LeavesBlock implements IModItem, IColorPr
|
|||
}
|
||||
|
||||
@Override
|
||||
public void randomTick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) {
|
||||
super.randomTick(state, levelIn, pos, random);
|
||||
if (!levelIn.isClientSide) {
|
||||
public void randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
|
||||
super.randomTick(state, worldIn, pos, random);
|
||||
if (!worldIn.isRemote) {
|
||||
int stage = state.get(STAGE);
|
||||
if (stage < HIGHEST_STAGE) {
|
||||
levelIn.setBlockState(pos, state.with(STAGE, stage + 1));
|
||||
worldIn.setBlockState(pos, state.with(STAGE, stage + 1));
|
||||
}
|
||||
|
||||
if (stage > 1) {
|
||||
BlockPos offset = pos.offset(Direction.func_239631_a_(random));
|
||||
if (levelIn.isBlockLoaded(offset))
|
||||
convert(levelIn, offset);
|
||||
if (worldIn.isBlockLoaded(offset))
|
||||
convert(worldIn, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,31 +1,31 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityGratedChute;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityGratedChute;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.data.ItemModelGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import de.ellpeck.naturesaura.reg.ICustomItemModel;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.tileentity.IHopper;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.shapes.IBooleanFunction;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -35,21 +35,21 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
|
|||
public static final DirectionProperty FACING = HopperBlock.FACING;
|
||||
private static final VoxelShape INPUT_SHAPE = Block.makeCuboidShape(0.0D, 10.0D, 0.0D, 16.0D, 16.0D, 16.0D);
|
||||
private static final VoxelShape MIDDLE_SHAPE = Block.makeCuboidShape(4.0D, 4.0D, 4.0D, 12.0D, 10.0D, 12.0D);
|
||||
private static final VoxelShape INPUT_MIDDLE_SHAPE = Shapes.or(MIDDLE_SHAPE, INPUT_SHAPE);
|
||||
private static final VoxelShape COMBINED_SHAPE = Shapes.combineAndSimplify(INPUT_MIDDLE_SHAPE, IHopper.INSIDE_BOWL_SHAPE, IBooleanFunction.ONLY_FIRST);
|
||||
private static final VoxelShape DOWN_SHAPE = Shapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 0.0D, 6.0D, 10.0D, 4.0D, 10.0D));
|
||||
private static final VoxelShape EAST_SHAPE = Shapes.or(COMBINED_SHAPE, Block.makeCuboidShape(12.0D, 4.0D, 6.0D, 16.0D, 8.0D, 10.0D));
|
||||
private static final VoxelShape NORTH_SHAPE = Shapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 4.0D, 0.0D, 10.0D, 8.0D, 4.0D));
|
||||
private static final VoxelShape SOUTH_SHAPE = Shapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 4.0D, 12.0D, 10.0D, 8.0D, 16.0D));
|
||||
private static final VoxelShape WEST_SHAPE = Shapes.or(COMBINED_SHAPE, Block.makeCuboidShape(0.0D, 4.0D, 6.0D, 4.0D, 8.0D, 10.0D));
|
||||
private static final VoxelShape INPUT_MIDDLE_SHAPE = VoxelShapes.or(MIDDLE_SHAPE, INPUT_SHAPE);
|
||||
private static final VoxelShape COMBINED_SHAPE = VoxelShapes.combineAndSimplify(INPUT_MIDDLE_SHAPE, IHopper.INSIDE_BOWL_SHAPE, IBooleanFunction.ONLY_FIRST);
|
||||
private static final VoxelShape DOWN_SHAPE = VoxelShapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 0.0D, 6.0D, 10.0D, 4.0D, 10.0D));
|
||||
private static final VoxelShape EAST_SHAPE = VoxelShapes.or(COMBINED_SHAPE, Block.makeCuboidShape(12.0D, 4.0D, 6.0D, 16.0D, 8.0D, 10.0D));
|
||||
private static final VoxelShape NORTH_SHAPE = VoxelShapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 4.0D, 0.0D, 10.0D, 8.0D, 4.0D));
|
||||
private static final VoxelShape SOUTH_SHAPE = VoxelShapes.or(COMBINED_SHAPE, Block.makeCuboidShape(6.0D, 4.0D, 12.0D, 10.0D, 8.0D, 16.0D));
|
||||
private static final VoxelShape WEST_SHAPE = VoxelShapes.or(COMBINED_SHAPE, Block.makeCuboidShape(0.0D, 4.0D, 6.0D, 4.0D, 8.0D, 10.0D));
|
||||
private static final VoxelShape DOWN_RAYTRACE_SHAPE = IHopper.INSIDE_BOWL_SHAPE;
|
||||
private static final VoxelShape EAST_RAYTRACE_SHAPE = Shapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(12.0D, 8.0D, 6.0D, 16.0D, 10.0D, 10.0D));
|
||||
private static final VoxelShape NORTH_RAYTRACE_SHAPE = Shapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(6.0D, 8.0D, 0.0D, 10.0D, 10.0D, 4.0D));
|
||||
private static final VoxelShape SOUTH_RAYTRACE_SHAPE = Shapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(6.0D, 8.0D, 12.0D, 10.0D, 10.0D, 16.0D));
|
||||
private static final VoxelShape WEST_RAYTRACE_SHAPE = Shapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(0.0D, 8.0D, 6.0D, 4.0D, 10.0D, 10.0D));
|
||||
private static final VoxelShape EAST_RAYTRACE_SHAPE = VoxelShapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(12.0D, 8.0D, 6.0D, 16.0D, 10.0D, 10.0D));
|
||||
private static final VoxelShape NORTH_RAYTRACE_SHAPE = VoxelShapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(6.0D, 8.0D, 0.0D, 10.0D, 10.0D, 4.0D));
|
||||
private static final VoxelShape SOUTH_RAYTRACE_SHAPE = VoxelShapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(6.0D, 8.0D, 12.0D, 10.0D, 10.0D, 16.0D));
|
||||
private static final VoxelShape WEST_RAYTRACE_SHAPE = VoxelShapes.or(IHopper.INSIDE_BOWL_SHAPE, Block.makeCuboidShape(0.0D, 8.0D, 6.0D, 4.0D, 10.0D, 10.0D));
|
||||
|
||||
public BlockGratedChute() {
|
||||
super("grated_chute", BlockEntityGratedChute::new, Properties.create(Material.IRON).hardnessAndResistance(3.0F, 8.0F).sound(SoundType.METAL));
|
||||
super("grated_chute", TileEntityGratedChute::new, Properties.create(Material.IRON).hardnessAndResistance(3.0F, 8.0F).sound(SoundType.METAL));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -58,7 +58,7 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
switch (state.get(FACING)) {
|
||||
case DOWN:
|
||||
return DOWN_SHAPE;
|
||||
|
@ -76,7 +76,7 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getRaytraceShape(BlockState state, IBlockReader levelIn, BlockPos pos) {
|
||||
public VoxelShape getRaytraceShape(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
switch (state.get(FACING)) {
|
||||
case DOWN:
|
||||
return DOWN_RAYTRACE_SHAPE;
|
||||
|
@ -94,18 +94,18 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
if (!player.isSneaking())
|
||||
return InteractionResult.FAIL;
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (!(tile instanceof BlockEntityGratedChute))
|
||||
return InteractionResult.FAIL;
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockEntityGratedChute chute = (BlockEntityGratedChute) tile;
|
||||
return ActionResultType.FAIL;
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (!(tile instanceof TileEntityGratedChute))
|
||||
return ActionResultType.FAIL;
|
||||
if (!worldIn.isRemote) {
|
||||
TileEntityGratedChute chute = (TileEntityGratedChute) tile;
|
||||
chute.isBlacklist = !chute.isBlacklist;
|
||||
chute.sendToClients();
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
@ -128,14 +128,14 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getComparatorInputOverride(BlockState blockState, Level levelIn, BlockPos pos) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityGratedChute) {
|
||||
IItemHandler handler = ((BlockEntityGratedChute) tile).getItemHandler();
|
||||
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityGratedChute) {
|
||||
IItemHandler handler = ((TileEntityGratedChute) tile).getItemHandler();
|
||||
ItemStack stack = handler.getStackInSlot(0);
|
||||
if (stack.isEmpty())
|
||||
return 0;
|
||||
return Mth.ceil(stack.getCount() / (float) stack.getMaxStackSize() * 15);
|
||||
return MathHelper.ceil(stack.getCount() / (float) stack.getMaxStackSize() * 15);
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityHopperUpgrade;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityHopperUpgrade;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockHopperUpgrade extends BlockContainerImpl implements IVisualizable {
|
||||
public BlockHopperUpgrade() {
|
||||
super("hopper_upgrade", BlockEntityHopperUpgrade::new, Properties.create(Material.IRON).hardnessAndResistance(2.5F).sound(SoundType.METAL));
|
||||
super("hopper_upgrade", TileEntityHopperUpgrade::new, Properties.create(Material.IRON).hardnessAndResistance(2.5F).sound(SoundType.METAL));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(7);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x434f3f;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.reg.IModItem;
|
||||
import de.ellpeck.naturesaura.reg.ModRegistry;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
public class BlockImpl extends Block implements IModItem {
|
||||
|
||||
|
|
|
@ -1,37 +1,37 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityItemDistributor;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityItemDistributor;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BlockItemDistributor extends BlockContainerImpl implements ICustomBlockState {
|
||||
|
||||
public BlockItemDistributor() {
|
||||
super("item_distributor", BlockEntityItemDistributor::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
super("item_distributor", TileEntityItemDistributor::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
if (!player.isSneaking())
|
||||
return InteractionResult.FAIL;
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (!(tile instanceof BlockEntityItemDistributor))
|
||||
return InteractionResult.FAIL;
|
||||
if (!levelIn.isClientSide) {
|
||||
BlockEntityItemDistributor distributor = (BlockEntityItemDistributor) tile;
|
||||
return ActionResultType.FAIL;
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (!(tile instanceof TileEntityItemDistributor))
|
||||
return ActionResultType.FAIL;
|
||||
if (!worldIn.isRemote) {
|
||||
TileEntityItemDistributor distributor = (TileEntityItemDistributor) tile;
|
||||
distributor.isRandomMode = !distributor.isRandomMode;
|
||||
distributor.sendToClients();
|
||||
}
|
||||
return InteractionResult.SUCCESS;
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -12,8 +12,8 @@ import net.minecraft.item.BlockItemUseContext;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -30,7 +30,7 @@ public class BlockLight extends BlockImpl implements ICustomBlockState, INoItemB
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, Random rand) {
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
for (int i = 0; i < 2; i++)
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F,
|
||||
|
@ -39,7 +39,7 @@ public class BlockLight extends BlockImpl implements ICustomBlockState, INoItemB
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityMossGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityMossGenerator;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockMossGenerator extends BlockContainerImpl implements IVisualizable {
|
||||
public BlockMossGenerator() {
|
||||
super("moss_generator", BlockEntityMossGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
super("moss_generator", TileEntityMossGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(2);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x15702d;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,46 +3,45 @@ package de.ellpeck.naturesaura.blocks;
|
|||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityNatureAltar;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityNatureAltar;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderNatureAltar;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import de.ellpeck.naturesaura.reg.ITESRProvider;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.Shapes;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.ToolType;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockNatureAltar extends BlockContainerImpl implements ITESRProvider<BlockEntityNatureAltar>, ICustomBlockState {
|
||||
public class BlockNatureAltar extends BlockContainerImpl implements ITESRProvider<TileEntityNatureAltar>, ICustomBlockState {
|
||||
|
||||
private static final VoxelShape SHAPE = Shapes.create(0, 0, 0, 1, 12 / 16F, 1);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(0, 0, 0, 1, 12 / 16F, 1);
|
||||
public static final BooleanProperty NETHER = BooleanProperty.create("nether");
|
||||
|
||||
public BlockNatureAltar() {
|
||||
super("nature_altar", BlockEntityNatureAltar::new, Block.Properties.create(Material.ROCK).hardnessAndResistance(4F).harvestLevel(1).harvestTool(ToolType.PICKAXE));
|
||||
super("nature_altar", TileEntityNatureAltar::new, Properties.create(Material.ROCK).hardnessAndResistance(4F).harvestLevel(1).harvestTool(ToolType.PICKAXE));
|
||||
this.setDefaultState(this.getDefaultState().with(NETHER, false));
|
||||
}
|
||||
|
||||
|
@ -52,18 +51,17 @@ public class BlockNatureAltar extends BlockContainerImpl implements ITESRProvide
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, BlockGetter levelIn, BlockPos pos, CollisionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
return Helper.putStackOnTile(player, handIn, pos, 0, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityNatureAltar>, Supplier<Function<? super BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<? super BlockEntityNatureAltar>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityNatureAltar>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityNatureAltar>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.NATURE_ALTAR, () -> RenderNatureAltar::new);
|
||||
}
|
||||
|
||||
|
@ -81,7 +79,7 @@ public class BlockNatureAltar extends BlockContainerImpl implements ITESRProvide
|
|||
@Nullable
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
boolean nether = IAuraType.forLevel(context.getLevel()).isSimilar(NaturesAuraAPI.TYPE_NETHER);
|
||||
boolean nether = IAuraType.forWorld(context.getWorld()).isSimilar(NaturesAuraAPI.TYPE_NETHER);
|
||||
return super.getStateForPlacement(context).with(NETHER, nether);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,9 +7,9 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.block.IGrowable;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
|
@ -20,11 +20,11 @@ public class BlockNetherGrass extends BlockImpl implements ICustomBlockState, IG
|
|||
}
|
||||
|
||||
@Override
|
||||
public void randomTick(BlockState state, ServerLevel levelIn, BlockPos pos, Random random) {
|
||||
public void randomTick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) {
|
||||
BlockPos up = pos.up();
|
||||
BlockState upState = levelIn.getBlockState(up);
|
||||
if (upState.isSolidSide(levelIn, up, Direction.DOWN))
|
||||
levelIn.setBlockState(pos, Blocks.NETHERRACK.getDefaultState());
|
||||
BlockState upState = worldIn.getBlockState(up);
|
||||
if (upState.isSolidSide(worldIn, up, Direction.DOWN))
|
||||
worldIn.setBlockState(pos, Blocks.NETHERRACK.getDefaultState());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -36,17 +36,17 @@ public class BlockNetherGrass extends BlockImpl implements ICustomBlockState, IG
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean canGrow(IBlockReader levelIn, BlockPos pos, BlockState state, boolean isClient) {
|
||||
return levelIn.getBlockState(pos.up()).isAir(levelIn, pos.up());
|
||||
public boolean canGrow(IBlockReader worldIn, BlockPos pos, BlockState state, boolean isClient) {
|
||||
return worldIn.getBlockState(pos.up()).isAir(worldIn, pos.up());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUseBonemeal(Level levelIn, Random rand, BlockPos pos, BlockState state) {
|
||||
public boolean canUseBonemeal(World worldIn, Random rand, BlockPos pos, BlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void grow(ServerLevel level, Random rand, BlockPos pos, BlockState state) {
|
||||
public void grow(ServerWorld world, Random rand, BlockPos pos, BlockState state) {
|
||||
BlockPos blockpos = pos.up();
|
||||
BlockState blockstate = Blocks.GRASS.getDefaultState();
|
||||
|
||||
|
@ -56,23 +56,23 @@ public class BlockNetherGrass extends BlockImpl implements ICustomBlockState, IG
|
|||
|
||||
while (true) {
|
||||
if (j >= i / 16) {
|
||||
BlockState blockstate2 = level.getBlockState(blockpos1);
|
||||
BlockState blockstate2 = world.getBlockState(blockpos1);
|
||||
if (blockstate2.getBlock() == blockstate.getBlock() && rand.nextInt(10) == 0) {
|
||||
((IGrowable) blockstate.getBlock()).grow(level, rand, blockpos1, blockstate2);
|
||||
((IGrowable) blockstate.getBlock()).grow(world, rand, blockpos1, blockstate2);
|
||||
}
|
||||
|
||||
if (!blockstate2.isAir()) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (blockstate.isValidPosition(level, blockpos1)) {
|
||||
level.setBlockState(blockpos1, blockstate, 3);
|
||||
if (blockstate.isValidPosition(world, blockpos1)) {
|
||||
world.setBlockState(blockpos1, blockstate, 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
blockpos1 = blockpos1.add(rand.nextInt(3) - 1, (rand.nextInt(3) - 1) * rand.nextInt(3) / 2, rand.nextInt(3) - 1);
|
||||
if (level.getBlockState(blockpos1.down()).getBlock() != this || level.getBlockState(blockpos1).hasOpaqueCollisionShape(level, blockpos1)) {
|
||||
if (world.getBlockState(blockpos1.down()).getBlock() != this || world.getBlockState(blockpos1).hasOpaqueCollisionShape(world, blockpos1)) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import de.ellpeck.naturesaura.Helper;
|
|||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityOakGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityOakGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.SaplingBlock;
|
||||
|
@ -12,12 +12,12 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.level.SaplingGrowTreeEvent;
|
||||
import net.minecraftforge.event.world.SaplingGrowTreeEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
||||
import java.util.Random;
|
||||
|
@ -25,24 +25,24 @@ import java.util.Random;
|
|||
public class BlockOakGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
|
||||
public BlockOakGenerator() {
|
||||
super("oak_generator", BlockEntityOakGenerator::new, Properties.create(Material.WOOD).hardnessAndResistance(2F).sound(SoundType.WOOD));
|
||||
super("oak_generator", TileEntityOakGenerator::new, Properties.create(Material.WOOD).hardnessAndResistance(2F).sound(SoundType.WOOD));
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onTreeGrow(SaplingGrowTreeEvent event) {
|
||||
ILevel level = event.getLevel();
|
||||
IWorld world = event.getWorld();
|
||||
BlockPos pos = event.getPos();
|
||||
if (level instanceof Level && !level.isClientSide() && IAuraType.forLevel(level).isSimilar(NaturesAuraAPI.TYPE_OVERWORLD)
|
||||
&& level.getBlockState(pos).getBlock() instanceof SaplingBlock) {
|
||||
Helper.getBlockEntitiesInArea(level, pos, 10, tile -> {
|
||||
if (!(tile instanceof BlockEntityOakGenerator))
|
||||
if (world instanceof World && !world.isRemote() && IAuraType.forWorld(world).isSimilar(NaturesAuraAPI.TYPE_OVERWORLD)
|
||||
&& world.getBlockState(pos).getBlock() instanceof SaplingBlock) {
|
||||
Helper.getTileEntitiesInArea(world, pos, 10, tile -> {
|
||||
if (!(tile instanceof TileEntityOakGenerator))
|
||||
return false;
|
||||
|
||||
Random rand = event.getRand();
|
||||
if (rand.nextInt(10) == 0)
|
||||
((BlockEntityOakGenerator) tile).scheduledBigTrees.add(pos);
|
||||
((TileEntityOakGenerator) tile).scheduledBigTrees.add(pos);
|
||||
|
||||
long seed;
|
||||
do {
|
||||
|
@ -59,13 +59,13 @@ public class BlockOakGenerator extends BlockContainerImpl implements IVisualizab
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(10);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x2e7a11;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityOfferingTable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityOfferingTable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderOfferingTable;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
|
@ -10,30 +10,30 @@ import de.ellpeck.naturesaura.reg.ITESRProvider;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockOfferingTable extends BlockContainerImpl implements ITESRProvider<BlockEntityOfferingTable>, ICustomBlockState {
|
||||
public class BlockOfferingTable extends BlockContainerImpl implements ITESRProvider<TileEntityOfferingTable>, ICustomBlockState {
|
||||
|
||||
private static final VoxelShape SHAPE = Shapes.create(2 / 16F, 0F, 2 / 16F, 14 / 16F, 1F, 14 / 16F);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(2 / 16F, 0F, 2 / 16F, 14 / 16F, 1F, 14 / 16F);
|
||||
|
||||
public BlockOfferingTable() {
|
||||
super("offering_table", BlockEntityOfferingTable::new, Properties.create(Material.WOOD).hardnessAndResistance(2F).sound(SoundType.WOOD));
|
||||
super("offering_table", TileEntityOfferingTable::new, Properties.create(Material.WOOD).hardnessAndResistance(2F).sound(SoundType.WOOD));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -42,17 +42,17 @@ public class BlockOfferingTable extends BlockContainerImpl implements ITESRProvi
|
|||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
return Helper.putStackOnTile(player, handIn, pos, 0, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityOfferingTable>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityOfferingTable>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityOfferingTable>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityOfferingTable>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.OFFERING_TABLE, () -> RenderOfferingTable::new);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityPickupStopper;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityPickupStopper;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
|
@ -10,11 +10,11 @@ import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
|||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
@ -23,21 +23,21 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||
|
||||
public class BlockPickupStopper extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
public BlockPickupStopper() {
|
||||
super("pickup_stopper", BlockEntityPickupStopper::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
super("pickup_stopper", TileEntityPickupStopper::new, Properties.create(Material.ROCK).hardnessAndResistance(2F).sound(SoundType.STONE));
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPickup(EntityItemPickupEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
PlayerEntity player = event.getPlayer();
|
||||
if (player != null && !player.isSneaking()) {
|
||||
ItemEntity item = event.getItem();
|
||||
BlockPos pos = item.getPosition();
|
||||
Helper.getBlockEntitiesInArea(item.level, pos, 8, tile -> {
|
||||
if (!(tile instanceof BlockEntityPickupStopper))
|
||||
Helper.getTileEntitiesInArea(item.world, pos, 8, tile -> {
|
||||
if (!(tile instanceof TileEntityPickupStopper))
|
||||
return false;
|
||||
BlockEntityPickupStopper stopper = (BlockEntityPickupStopper) tile;
|
||||
TileEntityPickupStopper stopper = (TileEntityPickupStopper) tile;
|
||||
float radius = stopper.getRadius();
|
||||
if (radius <= 0F)
|
||||
return false;
|
||||
|
@ -47,8 +47,8 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza
|
|||
|
||||
event.setCanceled(true);
|
||||
|
||||
if (item.level.getGameTime() % 3 == 0)
|
||||
PacketHandler.sendToAllAround(item.level, pos, 32,
|
||||
if (item.world.getGameTime() % 3 == 0)
|
||||
PacketHandler.sendToAllAround(item.world, pos, 32,
|
||||
new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.PICKUP_STOPPER));
|
||||
return true;
|
||||
});
|
||||
|
@ -57,10 +57,10 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntityPickupStopper) {
|
||||
double radius = ((BlockEntityPickupStopper) tile).getRadius();
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntityPickupStopper) {
|
||||
double radius = ((TileEntityPickupStopper) tile).getRadius();
|
||||
if (radius > 0)
|
||||
return new AxisAlignedBB(pos).grow(radius);
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0xf4aa42;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,32 +1,32 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityPlacer;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityPlacer;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockPlacer extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
|
||||
public BlockPlacer() {
|
||||
super("placer", BlockEntityPlacer::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
super("placer", TileEntityPlacer::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(5);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x078a93;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityPotionGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityPotionGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -8,7 +8,7 @@ import net.minecraftforge.common.ToolType;
|
|||
|
||||
public class BlockPotionGenerator extends BlockContainerImpl implements ICustomBlockState {
|
||||
public BlockPotionGenerator() {
|
||||
super("potion_generator", BlockEntityPotionGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).harvestTool(ToolType.PICKAXE).harvestLevel(1));
|
||||
super("potion_generator", TileEntityPotionGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(5F).harvestTool(ToolType.PICKAXE).harvestLevel(1));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityPowderPlacer;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityPowderPlacer;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -9,15 +9,15 @@ import net.minecraft.block.material.Material;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
|
||||
public class BlockPowderPlacer extends BlockContainerImpl implements ICustomBlockState {
|
||||
|
||||
private static final VoxelShape SHAPE = Shapes.create(0F, 0F, 0F, 1F, 4 / 16F, 1F);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(0F, 0F, 0F, 1F, 4 / 16F, 1F);
|
||||
|
||||
public BlockPowderPlacer() {
|
||||
super("powder_placer", BlockEntityPowderPlacer::new, Properties.create(Material.ROCK).hardnessAndResistance(2, 5F).sound(SoundType.STONE));
|
||||
super("powder_placer", TileEntityPowderPlacer::new, Properties.create(Material.ROCK).hardnessAndResistance(2, 5F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -26,7 +26,7 @@ public class BlockPowderPlacer extends BlockContainerImpl implements ICustomBloc
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityProjectileGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityProjectileGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderProjectileGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
|
@ -13,8 +13,8 @@ import de.ellpeck.naturesaura.reg.ITESRProvider;
|
|||
import net.minecraft.block.DispenserBlock;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.dispenser.IPosition;
|
||||
import net.minecraft.dispenser.ProjectileDispenseBehavior;
|
||||
import net.minecraft.entity.Entity;
|
||||
|
@ -25,15 +25,15 @@ import net.minecraft.entity.projectile.ProjectileEntity;
|
|||
import net.minecraft.entity.projectile.TridentEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvents;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.ProjectileImpactEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
@ -42,24 +42,24 @@ import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
|||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockProjectileGenerator extends BlockContainerImpl implements ITESRProvider<BlockEntityProjectileGenerator>, ICustomBlockState {
|
||||
public class BlockProjectileGenerator extends BlockContainerImpl implements ITESRProvider<TileEntityProjectileGenerator>, ICustomBlockState {
|
||||
|
||||
public BlockProjectileGenerator() {
|
||||
super("projectile_generator", BlockEntityProjectileGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
super("projectile_generator", TileEntityProjectileGenerator::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
DispenserBlock.registerDispenseBehavior(Items.ENDER_PEARL, new ProjectileDispenseBehavior() {
|
||||
@Override
|
||||
protected ProjectileEntity getProjectileEntity(Level levelIn, IPosition position, ItemStack stackIn) {
|
||||
EnderPearlEntity ret = new EnderPearlEntity(EntityType.ENDER_PEARL, levelIn);
|
||||
protected ProjectileEntity getProjectileEntity(World worldIn, IPosition position, ItemStack stackIn) {
|
||||
EnderPearlEntity ret = new EnderPearlEntity(EntityType.ENDER_PEARL, worldIn);
|
||||
ret.setPosition(position.getX(), position.getY(), position.getZ());
|
||||
return ret;
|
||||
}
|
||||
});
|
||||
DispenserBlock.registerDispenseBehavior(Items.TRIDENT, new ProjectileDispenseBehavior() {
|
||||
@Override
|
||||
protected ProjectileEntity getProjectileEntity(Level levelIn, IPosition position, ItemStack stackIn) {
|
||||
TridentEntity ret = new TridentEntity(EntityType.TRIDENT, levelIn);
|
||||
protected ProjectileEntity getProjectileEntity(World worldIn, IPosition position, ItemStack stackIn) {
|
||||
TridentEntity ret = new TridentEntity(EntityType.TRIDENT, worldIn);
|
||||
ret.setPosition(position.getX(), position.getY(), position.getZ());
|
||||
// set thrownStack
|
||||
ObfuscationReflectionHelper.setPrivateValue(TridentEntity.class, ret, stackIn.copy(), "field_203054_h");
|
||||
|
@ -72,7 +72,7 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES
|
|||
@SubscribeEvent
|
||||
public void onProjectileImpact(ProjectileImpactEvent event) {
|
||||
Entity entity = event.getEntity();
|
||||
if (entity.level.isClientSide)
|
||||
if (entity.world.isRemote)
|
||||
return;
|
||||
RayTraceResult ray = event.getRayTraceResult();
|
||||
if (!(ray instanceof BlockRayTraceResult))
|
||||
|
@ -81,10 +81,10 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES
|
|||
BlockPos pos = blockRay.getPos();
|
||||
if (pos == null)
|
||||
return;
|
||||
BlockEntity tile = entity.level.getBlockEntity(pos);
|
||||
if (!(tile instanceof BlockEntityProjectileGenerator))
|
||||
TileEntity tile = entity.world.getTileEntity(pos);
|
||||
if (!(tile instanceof TileEntityProjectileGenerator))
|
||||
return;
|
||||
BlockEntityProjectileGenerator generator = (BlockEntityProjectileGenerator) tile;
|
||||
TileEntityProjectileGenerator generator = (TileEntityProjectileGenerator) tile;
|
||||
if (generator.nextSide != blockRay.getFace())
|
||||
return;
|
||||
Integer amount = NaturesAuraAPI.PROJECTILE_GENERATIONS.get(entity.getType());
|
||||
|
@ -94,9 +94,9 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES
|
|||
return;
|
||||
generator.generateAura(amount);
|
||||
|
||||
PacketHandler.sendToAllAround(entity.level, pos, 32,
|
||||
PacketHandler.sendToAllAround(entity.world, pos, 32,
|
||||
new PacketParticles((float) entity.getPosX(), (float) entity.getPosY(), (float) entity.getPosZ(), PacketParticles.Type.PROJECTILE_GEN, pos.getX(), pos.getY(), pos.getZ()));
|
||||
entity.level.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENTITY_ENDER_EYE_LAUNCH, SoundCategory.BLOCKS, 0.8F, 1F);
|
||||
entity.world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENTITY_ENDER_EYE_LAUNCH, SoundCategory.BLOCKS, 0.8F, 1F);
|
||||
|
||||
generator.nextSide = generator.nextSide.rotateY();
|
||||
generator.sendToClients();
|
||||
|
@ -106,7 +106,7 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES
|
|||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityProjectileGenerator>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityProjectileGenerator>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityProjectileGenerator>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityProjectileGenerator>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.PROJECTILE_GENERATOR, () -> RenderProjectileGenerator::new);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,14 +2,14 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.ModConfig;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityRFConverter;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityRFConverter;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
||||
public class BlockRFConverter extends BlockContainerImpl {
|
||||
|
||||
public BlockRFConverter() {
|
||||
super("rf_converter", BlockEntityRFConverter::new, Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(3));
|
||||
super("rf_converter", TileEntityRFConverter::new, Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(3));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntitySlimeSplitGenerator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntitySlimeSplitGenerator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
|
@ -10,7 +10,7 @@ import net.minecraft.entity.LivingEntity;
|
|||
import net.minecraft.entity.monster.SlimeEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
@ -19,7 +19,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||
|
||||
public class BlockSlimeSplitGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
public BlockSlimeSplitGenerator() {
|
||||
super("slime_split_generator", BlockEntitySlimeSplitGenerator::new, Properties.from(Blocks.SLIME_BLOCK).hardnessAndResistance(2));
|
||||
super("slime_split_generator", TileEntitySlimeSplitGenerator::new, Properties.from(Blocks.SLIME_BLOCK).hardnessAndResistance(2));
|
||||
MinecraftForge.EVENT_BUS.register(new Events());
|
||||
}
|
||||
|
||||
|
@ -33,13 +33,13 @@ public class BlockSlimeSplitGenerator extends BlockContainerImpl implements IVis
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
return new AxisAlignedBB(pos).grow(8);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x4da84f;
|
||||
}
|
||||
|
||||
|
@ -48,16 +48,16 @@ public class BlockSlimeSplitGenerator extends BlockContainerImpl implements IVis
|
|||
@SubscribeEvent
|
||||
public void onLivingDeath(LivingDeathEvent event) {
|
||||
LivingEntity entity = event.getEntityLiving();
|
||||
if (!(entity instanceof SlimeEntity) || entity.level.isClientSide)
|
||||
if (!(entity instanceof SlimeEntity) || entity.world.isRemote)
|
||||
return;
|
||||
SlimeEntity slime = (SlimeEntity) entity;
|
||||
int size = slime.getSlimeSize();
|
||||
if (size <= 1)
|
||||
return;
|
||||
Helper.getBlockEntitiesInArea(entity.level, entity.getPosition(), 8, tile -> {
|
||||
if (!(tile instanceof BlockEntitySlimeSplitGenerator))
|
||||
Helper.getTileEntitiesInArea(entity.world, entity.getPosition(), 8, tile -> {
|
||||
if (!(tile instanceof TileEntitySlimeSplitGenerator))
|
||||
return false;
|
||||
BlockEntitySlimeSplitGenerator gen = (BlockEntitySlimeSplitGenerator) tile;
|
||||
TileEntitySlimeSplitGenerator gen = (TileEntitySlimeSplitGenerator) tile;
|
||||
if (gen.isBusy())
|
||||
return false;
|
||||
gen.startGenerating(slime);
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntitySnowCreator;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntitySnowCreator;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockSnowCreator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
|
||||
public BlockSnowCreator() {
|
||||
super("snow_creator", BlockEntitySnowCreator::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
super("snow_creator", TileEntitySnowCreator::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntitySnowCreator) {
|
||||
int radius = ((BlockEntitySnowCreator) tile).getRange();
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntitySnowCreator) {
|
||||
int radius = ((TileEntitySnowCreator) tile).getRange();
|
||||
if (radius > 0)
|
||||
return new AxisAlignedBB(pos).grow(radius);
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ public class BlockSnowCreator extends BlockContainerImpl implements IVisualizabl
|
|||
}
|
||||
|
||||
@Override
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0xdbe9ff;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntitySpawnLamp;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntitySpawnLamp;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.misc.LevelData;
|
||||
import de.ellpeck.naturesaura.misc.WorldData;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
|
@ -15,17 +15,17 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.entity.MobEntity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
@ -37,10 +37,10 @@ import java.util.function.Supplier;
|
|||
|
||||
public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable, ICustomBlockState, ICustomRenderType {
|
||||
|
||||
private static final VoxelShape SHAPE = Shapes.create(4 / 16F, 0F, 4 / 16F, 12 / 16F, 13 / 16F, 12 / 16F);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(4 / 16F, 0F, 4 / 16F, 12 / 16F, 13 / 16F, 12 / 16F);
|
||||
|
||||
public BlockSpawnLamp() {
|
||||
super("spawn_lamp", BlockEntitySpawnLamp::new, Properties.create(Material.IRON).hardnessAndResistance(3F).setLightLevel(s -> 15).sound(SoundType.METAL));
|
||||
super("spawn_lamp", TileEntitySpawnLamp::new, Properties.create(Material.IRON).hardnessAndResistance(3F).setLightLevel(s -> 15).sound(SoundType.METAL));
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
|
@ -53,12 +53,12 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
|
|||
public void onSpawn(LivingSpawnEvent.CheckSpawn event) {
|
||||
if (event.getSpawner() != null)
|
||||
return;
|
||||
ILevel level = event.getLevel();
|
||||
IWorld world = event.getWorld();
|
||||
BlockPos pos = new BlockPos(event.getX(), event.getY(), event.getZ());
|
||||
if (!(level instanceof Level))
|
||||
if (!(world instanceof World))
|
||||
return;
|
||||
LevelData data = (LevelData) ILevelData.getLevelData((Level) level);
|
||||
for (BlockEntitySpawnLamp lamp : data.spawnLamps) {
|
||||
WorldData data = (WorldData) IWorldData.getWorldData((World) world);
|
||||
for (TileEntitySpawnLamp lamp : data.spawnLamps) {
|
||||
if (lamp.isRemoved())
|
||||
continue;
|
||||
|
||||
|
@ -71,11 +71,11 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
|
|||
continue;
|
||||
|
||||
MobEntity entity = (MobEntity) event.getEntityLiving();
|
||||
if (entity.canSpawn(level, event.getSpawnReason()) && entity.isNotColliding(level)) {
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(level, lampPos, 32, lampPos);
|
||||
IAuraChunk.getAuraChunk(level, spot).drainAura(spot, 200);
|
||||
if (entity.canSpawn(world, event.getSpawnReason()) && entity.isNotColliding(world)) {
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(world, lampPos, 32, lampPos);
|
||||
IAuraChunk.getAuraChunk(world, spot).drainAura(spot, 200);
|
||||
|
||||
PacketHandler.sendToAllAround((ServerLevel) level, lampPos, 32,
|
||||
PacketHandler.sendToAllAround((ServerWorld) world, lampPos, 32,
|
||||
new PacketParticles(lampPos.getX(), lampPos.getY(), lampPos.getZ(), PacketParticles.Type.SPAWN_LAMP));
|
||||
}
|
||||
|
||||
|
@ -85,16 +85,16 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getVisualizationBounds(Level level, BlockPos pos) {
|
||||
BlockEntity tile = level.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntitySpawnLamp) {
|
||||
int radius = ((BlockEntitySpawnLamp) tile).getRadius();
|
||||
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileEntitySpawnLamp) {
|
||||
int radius = ((TileEntitySpawnLamp) tile).getRadius();
|
||||
if (radius > 0)
|
||||
return new AxisAlignedBB(pos).grow(radius);
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public int getVisualizationColor(Level level, BlockPos pos) {
|
||||
public int getVisualizationColor(World world, BlockPos pos) {
|
||||
return 0x825ee5;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntitySpring;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntitySpring;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.IColorProvidingBlock;
|
||||
import de.ellpeck.naturesaura.reg.IColorProvidingItem;
|
||||
|
@ -13,14 +13,14 @@ import net.minecraft.client.Minecraft;
|
|||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.color.IBlockColor;
|
||||
import net.minecraft.client.renderer.color.IItemColor;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.Fluids;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.biome.BiomeColors;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.biome.BiomeColors;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
|
@ -28,13 +28,13 @@ import java.util.function.Supplier;
|
|||
|
||||
public class BlockSpring extends BlockContainerImpl implements ICustomBlockState, IColorProvidingBlock, IColorProvidingItem, IBucketPickupHandler, ICustomRenderType {
|
||||
public BlockSpring() {
|
||||
super("spring", BlockEntitySpring::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
super("spring", TileEntitySpring::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public IBlockColor getBlockColor() {
|
||||
return (state, level, pos, i) -> BiomeColors.getWaterColor(level, pos);
|
||||
return (state, world, pos, i) -> BiomeColors.getWaterColor(world, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -44,8 +44,8 @@ public class BlockSpring extends BlockContainerImpl implements ICustomBlockState
|
|||
return new IItemColor() {
|
||||
@Override
|
||||
public int getColor(ItemStack stack, int i) {
|
||||
Player player = Minecraft.getInstance().player;
|
||||
return BiomeColors.getWaterColor(player.level, player.getPosition());
|
||||
PlayerEntity player = Minecraft.getInstance().player;
|
||||
return BiomeColors.getWaterColor(player.world, player.getPosition());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -56,10 +56,10 @@ public class BlockSpring extends BlockContainerImpl implements ICustomBlockState
|
|||
}
|
||||
|
||||
@Override
|
||||
public Fluid pickupFluid(ILevel levelIn, BlockPos pos, BlockState state) {
|
||||
BlockEntity tile = levelIn.getBlockEntity(pos);
|
||||
if (tile instanceof BlockEntitySpring)
|
||||
((BlockEntitySpring) tile).consumeAura(2500);
|
||||
public Fluid pickupFluid(IWorld worldIn, BlockPos pos, BlockState state) {
|
||||
TileEntity tile = worldIn.getTileEntity(pos);
|
||||
if (tile instanceof TileEntitySpring)
|
||||
((TileEntitySpring) tile).consumeAura(2500);
|
||||
return Fluids.WATER;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityTimeChanger;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityTimeChanger;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
|
@ -8,7 +8,7 @@ import net.minecraft.block.material.Material;
|
|||
|
||||
public class BlockTimeChanger extends BlockContainerImpl implements ICustomBlockState {
|
||||
public BlockTimeChanger() {
|
||||
super("time_changer", BlockEntityTimeChanger::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
super("time_changer", TileEntityTimeChanger::new, Properties.create(Material.ROCK).hardnessAndResistance(2.5F).sound(SoundType.STONE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityWeatherChanger;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityWeatherChanger;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.reg.ICustomBlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
|
||||
public class BlockWeatherChanger extends BlockContainerImpl implements ICustomBlockState {
|
||||
public BlockWeatherChanger() {
|
||||
super("weather_changer", BlockEntityWeatherChanger::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
super("weather_changer", TileEntityWeatherChanger::new, Properties.from(Blocks.STONE_BRICKS));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -3,7 +3,7 @@ package de.ellpeck.naturesaura.blocks;
|
|||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.blocks.multi.Multiblocks;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityWoodStand;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.TileEntityWoodStand;
|
||||
import de.ellpeck.naturesaura.blocks.tiles.render.RenderWoodStand;
|
||||
import de.ellpeck.naturesaura.data.BlockStateGenerator;
|
||||
import de.ellpeck.naturesaura.recipes.ModRecipes;
|
||||
|
@ -13,27 +13,27 @@ import de.ellpeck.naturesaura.reg.ITESRProvider;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.BlockEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.util.InteractionResult;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||
import net.minecraft.util.math.shapes.VoxelShape;
|
||||
import net.minecraft.util.math.shapes.Shapes;
|
||||
import net.minecraft.level.IBlockReader;
|
||||
import net.minecraft.level.ILevel;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.ToolType;
|
||||
import net.minecraftforge.event.level.SaplingGrowTreeEvent;
|
||||
import net.minecraftforge.event.world.SaplingGrowTreeEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import org.apache.commons.lang3.mutable.MutableObject;
|
||||
|
||||
|
@ -43,12 +43,12 @@ import java.util.List;
|
|||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider<BlockEntityWoodStand>, ICustomBlockState {
|
||||
public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider<TileEntityWoodStand>, ICustomBlockState {
|
||||
|
||||
private static final VoxelShape SHAPE = Shapes.create(3 / 16F, 0F, 3 / 16F, 13 / 16F, 13 / 16F, 13 / 16F);
|
||||
private static final VoxelShape SHAPE = VoxelShapes.create(3 / 16F, 0F, 3 / 16F, 13 / 16F, 13 / 16F, 13 / 16F);
|
||||
|
||||
public BlockWoodStand() {
|
||||
super("wood_stand", BlockEntityWoodStand::new, Properties.create(Material.WOOD).hardnessAndResistance(1.5F).sound(SoundType.WOOD).harvestLevel(0).harvestTool(ToolType.AXE));
|
||||
super("wood_stand", TileEntityWoodStand::new, Properties.create(Material.WOOD).hardnessAndResistance(1.5F).sound(SoundType.WOOD).harvestLevel(0).harvestTool(ToolType.AXE));
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
|
@ -58,28 +58,28 @@ public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider<
|
|||
}
|
||||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader levelIn, BlockPos pos, ISelectionContext context) {
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
return SHAPE;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onTreeGrow(SaplingGrowTreeEvent event) {
|
||||
ILevel level = event.getLevel();
|
||||
IWorld world = event.getWorld();
|
||||
BlockPos pos = event.getPos();
|
||||
if (!level.isClientSide() && level instanceof Level) {
|
||||
if (Multiblocks.TREE_RITUAL.isComplete((Level) level, pos)) {
|
||||
BlockState sapling = level.getBlockState(pos);
|
||||
ItemStack saplingStack = sapling.getBlock().getItem(level, pos, sapling);
|
||||
if (!world.isRemote() && world instanceof World) {
|
||||
if (Multiblocks.TREE_RITUAL.isComplete((World) world, pos)) {
|
||||
BlockState sapling = world.getBlockState(pos);
|
||||
ItemStack saplingStack = sapling.getBlock().getItem(world, pos, sapling);
|
||||
if (!saplingStack.isEmpty()) {
|
||||
for (TreeRitualRecipe recipe : ((Level) level).getRecipeManager().getRecipes(ModRecipes.TREE_RITUAL_TYPE, null, null)) {
|
||||
for (TreeRitualRecipe recipe : ((World) world).getRecipeManager().getRecipes(ModRecipes.TREE_RITUAL_TYPE, null, null)) {
|
||||
if (recipe.saplingType.test(saplingStack)) {
|
||||
List<Ingredient> required = new ArrayList<>(Arrays.asList(recipe.ingredients));
|
||||
MutableObject<BlockEntityWoodStand> toPick = new MutableObject<>();
|
||||
MutableObject<TileEntityWoodStand> toPick = new MutableObject<>();
|
||||
|
||||
boolean fine = Multiblocks.TREE_RITUAL.forEach(pos, 'W', (tilePos, matcher) -> {
|
||||
BlockEntity tile = level.getBlockEntity(tilePos);
|
||||
if (tile instanceof BlockEntityWoodStand) {
|
||||
BlockEntityWoodStand stand = (BlockEntityWoodStand) tile;
|
||||
TileEntity tile = world.getTileEntity(tilePos);
|
||||
if (tile instanceof TileEntityWoodStand) {
|
||||
TileEntityWoodStand stand = (TileEntityWoodStand) tile;
|
||||
ItemStack stack = stand.items.getStackInSlot(0);
|
||||
if (!stack.isEmpty()) {
|
||||
for (int i = required.size() - 1; i >= 0; i--) {
|
||||
|
@ -111,12 +111,12 @@ public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider<
|
|||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onBlockActivated(BlockState state, Level levelIn, BlockPos pos, Player player, Hand handIn, BlockRayTraceResult hit) {
|
||||
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
|
||||
return Helper.putStackOnTile(player, handIn, pos, 0, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tuple<BlockEntityType<BlockEntityWoodStand>, Supplier<Function<? super BlockEntityRendererDispatcher, ? extends BlockEntityRenderer<? super BlockEntityWoodStand>>>> getTESR() {
|
||||
public Tuple<TileEntityType<TileEntityWoodStand>, Supplier<Function<? super TileEntityRendererDispatcher, ? extends TileEntityRenderer<? super TileEntityWoodStand>>>> getTESR() {
|
||||
return new Tuple<>(ModTileEntities.WOOD_STAND, () -> RenderWoodStand::new);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.ellpeck.naturesaura.blocks;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
@SuppressWarnings("FieldNamingConvention")
|
||||
public final class ModBlocks {
|
||||
|
|
|
@ -8,7 +8,7 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.level.Level;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -83,11 +83,11 @@ public class Multiblock implements IMultiblock {
|
|||
if (value instanceof BlockState) {
|
||||
BlockState state = (BlockState) value;
|
||||
matchers.put(c, new Matcher(state,
|
||||
(level, start, offset, pos, other, otherC) -> other == state));
|
||||
(world, start, offset, pos, other, otherC) -> other == state));
|
||||
} else if (value instanceof Block) {
|
||||
Block block = (Block) value;
|
||||
matchers.put(c, new Matcher(block.getDefaultState(),
|
||||
(level, start, offset, pos, state, otherC) -> state.getBlock() == block));
|
||||
(world, start, offset, pos, state, otherC) -> state.getBlock() == block));
|
||||
} else
|
||||
matchers.put(c, (Matcher) value);
|
||||
}
|
||||
|
@ -107,11 +107,11 @@ public class Multiblock implements IMultiblock {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isComplete(Level level, BlockPos center) {
|
||||
public boolean isComplete(World world, BlockPos center) {
|
||||
BlockPos start = this.getStart(center);
|
||||
return this.forEach(center, (char) 0, (pos, matcher) -> {
|
||||
BlockPos offset = pos.subtract(start);
|
||||
return matcher.getCheck().matches(level, start, offset, pos, level.getBlockState(pos), this.getChar(offset));
|
||||
return matcher.getCheck().matches(world, start, offset, pos, world.getBlockState(pos), this.getChar(offset));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -8,12 +8,12 @@ import de.ellpeck.naturesaura.blocks.BlockNatureAltar;
|
|||
import de.ellpeck.naturesaura.blocks.ModBlocks;
|
||||
import de.ellpeck.naturesaura.data.BlockTagProvider;
|
||||
import de.ellpeck.naturesaura.recipes.ModRecipes;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.SaplingBlock;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.SaplingBlock;
|
||||
import net.minecraft.world.level.material.Material;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
public final class Multiblocks {
|
||||
|
||||
|
@ -38,23 +38,23 @@ public final class Multiblocks {
|
|||
'B', Blocks.NETHER_BRICKS,
|
||||
'W', Matcher.tag(Blocks.CRIMSON_PLANKS, BlockTagProvider.NETHER_ALTAR_WOOD),
|
||||
'M', ModBlocks.GOLD_NETHER_BRICK,
|
||||
'0', ModBlocks.NATURE_ALTAR.defaultBlockState().setValue(BlockNatureAltar.NETHER, true),
|
||||
'0', ModBlocks.NATURE_ALTAR.getDefaultState().with(BlockNatureAltar.NETHER, true),
|
||||
' ', Matcher.wildcard());
|
||||
public static final IMultiblock TREE_RITUAL = NaturesAuraAPI.instance().createMultiblock(
|
||||
new ResourceLocation(NaturesAura.MOD_ID, "tree_ritual"),
|
||||
new String[][]{
|
||||
{" W ", " W W ", " GGG ", " GG GG ", "W G 0 G W", " GG GG ", " GGG ", " W W ", " W "}},
|
||||
'W', new Matcher(ModBlocks.WOOD_STAND.defaultBlockState(),
|
||||
(level, start, offset, pos, state, c) -> level != null || state.getBlock() == ModBlocks.WOOD_STAND),
|
||||
'W', new Matcher(ModBlocks.WOOD_STAND.getDefaultState(),
|
||||
(world, start, offset, pos, state, c) -> world != null || state.getBlock() == ModBlocks.WOOD_STAND),
|
||||
'G', ModBlocks.GOLD_POWDER,
|
||||
'0', new Matcher(Blocks.OAK_SAPLING.defaultBlockState(),
|
||||
(level, start, offset, pos, state, c) -> {
|
||||
'0', new Matcher(Blocks.OAK_SAPLING.getDefaultState(),
|
||||
(world, start, offset, pos, state, c) -> {
|
||||
if (state.getBlock() instanceof SaplingBlock || state.getMaterial() == Material.WOOD)
|
||||
return true;
|
||||
// try-catch to prevent blocks that need to have been placed crashing here
|
||||
try {
|
||||
ItemStack stack = state.getBlock().getCloneItemStack(level, pos, state);
|
||||
return !stack.isEmpty() && level.getRecipeManager().getRecipesFor(ModRecipes.TREE_RITUAL_TYPE, null, null).stream().anyMatch(r -> r.saplingType.test(stack));
|
||||
ItemStack stack = state.getBlock().getItem(world, pos, state);
|
||||
return !stack.isEmpty() && world.getRecipeManager().getRecipes(ModRecipes.TREE_RITUAL_TYPE, null, null).stream().anyMatch(r -> r.saplingType.test(stack));
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
|
@ -76,8 +76,8 @@ public final class Multiblocks {
|
|||
new ResourceLocation(NaturesAura.MOD_ID, "offering_table"),
|
||||
new String[][]{
|
||||
{" RRRRR ", " R R ", "R RRR R", "R R R R", "R R 0 R R", "R R R R", "R RRR R", " R R ", " RRRRR "}},
|
||||
'R', new Matcher(Blocks.POPPY.defaultBlockState(),
|
||||
(level, start, offset, pos, state, c) -> BlockTags.SMALL_FLOWERS.contains(state.getBlock())),
|
||||
'R', new Matcher(Blocks.POPPY.getDefaultState(),
|
||||
(world, start, offset, pos, state, c) -> BlockTags.SMALL_FLOWERS.contains(state.getBlock())),
|
||||
'0', ModBlocks.OFFERING_TABLE,
|
||||
' ', Matcher.wildcard());
|
||||
public static final IMultiblock ANIMAL_SPAWNER = NaturesAuraAPI.instance().createMultiblock(
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class BlockEntityAnimalContainer extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
|
||||
public BlockEntityAnimalContainer(BlockPos pos, BlockState state) {
|
||||
super(ModTileEntities.ANIMAL_CONTAINER, pos, state);
|
||||
}
|
||||
|
||||
public int getRadius() {
|
||||
return this.redstonePower / 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRedstonePowerChange(int newPower) {
|
||||
super.onRedstonePowerChange(newPower);
|
||||
this.sendToClients();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.level.isClientSide)
|
||||
return;
|
||||
var radius = this.getRadius();
|
||||
Set<Animal> animalsInRange = new HashSet<>(this.level.getEntitiesOfClass(Animal.class, new AABB(this.worldPosition).inflate(radius - 1)));
|
||||
var animalsOutRange = this.level.getEntitiesOfClass(Animal.class, new AABB(this.worldPosition).inflate(radius + 1));
|
||||
for (var animal : animalsOutRange) {
|
||||
if (animalsInRange.contains(animal))
|
||||
continue;
|
||||
var pos = animal.position();
|
||||
var distance = pos.subtract(this.worldPosition.getX(), pos.y, this.worldPosition.getZ());
|
||||
distance = distance.normalize().scale(-0.15F);
|
||||
animal.setDeltaMovement(distance);
|
||||
|
||||
if (this.level.random.nextBoolean()) {
|
||||
var eye = animal.getEyePosition(1).add(animal.getLookAngle());
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles((float) eye.x, (float) eye.y, (float) eye.z, PacketParticles.Type.ANIMAL_CONTAINER));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
public interface ITickableBlockEntity {
|
||||
|
||||
void tick();
|
||||
|
||||
}
|
|
@ -7,14 +7,14 @@ import javax.annotation.Nonnull;
|
|||
|
||||
public class ItemStackHandlerNA extends ItemStackHandler {
|
||||
|
||||
private final BlockEntityImpl tile;
|
||||
private final TileEntityImpl tile;
|
||||
private final boolean sendToClients;
|
||||
|
||||
public ItemStackHandlerNA(int size) {
|
||||
this(size, null, false);
|
||||
}
|
||||
|
||||
public ItemStackHandlerNA(int size, BlockEntityImpl tile, boolean sendToClients) {
|
||||
public ItemStackHandlerNA(int size, TileEntityImpl tile, boolean sendToClients) {
|
||||
super(size);
|
||||
this.tile = tile;
|
||||
this.sendToClients = sendToClients;
|
||||
|
@ -24,7 +24,7 @@ public class ItemStackHandlerNA extends ItemStackHandler {
|
|||
protected void onContentsChanged(int slot) {
|
||||
if (this.tile != null) {
|
||||
this.tile.markDirty();
|
||||
if (this.sendToClients && !this.tile.getLevel().isClientSide)
|
||||
if (this.sendToClients && !this.tile.getWorld().isRemote)
|
||||
this.tile.sendToClients();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,46 +1,45 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
|
||||
@SuppressWarnings("FieldNamingConvention")
|
||||
public final class ModTileEntities {
|
||||
|
||||
public static BlockEntityType<BlockEntityAncientLeaves> ANCIENT_LEAVES;
|
||||
public static BlockEntityType<BlockEntityAnimalGenerator> ANIMAL_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityAnimalSpawner> ANIMAL_SPAWNER;
|
||||
public static BlockEntityType<BlockEntityAuraDetector> AURA_DETECTOR;
|
||||
public static BlockEntityType<BlockEntityAutoCrafter> AUTO_CRAFTER;
|
||||
public static BlockEntityType<BlockEntityChunkLoader> CHUNK_LOADER;
|
||||
public static BlockEntityType<BlockEntityEnderCrate> ENDER_CRATE;
|
||||
public static BlockEntityType<BlockEntityEndFlower> END_FLOWER;
|
||||
public static BlockEntityType<BlockEntityFieldCreator> FIELD_CREATOR;
|
||||
public static BlockEntityType<BlockEntityFireworkGenerator> FIREWORK_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityFlowerGenerator> FLOWER_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityFurnaceHeater> FURNACE_HEATER;
|
||||
public static BlockEntityType<BlockEntityGeneratorLimitRemover> GENERATOR_LIMIT_REMOVER;
|
||||
public static BlockEntityType<BlockEntityGratedChute> GRATED_CHUTE;
|
||||
public static BlockEntityType<BlockEntityHopperUpgrade> HOPPER_UPGRADE;
|
||||
public static BlockEntityType<BlockEntityMossGenerator> MOSS_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityNatureAltar> NATURE_ALTAR;
|
||||
public static BlockEntityType<BlockEntityOakGenerator> OAK_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityOfferingTable> OFFERING_TABLE;
|
||||
public static BlockEntityType<BlockEntityPickupStopper> PICKUP_STOPPER;
|
||||
public static BlockEntityType<BlockEntityPlacer> PLACER;
|
||||
public static BlockEntityType<BlockEntityPotionGenerator> POTION_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityPowderPlacer> POWDER_PLACER;
|
||||
public static BlockEntityType<BlockEntityProjectileGenerator> PROJECTILE_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityRFConverter> RF_CONVERTER;
|
||||
public static BlockEntityType<BlockEntitySpawnLamp> SPAWN_LAMP;
|
||||
public static BlockEntityType<BlockEntityTimeChanger> TIME_CHANGER;
|
||||
public static BlockEntityType<BlockEntityWoodStand> WOOD_STAND;
|
||||
public static BlockEntityType<BlockEntityBlastFurnaceBooster> BLAST_FURNACE_BOOSTER;
|
||||
public static BlockEntityType<BlockEntityAnimalContainer> ANIMAL_CONTAINER;
|
||||
public static BlockEntityType<BlockEntitySnowCreator> SNOW_CREATOR;
|
||||
public static BlockEntityType<BlockEntityItemDistributor> ITEM_DISTRIBUTOR;
|
||||
public static BlockEntityType<BlockEntityAuraBloom> AURA_BLOOM;
|
||||
public static BlockEntityType<BlockEntityChorusGenerator> CHORUS_GENERATOR;
|
||||
public static BlockEntityType<BlockEntityAuraTimer> AURA_TIMER;
|
||||
public static BlockEntityType<BlockEntitySlimeSplitGenerator> SLIME_SPLIT_GENERATOR;
|
||||
public static BlockEntityType<BlockEntitySpring> SPRING;
|
||||
public static BlockEntityType<BlockEntityWeatherChanger> WEATHER_CHANGER;
|
||||
public static TileEntityType<TileEntityAncientLeaves> ANCIENT_LEAVES;
|
||||
public static TileEntityType<TileEntityAnimalGenerator> ANIMAL_GENERATOR;
|
||||
public static TileEntityType<TileEntityAnimalSpawner> ANIMAL_SPAWNER;
|
||||
public static TileEntityType<TileEntityAuraDetector> AURA_DETECTOR;
|
||||
public static TileEntityType<TileEntityAutoCrafter> AUTO_CRAFTER;
|
||||
public static TileEntityType<TileEntityChunkLoader> CHUNK_LOADER;
|
||||
public static TileEntityType<TileEntityEnderCrate> ENDER_CRATE;
|
||||
public static TileEntityType<TileEntityEndFlower> END_FLOWER;
|
||||
public static TileEntityType<TileEntityFieldCreator> FIELD_CREATOR;
|
||||
public static TileEntityType<TileEntityFireworkGenerator> FIREWORK_GENERATOR;
|
||||
public static TileEntityType<TileEntityFlowerGenerator> FLOWER_GENERATOR;
|
||||
public static TileEntityType<TileEntityFurnaceHeater> FURNACE_HEATER;
|
||||
public static TileEntityType<TileEntityGeneratorLimitRemover> GENERATOR_LIMIT_REMOVER;
|
||||
public static TileEntityType<TileEntityGratedChute> GRATED_CHUTE;
|
||||
public static TileEntityType<TileEntityHopperUpgrade> HOPPER_UPGRADE;
|
||||
public static TileEntityType<TileEntityMossGenerator> MOSS_GENERATOR;
|
||||
public static TileEntityType<TileEntityNatureAltar> NATURE_ALTAR;
|
||||
public static TileEntityType<TileEntityOakGenerator> OAK_GENERATOR;
|
||||
public static TileEntityType<TileEntityOfferingTable> OFFERING_TABLE;
|
||||
public static TileEntityType<TileEntityPickupStopper> PICKUP_STOPPER;
|
||||
public static TileEntityType<TileEntityPlacer> PLACER;
|
||||
public static TileEntityType<TileEntityPotionGenerator> POTION_GENERATOR;
|
||||
public static TileEntityType<TileEntityPowderPlacer> POWDER_PLACER;
|
||||
public static TileEntityType<TileEntityProjectileGenerator> PROJECTILE_GENERATOR;
|
||||
public static TileEntityType<TileEntityRFConverter> RF_CONVERTER;
|
||||
public static TileEntityType<TileEntitySpawnLamp> SPAWN_LAMP;
|
||||
public static TileEntityType<TileEntityTimeChanger> TIME_CHANGER;
|
||||
public static TileEntityType<TileEntityWoodStand> WOOD_STAND;
|
||||
public static TileEntityType<TileEntityBlastFurnaceBooster> BLAST_FURNACE_BOOSTER;
|
||||
public static TileEntityType<TileEntityAnimalContainer> ANIMAL_CONTAINER;
|
||||
public static TileEntityType<TileEntitySnowCreator> SNOW_CREATOR;
|
||||
public static TileEntityType<TileEntityItemDistributor> ITEM_DISTRIBUTOR;
|
||||
public static TileEntityType<TileEntityAuraBloom> AURA_BLOOM;
|
||||
public static TileEntityType<TileEntityChorusGenerator> CHORUS_GENERATOR;
|
||||
public static TileEntityType<TileEntityAuraTimer> AURA_TIMER;
|
||||
public static TileEntityType<TileEntitySlimeSplitGenerator> SLIME_SPLIT_GENERATOR;
|
||||
public static TileEntityType<TileEntitySpring> SPRING;
|
||||
public static TileEntityType<TileEntityWeatherChanger> WEATHER_CHANGER;
|
||||
}
|
||||
|
|
|
@ -3,11 +3,9 @@ package de.ellpeck.naturesaura.blocks.tiles;
|
|||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
||||
import de.ellpeck.naturesaura.api.aura.container.NaturalAuraContainer;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
|
||||
public class BlockEntityAncientLeaves extends BlockEntityImpl {
|
||||
public class TileEntityAncientLeaves extends TileEntityImpl {
|
||||
|
||||
private final NaturalAuraContainer container = new NaturalAuraContainer(NaturesAuraAPI.TYPE_OVERWORLD, 2000, 500) {
|
||||
@Override
|
||||
|
@ -19,14 +17,14 @@ public class BlockEntityAncientLeaves extends BlockEntityImpl {
|
|||
public int drainAura(int amountToDrain, boolean simulate) {
|
||||
int amount = super.drainAura(amountToDrain, simulate);
|
||||
if (amount > 0 && !simulate) {
|
||||
BlockEntityAncientLeaves.this.sendToClients();
|
||||
TileEntityAncientLeaves.this.sendToClients();
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
};
|
||||
|
||||
public BlockEntityAncientLeaves(BlockPos pos, BlockState state) {
|
||||
super(ModTileEntities.ANCIENT_LEAVES, pos, state);
|
||||
public TileEntityAncientLeaves() {
|
||||
super(ModTileEntities.ANCIENT_LEAVES);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -35,14 +33,14 @@ public class BlockEntityAncientLeaves extends BlockEntityImpl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK)
|
||||
this.container.writeNBT(compound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK)
|
||||
this.container.readNBT(compound);
|
|
@ -0,0 +1,52 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.entity.passive.AnimalEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class TileEntityAnimalContainer extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public TileEntityAnimalContainer() {
|
||||
super(ModTileEntities.ANIMAL_CONTAINER);
|
||||
}
|
||||
|
||||
public int getRadius() {
|
||||
return this.redstonePower / 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRedstonePowerChange(int newPower) {
|
||||
super.onRedstonePowerChange(newPower);
|
||||
this.sendToClients();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.world.isRemote)
|
||||
return;
|
||||
int radius = this.getRadius();
|
||||
Set<AnimalEntity> animalsInRange = new HashSet<>(this.world.getEntitiesWithinAABB(AnimalEntity.class, new AxisAlignedBB(this.pos).grow(radius - 1)));
|
||||
List<AnimalEntity> animalsOutRange = this.world.getEntitiesWithinAABB(AnimalEntity.class, new AxisAlignedBB(this.pos).grow(radius + 1));
|
||||
for (AnimalEntity animal : animalsOutRange) {
|
||||
if (animalsInRange.contains(animal))
|
||||
continue;
|
||||
Vector3d pos = animal.getPositionVec();
|
||||
Vector3d distance = pos.subtract(this.pos.getX(), pos.getY(), this.pos.getZ());
|
||||
distance = distance.normalize().scale(-0.15F);
|
||||
animal.setMotion(distance);
|
||||
|
||||
if (this.world.rand.nextBoolean()) {
|
||||
Vector3d eye = animal.getEyePosition(1).add(animal.getLookVec());
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles((float) eye.getX(), (float) eye.getY(), (float) eye.getZ(), PacketParticles.Type.ANIMAL_CONTAINER));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,23 +1,24 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.packet.PacketHandler;
|
||||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class BlockEntityAnimalGenerator extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAnimalGenerator extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private int timeRemaining;
|
||||
private int amountToRelease;
|
||||
|
||||
public BlockEntityAnimalGenerator(BlockPos pos, BlockState state) {
|
||||
super(ModTileEntities.ANIMAL_GENERATOR, pos, state);
|
||||
public TileEntityAnimalGenerator() {
|
||||
super(ModTileEntities.ANIMAL_GENERATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 10 != 0)
|
||||
if (!this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 10 != 0)
|
||||
return;
|
||||
if (this.timeRemaining <= 0)
|
||||
return;
|
||||
|
@ -25,8 +26,8 @@ public class BlockEntityAnimalGenerator extends BlockEntityImpl implements ITick
|
|||
int remain = this.amountToRelease;
|
||||
if (this.canGenerateRightNow(remain)) {
|
||||
this.generateAura(remain);
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.ANIMAL_GEN_CREATE));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.ANIMAL_GEN_CREATE));
|
||||
}
|
||||
|
||||
this.timeRemaining -= 10;
|
|
@ -9,22 +9,22 @@ import de.ellpeck.naturesaura.packet.PacketHandler;
|
|||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import de.ellpeck.naturesaura.recipes.AnimalSpawnerRecipe;
|
||||
import de.ellpeck.naturesaura.recipes.ModRecipes;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.item.ItemEntity;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.crafting.Ingredient;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.AABB;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAnimalSpawner extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private AnimalSpawnerRecipe currentRecipe;
|
||||
private double spawnX;
|
||||
|
@ -32,16 +32,16 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
|
|||
private int time;
|
||||
private Entity entityClient;
|
||||
|
||||
public BlockEntityAnimalSpawner(BlockPos pos, BlockState state) {
|
||||
super(ModTileEntities.ANIMAL_SPAWNER, pos, state);
|
||||
public TileEntityAnimalSpawner() {
|
||||
super(ModTileEntities.ANIMAL_SPAWNER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 10 != 0)
|
||||
if (!this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 10 != 0)
|
||||
return;
|
||||
if (!Multiblocks.ANIMAL_SPAWNER.isComplete(this.level, this.worldPosition)) {
|
||||
if (!Multiblocks.ANIMAL_SPAWNER.isComplete(this.world, this.pos)) {
|
||||
if (this.currentRecipe != null) {
|
||||
this.currentRecipe = null;
|
||||
this.time = 0;
|
||||
|
@ -51,29 +51,29 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
|
||||
if (this.currentRecipe != null) {
|
||||
int drain = Mth.ceil(this.currentRecipe.aura / (float) this.currentRecipe.time * 10F);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 35, this.worldPosition);
|
||||
IAuraChunk.getAuraChunk(this.level, spot).drainAura(spot, drain);
|
||||
int drain = MathHelper.ceil(this.currentRecipe.aura / (float) this.currentRecipe.time * 10F);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 35, this.pos);
|
||||
IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, drain);
|
||||
|
||||
this.time += 10;
|
||||
if (this.time >= this.currentRecipe.time) {
|
||||
Entity entity = this.currentRecipe.makeEntity(this.level, new BlockPos(this.spawnX, this.worldPosition.getY() + 1, this.spawnZ));
|
||||
this.level.addFreshEntity(entity);
|
||||
Entity entity = this.currentRecipe.makeEntity(this.world, new BlockPos(this.spawnX, this.pos.getY() + 1, this.spawnZ));
|
||||
this.world.addEntity(entity);
|
||||
|
||||
this.currentRecipe = null;
|
||||
this.time = 0;
|
||||
this.sendToClients();
|
||||
}
|
||||
} else {
|
||||
List<ItemEntity> items = this.level.getEntitiesOfClass(ItemEntity.class,
|
||||
new AABB(this.worldPosition).inflate(2));
|
||||
List<ItemEntity> items = this.world.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.pos).grow(2));
|
||||
|
||||
for (AnimalSpawnerRecipe recipe : this.level.getRecipeManager().getRecipesFor(ModRecipes.ANIMAL_SPAWNER_TYPE, null, null)) {
|
||||
for (AnimalSpawnerRecipe recipe : this.world.getRecipeManager().getRecipes(ModRecipes.ANIMAL_SPAWNER_TYPE, null, null)) {
|
||||
if (recipe.ingredients.length != items.size())
|
||||
continue;
|
||||
List<Ingredient> required = new ArrayList<>(Arrays.asList(recipe.ingredients));
|
||||
for (ItemEntity item : items) {
|
||||
if (!item.isAlive() || item.hasPickUpDelay())
|
||||
if (!item.isAlive() || item.cannotPickup())
|
||||
break;
|
||||
ItemStack stack = item.getItem();
|
||||
if (stack.isEmpty())
|
||||
|
@ -89,20 +89,20 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
|
|||
continue;
|
||||
|
||||
for (ItemEntity item : items) {
|
||||
item.remove(Entity.RemovalReason.KILLED);
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER));
|
||||
item.remove();
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.ANIMAL_SPAWNER));
|
||||
}
|
||||
|
||||
this.currentRecipe = recipe;
|
||||
this.spawnX = this.worldPosition.getX() + 0.5 + this.level.random.nextFloat() * 4 - 2;
|
||||
this.spawnZ = this.worldPosition.getZ() + 0.5 + this.level.random.nextFloat() * 4 - 2;
|
||||
this.spawnX = this.pos.getX() + 0.5 + this.world.rand.nextFloat() * 4 - 2;
|
||||
this.spawnZ = this.pos.getZ() + 0.5 + this.world.rand.nextFloat() * 4 - 2;
|
||||
this.sendToClients();
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.level.getGameTime() % 5 != 0)
|
||||
if (this.world.getGameTime() % 5 != 0)
|
||||
return;
|
||||
if (this.currentRecipe == null) {
|
||||
this.entityClient = null;
|
||||
|
@ -110,32 +110,32 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
|
||||
NaturesAuraAPI.instance().spawnParticleStream(
|
||||
this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F,
|
||||
this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F,
|
||||
this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F,
|
||||
this.worldPosition.getX() + this.level.random.nextFloat(),
|
||||
this.worldPosition.getY() + this.level.random.nextFloat(),
|
||||
this.worldPosition.getZ() + this.level.random.nextFloat(),
|
||||
this.level.random.nextFloat() * 0.07F + 0.07F,
|
||||
IAuraType.forLevel(this.level).getColor(),
|
||||
this.level.random.nextFloat() + 0.5F);
|
||||
this.pos.getX() + (float) this.world.rand.nextGaussian() * 5F,
|
||||
this.pos.getY() + 1 + this.world.rand.nextFloat() * 5F,
|
||||
this.pos.getZ() + (float) this.world.rand.nextGaussian() * 5F,
|
||||
this.pos.getX() + this.world.rand.nextFloat(),
|
||||
this.pos.getY() + this.world.rand.nextFloat(),
|
||||
this.pos.getZ() + this.world.rand.nextFloat(),
|
||||
this.world.rand.nextFloat() * 0.07F + 0.07F,
|
||||
IAuraType.forWorld(this.world).getColor(),
|
||||
this.world.rand.nextFloat() + 0.5F);
|
||||
|
||||
if (this.entityClient == null) {
|
||||
this.entityClient = this.currentRecipe.makeEntity(this.level, BlockPos.ZERO);
|
||||
this.entityClient.setPos(this.spawnX, this.worldPosition.getY() + 1, this.spawnZ);
|
||||
this.entityClient = this.currentRecipe.makeEntity(this.world, BlockPos.ZERO);
|
||||
this.entityClient.setPosition(this.spawnX, this.pos.getY() + 1, this.spawnZ);
|
||||
}
|
||||
AABB bounds = this.entityClient.getBoundingBox();
|
||||
for (int i = this.level.random.nextInt(5) + 5; i >= 0; i--)
|
||||
AxisAlignedBB bounds = this.entityClient.getBoundingBox();
|
||||
for (int i = this.world.rand.nextInt(5) + 5; i >= 0; i--)
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
bounds.minX + this.level.random.nextFloat() * (bounds.maxX - bounds.minX),
|
||||
bounds.minY + this.level.random.nextFloat() * (bounds.maxY - bounds.minY),
|
||||
bounds.minZ + this.level.random.nextFloat() * (bounds.maxZ - bounds.minZ),
|
||||
bounds.minX + this.world.rand.nextFloat() * (bounds.maxX - bounds.minX),
|
||||
bounds.minY + this.world.rand.nextFloat() * (bounds.maxY - bounds.minY),
|
||||
bounds.minZ + this.world.rand.nextFloat() * (bounds.maxZ - bounds.minZ),
|
||||
0F, 0F, 0F, 0x2fd8d3, 2F, 60, 0F, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (this.currentRecipe != null) {
|
||||
|
@ -148,13 +148,13 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (compound.contains("recipe")) {
|
||||
if (this.hasLevel()) {
|
||||
if (this.hasWorld()) {
|
||||
ResourceLocation name = new ResourceLocation(compound.getString("recipe"));
|
||||
this.currentRecipe = (AnimalSpawnerRecipe) this.level.getRecipeManager().byKey(name).orElse(null);
|
||||
this.currentRecipe = (AnimalSpawnerRecipe) this.world.getRecipeManager().getRecipe(name).orElse(null);
|
||||
}
|
||||
this.spawnX = compound.getDouble("spawn_x");
|
||||
this.spawnZ = compound.getDouble("spawn_z");
|
|
@ -1,40 +1,40 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntityType;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
|
||||
public class BlockEntityAuraBloom extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAuraBloom extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public boolean justGenerated;
|
||||
|
||||
public BlockEntityAuraBloom() {
|
||||
public TileEntityAuraBloom() {
|
||||
this(ModTileEntities.AURA_BLOOM);
|
||||
}
|
||||
|
||||
protected BlockEntityAuraBloom(BlockEntityType<BlockEntityAuraBloom> type) {
|
||||
protected TileEntityAuraBloom(TileEntityType<TileEntityAuraBloom> type) {
|
||||
super(type);
|
||||
}
|
||||
|
||||
// Doing this in validate() creates a loading deadlock for some reason...
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.level.isClientSide || !this.justGenerated)
|
||||
if (this.world.isRemote || !this.justGenerated)
|
||||
return;
|
||||
this.generateAura(150000);
|
||||
this.justGenerated = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type == SaveType.TILE)
|
||||
compound.putBoolean("just_generated", this.justGenerated);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type == SaveType.TILE)
|
||||
this.justGenerated = compound.getBoolean("just_generated");
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
public class BlockEntityAuraDetector extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAuraDetector extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public int redstonePower;
|
||||
|
||||
public BlockEntityAuraDetector() {
|
||||
public TileEntityAuraDetector() {
|
||||
super(ModTileEntities.AURA_DETECTOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide && this.level.getGameTime() % 20 == 0) {
|
||||
int totalAmount = IAuraChunk.triangulateAuraInArea(this.level, this.worldPosition, 25);
|
||||
int power = Mth.clamp(Mth.ceil(totalAmount / (IAuraChunk.DEFAULT_AURA * 2F) * 15F), 0, 15);
|
||||
if (!this.world.isRemote && this.world.getGameTime() % 20 == 0) {
|
||||
int totalAmount = IAuraChunk.triangulateAuraInArea(this.world, this.pos, 25);
|
||||
int power = MathHelper.clamp(MathHelper.ceil(totalAmount / (IAuraChunk.DEFAULT_AURA * 2F) * 15F), 0, 15);
|
||||
if (this.redstonePower != power) {
|
||||
this.redstonePower = power;
|
||||
this.level.updateComparatorOutputLevel(this.worldPosition, this.getBlockState().getBlock());
|
||||
this.world.updateComparatorOutputLevel(this.pos, this.getBlockState().getBlock());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,14 +9,14 @@ import de.ellpeck.naturesaura.packet.PacketHandler;
|
|||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAuraTimer extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private static final Map<IAuraType, Integer> TIMES = ImmutableMap.<IAuraType, Integer>builder()
|
||||
.put(NaturesAuraAPI.TYPE_OVERWORLD, 20)
|
||||
|
@ -30,7 +30,7 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
};
|
||||
private int timer;
|
||||
|
||||
public BlockEntityAuraTimer() {
|
||||
public TileEntityAuraTimer() {
|
||||
super(ModTileEntities.AURA_TIMER);
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
if (this.redstonePower <= 0 && newPower > 0) {
|
||||
this.timer = 0;
|
||||
int color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor();
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.TIMER_RESET, color));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.TIMER_RESET, color));
|
||||
this.sendToClients();
|
||||
}
|
||||
super.onRedstonePowerChange(newPower);
|
||||
|
@ -53,14 +53,14 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
return;
|
||||
}
|
||||
|
||||
if (this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 8 == 0) {
|
||||
if (this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 8 == 0) {
|
||||
int color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor();
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
this.worldPosition.getX() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F,
|
||||
this.worldPosition.getY() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F,
|
||||
this.worldPosition.getZ() + 1 / 16F + this.level.rand.nextFloat() * 14 / 16F,
|
||||
0, 0, 0, color, 1, 80 + this.level.rand.nextInt(50), 0, false, true);
|
||||
this.pos.getX() + 1 / 16F + this.world.rand.nextFloat() * 14 / 16F,
|
||||
this.pos.getY() + 1 / 16F + this.world.rand.nextFloat() * 14 / 16F,
|
||||
this.pos.getZ() + 1 / 16F + this.world.rand.nextFloat() * 14 / 16F,
|
||||
0, 0, 0, color, 1, 80 + this.world.rand.nextInt(50), 0, false, true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -70,11 +70,11 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
this.timer = 0;
|
||||
|
||||
BlockState state = this.getBlockState();
|
||||
this.level.setBlockState(this.worldPosition, state.with(BlockStateProperties.POWERED, true), 1);
|
||||
this.level.getPendingBlockTicks().scheduleTick(this.worldPosition, state.getBlock(), 4);
|
||||
this.world.setBlockState(this.pos, state.with(BlockStateProperties.POWERED, true), 1);
|
||||
this.world.getPendingBlockTicks().scheduleTick(this.pos, state.getBlock(), 4);
|
||||
|
||||
int color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor();
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.TIMER_RESET, color));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.TIMER_RESET, color));
|
||||
}
|
||||
if (this.timer % 2 == 0)
|
||||
this.sendToClients();
|
||||
|
@ -104,7 +104,7 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
compound.put("items", this.itemHandler.serializeNBT());
|
||||
|
@ -113,7 +113,7 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
this.itemHandler.deserializeNBT(compound.getCompound("items"));
|
||||
|
|
|
@ -6,13 +6,13 @@ import de.ellpeck.naturesaura.packet.PacketHandler;
|
|||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.CraftingInventory;
|
||||
import net.minecraft.inventory.container.Container;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.IRecipeType;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.EntityPredicates;
|
||||
import net.minecraft.util.NonNullList;
|
||||
|
@ -21,30 +21,30 @@ import net.minecraft.util.math.BlockPos;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityAutoCrafter extends TileEntityImpl implements ITickableTileEntity {
|
||||
public final CraftingInventory crafting = new CraftingInventory(new Container(null, 0) {
|
||||
@Override
|
||||
public boolean canInteractWith(Player playerIn) {
|
||||
public boolean canInteractWith(PlayerEntity playerIn) {
|
||||
return false;
|
||||
}
|
||||
}, 3, 3);
|
||||
|
||||
public BlockEntityAutoCrafter() {
|
||||
public TileEntityAutoCrafter() {
|
||||
super(ModTileEntities.AUTO_CRAFTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 60 != 0)
|
||||
if (!this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 60 != 0)
|
||||
return;
|
||||
if (!Multiblocks.AUTO_CRAFTER.isComplete(this.level, this.worldPosition))
|
||||
if (!Multiblocks.AUTO_CRAFTER.isComplete(this.world, this.pos))
|
||||
return;
|
||||
this.crafting.clear();
|
||||
|
||||
BlockState state = this.level.getBlockState(this.worldPosition);
|
||||
BlockState state = this.world.getBlockState(this.pos);
|
||||
Direction facing = state.get(BlockAutoCrafter.FACING);
|
||||
BlockPos middlePos = this.worldPosition.up();
|
||||
BlockPos middlePos = this.pos.up();
|
||||
BlockPos topPos = middlePos.offset(facing, 2);
|
||||
BlockPos bottomPos = middlePos.offset(facing.getOpposite(), 2);
|
||||
BlockPos[] poses = new BlockPos[]{
|
||||
|
@ -61,7 +61,7 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
|
|||
|
||||
ItemEntity[] items = new ItemEntity[9];
|
||||
for (int i = 0; i < poses.length; i++) {
|
||||
List<ItemEntity> entities = this.level.getEntitiesWithinAABB(
|
||||
List<ItemEntity> entities = this.world.getEntitiesWithinAABB(
|
||||
ItemEntity.class, new AxisAlignedBB(poses[i]).grow(0.25), EntityPredicates.IS_ALIVE);
|
||||
if (entities.size() > 1)
|
||||
return;
|
||||
|
@ -77,17 +77,17 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
|
|||
this.crafting.setInventorySlotContents(i, stack.copy());
|
||||
}
|
||||
|
||||
IRecipe recipe = this.level.getRecipeManager().getRecipe(IRecipeType.CRAFTING, this.crafting, this.level).orElse(null);
|
||||
IRecipe recipe = this.world.getRecipeManager().getRecipe(IRecipeType.CRAFTING, this.crafting, this.world).orElse(null);
|
||||
if (recipe == null)
|
||||
return;
|
||||
|
||||
ItemStack result = recipe.getCraftingResult(this.crafting);
|
||||
if (result.isEmpty())
|
||||
return;
|
||||
ItemEntity resultItem = new ItemEntity(this.level,
|
||||
this.worldPosition.getX() + 0.5F, this.worldPosition.getY() - 0.35F, this.worldPosition.getZ() + 0.5F, result.copy());
|
||||
ItemEntity resultItem = new ItemEntity(this.world,
|
||||
this.pos.getX() + 0.5F, this.pos.getY() - 0.35F, this.pos.getZ() + 0.5F, result.copy());
|
||||
resultItem.setMotion(0, 0, 0);
|
||||
this.level.addEntity(resultItem);
|
||||
this.world.addEntity(resultItem);
|
||||
|
||||
NonNullList<ItemStack> remainingItems = recipe.getRemainingItems(this.crafting);
|
||||
for (int i = 0; i < items.length; i++) {
|
||||
|
@ -104,12 +104,12 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
|
|||
|
||||
ItemStack remain = remainingItems.get(i);
|
||||
if (!remain.isEmpty()) {
|
||||
ItemEntity remItem = new ItemEntity(this.level, item.getPosX(), item.getPosY(), item.getPosZ(), remain.copy());
|
||||
ItemEntity remItem = new ItemEntity(this.world, item.getPosX(), item.getPosY(), item.getPosZ(), remain.copy());
|
||||
remItem.setMotion(0, 0, 0);
|
||||
this.level.addEntity(remItem);
|
||||
this.world.addEntity(remItem);
|
||||
}
|
||||
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.ANIMAL_SPAWNER));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,9 +6,9 @@ import de.ellpeck.naturesaura.packet.PacketParticles;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.tileentity.BlastFurnaceBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.BlastFurnaceTileEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.IIntArray;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -19,35 +19,35 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityBlastFurnaceBooster extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public BlockEntityBlastFurnaceBooster() {
|
||||
public TileEntityBlastFurnaceBooster() {
|
||||
super(ModTileEntities.BLAST_FURNACE_BOOSTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.level.isClientSide)
|
||||
if (this.world.isRemote)
|
||||
return;
|
||||
|
||||
BlockEntity below = this.level.getBlockEntity(this.worldPosition.down());
|
||||
if (!(below instanceof BlastFurnaceBlockEntity))
|
||||
TileEntity below = this.world.getTileEntity(this.pos.down());
|
||||
if (!(below instanceof BlastFurnaceTileEntity))
|
||||
return;
|
||||
BlastFurnaceBlockEntity tile = (BlastFurnaceBlockEntity) below;
|
||||
IRecipe<?> recipe = this.level.getRecipeManager().getRecipe(BlockEntityFurnaceHeater.getRecipeType(tile), tile, this.level).orElse(null);
|
||||
BlastFurnaceTileEntity tile = (BlastFurnaceTileEntity) below;
|
||||
IRecipe<?> recipe = this.world.getRecipeManager().getRecipe(TileEntityFurnaceHeater.getRecipeType(tile), tile, this.world).orElse(null);
|
||||
if (recipe == null)
|
||||
return;
|
||||
if (!this.isApplicable(recipe.getIngredients()))
|
||||
return;
|
||||
|
||||
IIntArray data = BlockEntityFurnaceHeater.getFurnaceData(tile);
|
||||
IIntArray data = TileEntityFurnaceHeater.getFurnaceData(tile);
|
||||
int doneDiff = data.get(3) - data.get(2);
|
||||
if (doneDiff > 1)
|
||||
return;
|
||||
|
||||
if (this.level.rand.nextFloat() > 0.45F) {
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 0));
|
||||
if (this.world.rand.nextFloat() > 0.45F) {
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 0));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -62,11 +62,11 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I
|
|||
output.grow(1);
|
||||
}
|
||||
|
||||
BlockPos pos = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 30, this.worldPosition);
|
||||
IAuraChunk.getAuraChunk(this.level, pos).drainAura(pos, 6500);
|
||||
BlockPos pos = IAuraChunk.getHighestSpot(this.world, this.pos, 30, this.pos);
|
||||
IAuraChunk.getAuraChunk(this.world, pos).drainAura(pos, 6500);
|
||||
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 1));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 1));
|
||||
}
|
||||
|
||||
private boolean isApplicable(List<Ingredient> ingredients) {
|
||||
|
@ -81,8 +81,8 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I
|
|||
|
||||
@Override
|
||||
public IItemHandlerModifiable getItemHandler() {
|
||||
BlockEntity below = this.level.getBlockEntity(this.worldPosition.down());
|
||||
if (!(below instanceof BlastFurnaceBlockEntity))
|
||||
TileEntity below = this.world.getTileEntity(this.pos.down());
|
||||
if (!(below instanceof BlastFurnaceTileEntity))
|
||||
return null;
|
||||
IItemHandler handler = below.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP).orElse(null);
|
||||
if (handler == null)
|
||||
|
|
|
@ -5,10 +5,10 @@ import de.ellpeck.naturesaura.packet.PacketHandler;
|
|||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.ListNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvents;
|
||||
|
@ -19,32 +19,32 @@ import java.util.ArrayList;
|
|||
import java.util.Deque;
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityChorusGenerator extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private final Deque<BlockPos> currentlyBreaking = new ArrayDeque<>();
|
||||
private int auraPerBlock;
|
||||
|
||||
public BlockEntityChorusGenerator() {
|
||||
public TileEntityChorusGenerator() {
|
||||
super(ModTileEntities.CHORUS_GENERATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.level.isClientSide)
|
||||
if (this.world.isRemote)
|
||||
return;
|
||||
if (this.level.getGameTime() % 5 != 0)
|
||||
if (this.world.getGameTime() % 5 != 0)
|
||||
return;
|
||||
if (this.currentlyBreaking.isEmpty())
|
||||
return;
|
||||
BlockPos pos = this.currentlyBreaking.removeLast();
|
||||
BlockState state = this.level.getBlockState(pos);
|
||||
BlockState state = this.world.getBlockState(pos);
|
||||
if (state.getBlock() != Blocks.CHORUS_PLANT && state.getBlock() != Blocks.CHORUS_FLOWER) {
|
||||
this.currentlyBreaking.clear();
|
||||
return;
|
||||
}
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ()));
|
||||
this.level.removeBlock(pos, false);
|
||||
this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5,
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ()));
|
||||
this.world.removeBlock(pos, false);
|
||||
this.world.playSound(null, this.pos.getX() + 0.5, this.pos.getY() + 0.5, this.pos.getZ() + 0.5,
|
||||
SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.BLOCKS, 0.5F, 1F);
|
||||
this.generateAura(this.auraPerBlock);
|
||||
}
|
||||
|
@ -57,11 +57,11 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
|
|||
for (int x = -range; x <= range; x++) {
|
||||
for (int y = -range; y <= range; y++) {
|
||||
for (int z = -range; z <= range; z++) {
|
||||
BlockPos offset = this.worldPosition.add(x, y, z);
|
||||
BlockState below = this.level.getBlockState(offset.down());
|
||||
BlockPos offset = this.pos.add(x, y, z);
|
||||
BlockState below = this.world.getBlockState(offset.down());
|
||||
if (below.getBlock() != Blocks.END_STONE)
|
||||
continue;
|
||||
BlockState state = this.level.getBlockState(offset);
|
||||
BlockState state = this.world.getBlockState(offset);
|
||||
if (state.getBlock() != Blocks.CHORUS_PLANT)
|
||||
continue;
|
||||
|
||||
|
@ -90,7 +90,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
|
|||
BlockPos offset = pos.offset(dir);
|
||||
if (blocks.contains(offset))
|
||||
continue;
|
||||
BlockState state = this.level.getBlockState(offset);
|
||||
BlockState state = this.world.getBlockState(offset);
|
||||
if (state.getBlock() != Blocks.CHORUS_PLANT && state.getBlock() != Blocks.CHORUS_FLOWER)
|
||||
continue;
|
||||
blocks.add(offset);
|
||||
|
@ -99,7 +99,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type == SaveType.TILE) {
|
||||
ListNBT list = new ListNBT();
|
||||
|
@ -111,7 +111,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type == SaveType.TILE) {
|
||||
this.currentlyBreaking.clear();
|
||||
|
|
|
@ -2,24 +2,24 @@ package de.ellpeck.naturesaura.blocks.tiles;
|
|||
|
||||
import de.ellpeck.naturesaura.ModConfig;
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityChunkLoader extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private final List<ChunkPos> forcedChunks = new ArrayList<>();
|
||||
private boolean firstTick = true;
|
||||
|
||||
public BlockEntityChunkLoader() {
|
||||
public TileEntityChunkLoader() {
|
||||
super(ModTileEntities.CHUNK_LOADER);
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable
|
|||
@Override
|
||||
public void onRedstonePowerChange(int newPower) {
|
||||
super.onRedstonePowerChange(newPower);
|
||||
if (!this.level.isClientSide) {
|
||||
if (!this.world.isRemote) {
|
||||
this.loadChunks(false);
|
||||
this.sendToClients();
|
||||
}
|
||||
|
@ -43,19 +43,19 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
|
||||
private void loadChunks(boolean unload) {
|
||||
if (this.level.isClientSide || !ModConfig.instance.chunkLoader.get())
|
||||
if (this.world.isRemote || !ModConfig.instance.chunkLoader.get())
|
||||
return;
|
||||
ServerLevel level = (ServerLevel) this.level;
|
||||
ServerWorld world = (ServerWorld) this.world;
|
||||
|
||||
List<ChunkPos> shouldBeForced = new ArrayList<>();
|
||||
if (!unload) {
|
||||
int range = this.range();
|
||||
if (range > 0) {
|
||||
for (int x = (this.worldPosition.getX() - range) >> 4; x <= (this.worldPosition.getX() + range) >> 4; x++) {
|
||||
for (int z = (this.worldPosition.getZ() - range) >> 4; z <= (this.worldPosition.getZ() + range) >> 4; z++) {
|
||||
for (int x = (this.pos.getX() - range) >> 4; x <= (this.pos.getX() + range) >> 4; x++) {
|
||||
for (int z = (this.pos.getZ() - range) >> 4; z <= (this.pos.getZ() + range) >> 4; z++) {
|
||||
ChunkPos pos = new ChunkPos(x, z);
|
||||
// Only force chunks that we're already forcing or that nobody else is forcing
|
||||
if (this.forcedChunks.contains(pos) || !level.getForcedChunks().contains(pos.asLong()))
|
||||
if (this.forcedChunks.contains(pos) || !world.getForcedChunks().contains(pos.asLong()))
|
||||
shouldBeForced.add(pos);
|
||||
}
|
||||
}
|
||||
|
@ -65,20 +65,20 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable
|
|||
// Unforce all of the chunks that shouldn't be forced anymore
|
||||
for (ChunkPos pos : this.forcedChunks) {
|
||||
if (!shouldBeForced.contains(pos))
|
||||
level.forceChunk(pos.x, pos.z, false);
|
||||
world.forceChunk(pos.x, pos.z, false);
|
||||
}
|
||||
this.forcedChunks.clear();
|
||||
|
||||
// Force all chunks that should be forced
|
||||
for (ChunkPos pos : shouldBeForced) {
|
||||
level.forceChunk(pos.x, pos.z, true);
|
||||
world.forceChunk(pos.x, pos.z, true);
|
||||
this.forcedChunks.add(pos);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide && ModConfig.instance.chunkLoader.get()) {
|
||||
if (!this.world.isRemote && ModConfig.instance.chunkLoader.get()) {
|
||||
// defer loading chunks on load to here since, otherwise, deadlocks happen oof
|
||||
// since forced chunks are saved to disk by the game, this is only necessary for when the chunk loader config changes
|
||||
if (this.firstTick) {
|
||||
|
@ -86,25 +86,25 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable
|
|||
this.firstTick = false;
|
||||
}
|
||||
|
||||
if (this.level.getGameTime() % 20 != 0)
|
||||
if (this.world.getGameTime() % 20 != 0)
|
||||
return;
|
||||
int toUse = Mth.ceil(this.range() / 2F);
|
||||
int toUse = MathHelper.ceil(this.range() / 2F);
|
||||
if (toUse > 0) {
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 35, this.worldPosition);
|
||||
IAuraChunk.getAuraChunk(this.level, spot).drainAura(spot, toUse);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 35, this.pos);
|
||||
IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, toUse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type == SaveType.TILE)
|
||||
compound.putLongArray("forced_chunks", this.forcedChunks.stream().map(ChunkPos::asLong).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
|
||||
if (type == SaveType.TILE) {
|
||||
|
|
|
@ -10,15 +10,15 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.EntityPredicates;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityEndFlower extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private final BasicAuraContainer container = new BasicAuraContainer(null, 500000) {
|
||||
{
|
||||
|
@ -34,7 +34,7 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
public int drainAura(int amountToDrain, boolean simulate) {
|
||||
int amount = super.drainAura(amountToDrain, simulate);
|
||||
if (amount > 0 && !simulate)
|
||||
BlockEntityEndFlower.this.sendToClients();
|
||||
TileEntityEndFlower.this.sendToClients();
|
||||
return amount;
|
||||
}
|
||||
|
||||
|
@ -46,19 +46,19 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
|
||||
public boolean isDrainMode;
|
||||
|
||||
public BlockEntityEndFlower() {
|
||||
public TileEntityEndFlower() {
|
||||
super(ModTileEntities.END_FLOWER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 10 != 0)
|
||||
if (!this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 10 != 0)
|
||||
return;
|
||||
|
||||
if (!this.isDrainMode) {
|
||||
List<ItemEntity> items = this.level.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.worldPosition).grow(1), EntityPredicates.IS_ALIVE);
|
||||
List<ItemEntity> items = this.world.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.pos).grow(1), EntityPredicates.IS_ALIVE);
|
||||
for (ItemEntity item : items) {
|
||||
if (item.cannotPickup())
|
||||
continue;
|
||||
|
@ -71,7 +71,7 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
this.isDrainMode = true;
|
||||
item.remove();
|
||||
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.END_FLOWER_CONSUME, this.container.getAuraColor()));
|
||||
break;
|
||||
}
|
||||
|
@ -81,21 +81,21 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
this.generateAura(toDrain);
|
||||
|
||||
if (this.container.getStoredAura() <= 0) {
|
||||
this.level.setBlockState(this.worldPosition, Blocks.DEAD_BUSH.getDefaultState());
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.END_FLOWER_DECAY, this.container.getAuraColor()));
|
||||
this.world.setBlockState(this.pos, Blocks.DEAD_BUSH.getDefaultState());
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.END_FLOWER_DECAY, this.container.getAuraColor()));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.isDrainMode && this.level.getGameTime() % 5 == 0)
|
||||
if (this.isDrainMode && this.world.getGameTime() % 5 == 0)
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
this.worldPosition.getX() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.worldPosition.getY() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.worldPosition.getZ() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.level.rand.nextGaussian() * 0.05F,
|
||||
this.level.rand.nextFloat() * 0.1F,
|
||||
this.level.rand.nextGaussian() * 0.05F,
|
||||
this.container.getAuraColor(), this.level.rand.nextFloat() * 2F + 1F, 50, 0F, false, true);
|
||||
this.pos.getX() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.pos.getY() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.pos.getZ() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.world.rand.nextGaussian() * 0.05F,
|
||||
this.world.rand.nextFloat() * 0.1F,
|
||||
this.world.rand.nextGaussian() * 0.05F,
|
||||
this.container.getAuraColor(), this.world.rand.nextFloat() * 2F + 1F, 50, 0F, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
this.container.writeNBT(compound);
|
||||
|
@ -114,7 +114,7 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
this.container.readNBT(compound);
|
||||
|
|
|
@ -2,16 +2,16 @@ package de.ellpeck.naturesaura.blocks.tiles;
|
|||
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.blocks.BlockEnderCrate;
|
||||
import de.ellpeck.naturesaura.gui.ContainerEnderCrate;
|
||||
import de.ellpeck.naturesaura.gui.ModContainers;
|
||||
import net.minecraft.entity.player.Player;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.inventory.container.Container;
|
||||
import net.minecraft.inventory.container.INamedContainerProvider;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
@ -21,7 +21,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedContainerProvider {
|
||||
public class TileEntityEnderCrate extends TileEntityImpl implements INamedContainerProvider {
|
||||
|
||||
public String name;
|
||||
private final IItemHandlerModifiable wrappedEnderStorage = new IItemHandlerModifiable() {
|
||||
|
@ -46,7 +46,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
|
||||
ItemStack remain = this.getStorage().insertItem(slot, stack, simulate);
|
||||
if (!simulate)
|
||||
BlockEntityEnderCrate.this.drainAura((stack.getCount() - remain.getCount()) * 20);
|
||||
TileEntityEnderCrate.this.drainAura((stack.getCount() - remain.getCount()) * 20);
|
||||
return remain;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
public ItemStack extractItem(int slot, int amount, boolean simulate) {
|
||||
ItemStack extracted = this.getStorage().extractItem(slot, amount, simulate);
|
||||
if (!simulate)
|
||||
BlockEntityEnderCrate.this.drainAura(extracted.getCount() * 20);
|
||||
TileEntityEnderCrate.this.drainAura(extracted.getCount() * 20);
|
||||
return extracted;
|
||||
}
|
||||
|
||||
|
@ -70,11 +70,11 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
}
|
||||
|
||||
private IItemHandlerModifiable getStorage() {
|
||||
return ILevelData.getOverworldData(BlockEntityEnderCrate.this.level).getEnderStorage(BlockEntityEnderCrate.this.name);
|
||||
return IWorldData.getOverworldData(TileEntityEnderCrate.this.world).getEnderStorage(TileEntityEnderCrate.this.name);
|
||||
}
|
||||
};
|
||||
|
||||
public BlockEntityEnderCrate() {
|
||||
public TileEntityEnderCrate() {
|
||||
super(ModTileEntities.ENDER_CRATE);
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
public void modifyDrop(ItemStack regularItem) {
|
||||
if (this.name != null) {
|
||||
if (!regularItem.hasTag())
|
||||
regularItem.setTag(new CompoundTag());
|
||||
regularItem.setTag(new CompoundNBT());
|
||||
regularItem.getTag().putString(NaturesAura.MOD_ID + ":ender_name", this.name);
|
||||
}
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
@Override
|
||||
public void loadDataOnPlace(ItemStack stack) {
|
||||
super.loadDataOnPlace(stack);
|
||||
if (!this.level.isClientSide) {
|
||||
if (!this.world.isRemote) {
|
||||
String name = BlockEnderCrate.getEnderName(stack);
|
||||
if (name != null && !name.isEmpty())
|
||||
this.name = name;
|
||||
|
@ -113,7 +113,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (this.name != null)
|
||||
|
@ -122,7 +122,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (compound.contains("name"))
|
||||
|
@ -132,8 +132,8 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
|
||||
public void drainAura(int amount) {
|
||||
if (amount > 0) {
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 35, this.worldPosition);
|
||||
IAuraChunk.getAuraChunk(this.level, spot).drainAura(spot, amount);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 35, this.pos);
|
||||
IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, amount);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements INamedCont
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public Container createMenu(int window, PlayerInventory inv, Player player) {
|
||||
public Container createMenu(int window, PlayerInventory inv, PlayerEntity player) {
|
||||
return new ContainerEnderCrate(ModContainers.ENDER_CRATE, window, player, this.getItemHandler());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,44 +13,44 @@ import net.minecraft.item.ItemStack;
|
|||
import net.minecraft.item.Items;
|
||||
import net.minecraft.loot.LootContext;
|
||||
import net.minecraft.loot.LootParameters;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.level.server.ServerLevel;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
||||
import net.minecraftforge.event.level.BlockEvent;
|
||||
import net.minecraftforge.event.world.BlockEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityFieldCreator extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public BlockPos connectionOffset;
|
||||
public boolean isMain;
|
||||
public boolean isCharged;
|
||||
private int chargeTimer;
|
||||
|
||||
public BlockEntityFieldCreator() {
|
||||
public TileEntityFieldCreator() {
|
||||
super(ModTileEntities.FIELD_CREATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (this.level.isClientSide || this.level.getGameTime() % 10 != 0)
|
||||
if (this.world.isRemote || this.world.getGameTime() % 10 != 0)
|
||||
return;
|
||||
|
||||
BlockPos connectedPos = this.getConnectedPos();
|
||||
if (connectedPos == null || !this.level.isBlockLoaded(connectedPos))
|
||||
if (connectedPos == null || !this.world.isBlockLoaded(connectedPos))
|
||||
return;
|
||||
|
||||
BlockEntity other = this.level.getBlockEntity(connectedPos);
|
||||
TileEntity other = this.world.getTileEntity(connectedPos);
|
||||
if (!this.isCloseEnough(connectedPos)
|
||||
|| !(other instanceof BlockEntityFieldCreator)
|
||||
|| !this.worldPosition.equals(((BlockEntityFieldCreator) other).getConnectedPos())) {
|
||||
|| !(other instanceof TileEntityFieldCreator)
|
||||
|| !this.pos.equals(((TileEntityFieldCreator) other).getConnectedPos())) {
|
||||
this.connectionOffset = null;
|
||||
this.chargeTimer = 0;
|
||||
this.isCharged = false;
|
||||
|
@ -62,7 +62,7 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
if (!this.isMain)
|
||||
return;
|
||||
|
||||
BlockEntityFieldCreator creator = (BlockEntityFieldCreator) other;
|
||||
TileEntityFieldCreator creator = (TileEntityFieldCreator) other;
|
||||
if (this.redstonePower <= 0 && creator.redstonePower <= 0) {
|
||||
this.chargeTimer = 0;
|
||||
if (this.isCharged) {
|
||||
|
@ -74,8 +74,8 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
return;
|
||||
}
|
||||
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 32, this.worldPosition);
|
||||
IAuraChunk chunk = IAuraChunk.getAuraChunk(this.level, spot);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 32, this.pos);
|
||||
IAuraChunk chunk = IAuraChunk.getAuraChunk(this.world, spot);
|
||||
|
||||
if (!this.isCharged) {
|
||||
this.chargeTimer += 10;
|
||||
|
@ -91,41 +91,41 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
chunk.drainAura(spot, 300);
|
||||
this.sendParticles();
|
||||
} else {
|
||||
if (this.level.getGameTime() % 40 == 0)
|
||||
if (this.world.getGameTime() % 40 == 0)
|
||||
chunk.drainAura(spot, 20);
|
||||
|
||||
ItemStack tool = this.getToolUsed(creator);
|
||||
Vector3d dist = new Vector3d(
|
||||
this.worldPosition.getX() - connectedPos.getX(),
|
||||
this.worldPosition.getY() - connectedPos.getY(),
|
||||
this.worldPosition.getZ() - connectedPos.getZ()
|
||||
this.pos.getX() - connectedPos.getX(),
|
||||
this.pos.getY() - connectedPos.getY(),
|
||||
this.pos.getZ() - connectedPos.getZ()
|
||||
);
|
||||
double length = dist.length();
|
||||
Vector3d normal = new Vector3d(dist.x / length, dist.y / length, dist.z / length);
|
||||
for (float i = Mth.floor(length); i > 0; i -= 0.5F) {
|
||||
for (float i = MathHelper.floor(length); i > 0; i -= 0.5F) {
|
||||
Vector3d scaled = normal.scale(i);
|
||||
BlockPos pos = connectedPos.add(
|
||||
Mth.floor(scaled.x + 0.5F),
|
||||
Mth.floor(scaled.y + 0.5F),
|
||||
Mth.floor(scaled.z + 0.5F));
|
||||
MathHelper.floor(scaled.x + 0.5F),
|
||||
MathHelper.floor(scaled.y + 0.5F),
|
||||
MathHelper.floor(scaled.z + 0.5F));
|
||||
|
||||
if (pos.equals(this.worldPosition) || pos.equals(connectedPos))
|
||||
if (pos.equals(this.pos) || pos.equals(connectedPos))
|
||||
continue;
|
||||
|
||||
BlockState state = this.level.getBlockState(pos);
|
||||
BlockState state = this.world.getBlockState(pos);
|
||||
Block block = state.getBlock();
|
||||
if (!block.isAir(state, this.level, pos) && state.getBlockHardness(this.level, pos) >= 0F) {
|
||||
FakePlayer fake = FakePlayerFactory.getMinecraft((ServerLevel) this.level);
|
||||
if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(this.level, pos, state, fake))) {
|
||||
List<ItemStack> drops = state.getDrops(new LootContext.Builder((ServerLevel) this.level)
|
||||
if (!block.isAir(state, this.world, pos) && state.getBlockHardness(this.world, pos) >= 0F) {
|
||||
FakePlayer fake = FakePlayerFactory.getMinecraft((ServerWorld) this.world);
|
||||
if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(this.world, pos, state, fake))) {
|
||||
List<ItemStack> drops = state.getDrops(new LootContext.Builder((ServerWorld) this.world)
|
||||
.withParameter(LootParameters.THIS_ENTITY, fake)
|
||||
.withParameter(LootParameters.field_237457_g_, Vector3d.copyCentered(pos))
|
||||
.withParameter(LootParameters.BLOCK_STATE, state)
|
||||
.withParameter(LootParameters.TOOL, tool.isEmpty() ? new ItemStack(Items.DIAMOND_PICKAXE) : tool)
|
||||
.withNullableParameter(LootParameters.BLOCK_ENTITY, this.level.getBlockEntity(pos)));
|
||||
this.level.destroyBlock(pos, false);
|
||||
.withNullableParameter(LootParameters.BLOCK_ENTITY, this.world.getTileEntity(pos)));
|
||||
this.world.destroyBlock(pos, false);
|
||||
for (ItemStack stack : drops)
|
||||
Block.spawnAsEntity(this.level, pos, stack);
|
||||
Block.spawnAsEntity(this.world, pos, stack);
|
||||
chunk.drainAura(spot, !tool.isEmpty() ? 300 : 100);
|
||||
this.sendParticles();
|
||||
}
|
||||
|
@ -134,20 +134,20 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
}
|
||||
}
|
||||
|
||||
private ItemStack getToolUsed(BlockEntityFieldCreator other) {
|
||||
private ItemStack getToolUsed(TileEntityFieldCreator other) {
|
||||
ItemStack myTool = this.getMyTool();
|
||||
ItemStack otherTool = other.getMyTool();
|
||||
if (!myTool.isEmpty()) {
|
||||
// if both have tools, choose randomly
|
||||
if (!otherTool.isEmpty())
|
||||
return this.level.rand.nextBoolean() ? myTool : otherTool;
|
||||
return this.world.rand.nextBoolean() ? myTool : otherTool;
|
||||
return myTool;
|
||||
}
|
||||
return otherTool;
|
||||
}
|
||||
|
||||
private ItemStack getMyTool() {
|
||||
List<ItemFrameEntity> frames = Helper.getAttachedItemFrames(this.level, this.worldPosition);
|
||||
List<ItemFrameEntity> frames = Helper.getAttachedItemFrames(this.world, this.pos);
|
||||
for (ItemFrameEntity frame : frames) {
|
||||
ItemStack stack = frame.getDisplayedItem();
|
||||
if (!stack.isEmpty())
|
||||
|
@ -158,32 +158,32 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
|
||||
private void sendParticles() {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
BlockPos p = j == 0 ? this.worldPosition : this.getConnectedPos();
|
||||
PacketHandler.sendToAllAround(this.level, p, 32, new PacketParticleStream(
|
||||
p.getX() + (float) this.level.rand.nextGaussian() * 3F,
|
||||
p.getY() + 1 + this.level.rand.nextFloat() * 3F,
|
||||
p.getZ() + (float) this.level.rand.nextGaussian() * 3F,
|
||||
BlockPos p = j == 0 ? this.pos : this.getConnectedPos();
|
||||
PacketHandler.sendToAllAround(this.world, p, 32, new PacketParticleStream(
|
||||
p.getX() + (float) this.world.rand.nextGaussian() * 3F,
|
||||
p.getY() + 1 + this.world.rand.nextFloat() * 3F,
|
||||
p.getZ() + (float) this.world.rand.nextGaussian() * 3F,
|
||||
p.getX() + 0.5F,
|
||||
p.getY() + 0.5F,
|
||||
p.getZ() + 0.5F,
|
||||
this.level.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.rand.nextFloat() + 0.5F
|
||||
this.world.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forWorld(this.world).getColor(), this.world.rand.nextFloat() + 0.5F
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isCloseEnough(BlockPos pos) {
|
||||
int range = ModConfig.instance.fieldCreatorRange.get() + 1;
|
||||
return this.worldPosition.distanceSq(pos) <= range * range;
|
||||
return this.pos.distanceSq(pos) <= range * range;
|
||||
}
|
||||
|
||||
public BlockPos getConnectedPos() {
|
||||
if (this.connectionOffset == null)
|
||||
return null;
|
||||
return this.worldPosition.add(this.connectionOffset);
|
||||
return this.pos.add(this.connectionOffset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (this.connectionOffset != null)
|
||||
|
@ -197,7 +197,7 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
if (compound.contains("connection"))
|
||||
|
|
|
@ -8,37 +8,37 @@ import net.minecraft.entity.item.ItemEntity;
|
|||
import net.minecraft.entity.projectile.FireworkRocketEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.INBT;
|
||||
import net.minecraft.nbt.ListNBT;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.EntityPredicates;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityFireworkGenerator extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private FireworkRocketEntity trackedEntity;
|
||||
private ItemStack trackedItem;
|
||||
private int toRelease;
|
||||
private int releaseTimer;
|
||||
|
||||
public BlockEntityFireworkGenerator() {
|
||||
public TileEntityFireworkGenerator() {
|
||||
super(ModTileEntities.FIREWORK_GENERATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (this.level.getGameTime() % 10 == 0) {
|
||||
List<ItemEntity> items = this.level.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.worldPosition).grow(4), EntityPredicates.IS_ALIVE);
|
||||
if (!this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 10 == 0) {
|
||||
List<ItemEntity> items = this.world.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.pos).grow(4), EntityPredicates.IS_ALIVE);
|
||||
for (ItemEntity item : items) {
|
||||
if (item.cannotPickup())
|
||||
continue;
|
||||
|
@ -46,10 +46,10 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
|
|||
if (stack.isEmpty() || stack.getItem() != Items.FIREWORK_ROCKET)
|
||||
continue;
|
||||
if (this.trackedEntity == null && this.releaseTimer <= 0) {
|
||||
FireworkRocketEntity entity = new FireworkRocketEntity(this.level, item.getPosX(), item.getPosY(), item.getPosZ(), stack);
|
||||
FireworkRocketEntity entity = new FireworkRocketEntity(this.world, item.getPosX(), item.getPosY(), item.getPosZ(), stack);
|
||||
this.trackedEntity = entity;
|
||||
this.trackedItem = stack.copy();
|
||||
this.level.addEntity(entity);
|
||||
this.world.addEntity(entity);
|
||||
}
|
||||
stack.shrink(1);
|
||||
if (stack.isEmpty())
|
||||
|
@ -64,8 +64,8 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
|
|||
float generateFactor = 0;
|
||||
Set<Integer> usedColors = new HashSet<>();
|
||||
|
||||
CompoundTag compound = this.trackedItem.getTag();
|
||||
CompoundTag fireworks = compound.getCompound("Fireworks");
|
||||
CompoundNBT compound = this.trackedItem.getTag();
|
||||
CompoundNBT fireworks = compound.getCompound("Fireworks");
|
||||
|
||||
int flightTime = fireworks.getInt("Flight");
|
||||
ListNBT explosions = fireworks.getList("Explosions", 10);
|
||||
|
@ -73,7 +73,7 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
|
|||
generateFactor += flightTime;
|
||||
|
||||
for (INBT base : explosions) {
|
||||
CompoundTag explosion = (CompoundTag) base;
|
||||
CompoundNBT explosion = (CompoundNBT) base;
|
||||
generateFactor += 1.5F;
|
||||
|
||||
boolean flicker = explosion.getBoolean("Flicker");
|
||||
|
@ -97,18 +97,18 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
|
|||
}
|
||||
|
||||
if (generateFactor > 0) {
|
||||
int toAdd = Mth.ceil(generateFactor * 10000F);
|
||||
int toAdd = MathHelper.ceil(generateFactor * 10000F);
|
||||
if (this.canGenerateRightNow(toAdd)) {
|
||||
this.toRelease = toAdd;
|
||||
this.releaseTimer = 15 * flightTime + 40;
|
||||
}
|
||||
|
||||
List<Integer> data = new ArrayList<>();
|
||||
data.add(this.worldPosition.getX());
|
||||
data.add(this.worldPosition.getY());
|
||||
data.add(this.worldPosition.getZ());
|
||||
data.add(this.pos.getX());
|
||||
data.add(this.pos.getY());
|
||||
data.add(this.pos.getZ());
|
||||
data.addAll(usedColors);
|
||||
PacketHandler.sendToAllLoaded(this.level, this.worldPosition, new PacketParticles(
|
||||
PacketHandler.sendToAllLoaded(this.world, this.pos, new PacketParticles(
|
||||
(float) this.trackedEntity.getPosX(), (float) this.trackedEntity.getPosY(), (float) this.trackedEntity.getPosZ(),
|
||||
PacketParticles.Type.FIREWORK_GEN, Ints.toArray(data)));
|
||||
}
|
||||
|
@ -124,8 +124,8 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
|
|||
this.generateAura(this.toRelease);
|
||||
this.toRelease = 0;
|
||||
|
||||
PacketHandler.sendToAllLoaded(this.level, this.worldPosition,
|
||||
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.FLOWER_GEN_AURA_CREATION));
|
||||
PacketHandler.sendToAllLoaded(this.world, this.pos,
|
||||
new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.FLOWER_GEN_AURA_CREATION));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,11 +9,11 @@ import de.ellpeck.naturesaura.packet.PacketParticleStream;
|
|||
import de.ellpeck.naturesaura.packet.PacketParticles;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.INBT;
|
||||
import net.minecraft.nbt.ListNBT;
|
||||
import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
@ -24,24 +24,24 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityFlowerGenerator extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private final Map<BlockState, MutableInt> consumedRecently = new HashMap<>();
|
||||
|
||||
public BlockEntityFlowerGenerator() {
|
||||
public TileEntityFlowerGenerator() {
|
||||
super(ModTileEntities.FLOWER_GENERATOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide && this.level.getGameTime() % 10 == 0) {
|
||||
if (!this.world.isRemote && this.world.getGameTime() % 10 == 0) {
|
||||
List<BlockPos> possible = new ArrayList<>();
|
||||
int range = 3;
|
||||
for (int x = -range; x <= range; x++) {
|
||||
for (int y = -1; y <= 1; y++) {
|
||||
for (int z = -range; z <= range; z++) {
|
||||
BlockPos offset = this.worldPosition.add(x, y, z);
|
||||
BlockState state = this.level.getBlockState(offset);
|
||||
BlockPos offset = this.pos.add(x, y, z);
|
||||
BlockState state = this.world.getBlockState(offset);
|
||||
if (BlockTags.SMALL_FLOWERS.contains(state.getBlock()))
|
||||
possible.add(offset);
|
||||
}
|
||||
|
@ -51,14 +51,14 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
|
|||
if (possible.isEmpty())
|
||||
return;
|
||||
|
||||
BlockPos pos = possible.get(this.level.rand.nextInt(possible.size()));
|
||||
BlockState state = this.level.getBlockState(pos);
|
||||
BlockPos pos = possible.get(this.world.rand.nextInt(possible.size()));
|
||||
BlockState state = this.world.getBlockState(pos);
|
||||
MutableInt curr = this.consumedRecently.computeIfAbsent(state, s -> new MutableInt());
|
||||
|
||||
int addAmount = 25000;
|
||||
int toAdd = Math.max(0, addAmount - curr.getValue() * 100);
|
||||
if (toAdd > 0) {
|
||||
if (IAuraType.forLevel(this.level).isSimilar(NaturesAuraAPI.TYPE_OVERWORLD) && this.canGenerateRightNow(toAdd)) {
|
||||
if (IAuraType.forWorld(this.world).isSimilar(NaturesAuraAPI.TYPE_OVERWORLD) && this.canGenerateRightNow(toAdd)) {
|
||||
this.generateAura(toAdd);
|
||||
} else {
|
||||
toAdd = 0;
|
||||
|
@ -74,23 +74,23 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
|
|||
}
|
||||
curr.add(5);
|
||||
|
||||
this.level.removeBlock(pos, false);
|
||||
this.world.removeBlock(pos, false);
|
||||
|
||||
int color = Helper.blendColors(0x5ccc30, 0xe53c16, toAdd / (float) addAmount);
|
||||
if (toAdd > 0) {
|
||||
for (int i = this.level.rand.nextInt(5) + 5; i >= 0; i--)
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream(
|
||||
pos.getX() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
pos.getY() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
pos.getZ() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.worldPosition.getX() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.worldPosition.getY() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.worldPosition.getZ() + 0.25F + this.level.rand.nextFloat() * 0.5F,
|
||||
this.level.rand.nextFloat() * 0.02F + 0.1F, color, 1F
|
||||
for (int i = this.world.rand.nextInt(5) + 5; i >= 0; i--)
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream(
|
||||
pos.getX() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
pos.getY() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
pos.getZ() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.pos.getX() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.pos.getY() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.pos.getZ() + 0.25F + this.world.rand.nextFloat() * 0.5F,
|
||||
this.world.rand.nextFloat() * 0.02F + 0.1F, color, 1F
|
||||
));
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.FLOWER_GEN_AURA_CREATION));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), PacketParticles.Type.FLOWER_GEN_AURA_CREATION));
|
||||
}
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), PacketParticles.Type.FLOWER_GEN_CONSUME, color));
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), PacketParticles.Type.FLOWER_GEN_CONSUME, color));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
|
||||
if (type != SaveType.SYNC && !this.consumedRecently.isEmpty()) {
|
||||
|
@ -109,7 +109,7 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
|
|||
BlockState state = entry.getKey();
|
||||
Block block = state.getBlock();
|
||||
|
||||
CompoundTag tag = new CompoundTag();
|
||||
CompoundNBT tag = new CompoundNBT();
|
||||
tag.putString("block", block.getRegistryName().toString());
|
||||
tag.putInt("amount", entry.getValue().intValue());
|
||||
list.add(tag);
|
||||
|
@ -119,13 +119,13 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.SYNC) {
|
||||
this.consumedRecently.clear();
|
||||
ListNBT list = compound.getList("consumed_recently", 10);
|
||||
for (INBT base : list) {
|
||||
CompoundTag tag = (CompoundTag) base;
|
||||
CompoundNBT tag = (CompoundNBT) base;
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString("block")));
|
||||
if (block != null)
|
||||
this.consumedRecently.put(block.getDefaultState(), new MutableInt(tag.getInt("amount")));
|
||||
|
|
|
@ -11,26 +11,26 @@ import net.minecraft.block.AbstractFurnaceBlock;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.AbstractCookingRecipe;
|
||||
import net.minecraft.item.crafting.IRecipeType;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.*;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.IIntArray;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Mth;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private static final Field FURNACE_DATA_FIELD = ObfuscationReflectionHelper.findField(AbstractFurnaceBlockEntity.class, "field_214013_b");
|
||||
private static final Field FURNACE_DATA_FIELD = ObfuscationReflectionHelper.findField(AbstractFurnaceTileEntity.class, "field_214013_b");
|
||||
public boolean isActive;
|
||||
|
||||
public BlockEntityFurnaceHeater() {
|
||||
public TileEntityFurnaceHeater() {
|
||||
super(ModTileEntities.FURNACE_HEATER);
|
||||
}
|
||||
|
||||
public static IIntArray getFurnaceData(AbstractFurnaceBlockEntity tile) {
|
||||
public static IIntArray getFurnaceData(AbstractFurnaceTileEntity tile) {
|
||||
try {
|
||||
return (IIntArray) FURNACE_DATA_FIELD.get(tile);
|
||||
} catch (IllegalAccessException e) {
|
||||
|
@ -39,10 +39,10 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
}
|
||||
|
||||
public static IRecipeType<? extends AbstractCookingRecipe> getRecipeType(AbstractFurnaceBlockEntity furnace) {
|
||||
if (furnace instanceof BlastFurnaceBlockEntity) {
|
||||
public static IRecipeType<? extends AbstractCookingRecipe> getRecipeType(AbstractFurnaceTileEntity furnace) {
|
||||
if (furnace instanceof BlastFurnaceTileEntity) {
|
||||
return IRecipeType.BLASTING;
|
||||
} else if (furnace instanceof SmokerBlockEntity) {
|
||||
} else if (furnace instanceof SmokerTileEntity) {
|
||||
return IRecipeType.SMOKING;
|
||||
} else {
|
||||
return IRecipeType.SMELTING;
|
||||
|
@ -51,38 +51,38 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
|
|||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide && this.level.getGameTime() % 5 == 0) {
|
||||
if (!this.world.isRemote && this.world.getGameTime() % 5 == 0) {
|
||||
boolean did = false;
|
||||
|
||||
Direction facing = this.level.getBlockState(this.worldPosition).get(BlockFurnaceHeater.FACING);
|
||||
BlockPos tilePos = this.worldPosition.offset(facing.getOpposite());
|
||||
BlockEntity tile = this.level.getBlockEntity(tilePos);
|
||||
if (tile instanceof AbstractFurnaceBlockEntity) {
|
||||
AbstractFurnaceBlockEntity furnace = (AbstractFurnaceBlockEntity) tile;
|
||||
Direction facing = this.world.getBlockState(this.pos).get(BlockFurnaceHeater.FACING);
|
||||
BlockPos tilePos = this.pos.offset(facing.getOpposite());
|
||||
TileEntity tile = this.world.getTileEntity(tilePos);
|
||||
if (tile instanceof AbstractFurnaceTileEntity) {
|
||||
AbstractFurnaceTileEntity furnace = (AbstractFurnaceTileEntity) tile;
|
||||
if (this.isReady(furnace)) {
|
||||
IIntArray data = getFurnaceData(furnace);
|
||||
int burnTime = data.get(0);
|
||||
if (burnTime <= 0)
|
||||
this.level.setBlockState(tilePos, this.level.getBlockState(tilePos).with(AbstractFurnaceBlock.LIT, true));
|
||||
this.world.setBlockState(tilePos, this.world.getBlockState(tilePos).with(AbstractFurnaceBlock.LIT, true));
|
||||
|
||||
data.set(0, 200);
|
||||
//if set higher than 199, it'll never finish because the furnace does ++ and then ==
|
||||
data.set(2, Math.min(data.get(3) - 1, data.get(2) + 5));
|
||||
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 20, this.worldPosition);
|
||||
IAuraChunk chunk = IAuraChunk.getAuraChunk(this.level, spot);
|
||||
chunk.drainAura(spot, Mth.ceil((200 - burnTime) * 16.6F));
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 20, this.pos);
|
||||
IAuraChunk chunk = IAuraChunk.getAuraChunk(this.world, spot);
|
||||
chunk.drainAura(spot, MathHelper.ceil((200 - burnTime) * 16.6F));
|
||||
did = true;
|
||||
|
||||
if (this.level.getGameTime() % 15 == 0) {
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream(
|
||||
this.worldPosition.getX() + (float) this.level.rand.nextGaussian() * 5F,
|
||||
this.worldPosition.getY() + 1 + this.level.rand.nextFloat() * 5F,
|
||||
this.worldPosition.getZ() + (float) this.level.rand.nextGaussian() * 5F,
|
||||
tilePos.getX() + this.level.rand.nextFloat(),
|
||||
tilePos.getY() + this.level.rand.nextFloat(),
|
||||
tilePos.getZ() + this.level.rand.nextFloat(),
|
||||
this.level.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.rand.nextFloat() + 0.5F
|
||||
if (this.world.getGameTime() % 15 == 0) {
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream(
|
||||
this.pos.getX() + (float) this.world.rand.nextGaussian() * 5F,
|
||||
this.pos.getY() + 1 + this.world.rand.nextFloat() * 5F,
|
||||
this.pos.getZ() + (float) this.world.rand.nextGaussian() * 5F,
|
||||
tilePos.getX() + this.world.rand.nextFloat(),
|
||||
tilePos.getY() + this.world.rand.nextFloat(),
|
||||
tilePos.getZ() + this.world.rand.nextFloat(),
|
||||
this.world.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forWorld(this.world).getColor(), this.world.rand.nextFloat() + 0.5F
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -95,13 +95,13 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isReady(AbstractFurnaceBlockEntity furnace) {
|
||||
private boolean isReady(AbstractFurnaceTileEntity furnace) {
|
||||
if (!furnace.getStackInSlot(1).isEmpty())
|
||||
return false;
|
||||
|
||||
ItemStack input = furnace.getStackInSlot(0);
|
||||
if (!input.isEmpty()) {
|
||||
AbstractCookingRecipe recipe = this.level.getRecipeManager().getRecipe(getRecipeType(furnace), furnace, this.level).orElse(null);
|
||||
AbstractCookingRecipe recipe = this.world.getRecipeManager().getRecipe(getRecipeType(furnace), furnace, this.world).orElse(null);
|
||||
if (recipe == null)
|
||||
return false;
|
||||
ItemStack output = recipe.getRecipeOutput();
|
||||
|
@ -112,7 +112,7 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
|
||||
if (type == SaveType.SYNC)
|
||||
|
@ -120,7 +120,7 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
|
||||
if (type == SaveType.SYNC)
|
||||
|
|
|
@ -4,15 +4,15 @@ import net.minecraft.util.math.AxisAlignedBB;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class BlockEntityGeneratorLimitRemover extends BlockEntityImpl {
|
||||
public class TileEntityGeneratorLimitRemover extends TileEntityImpl {
|
||||
|
||||
public BlockEntityGeneratorLimitRemover() {
|
||||
public TileEntityGeneratorLimitRemover() {
|
||||
super(ModTileEntities.GENERATOR_LIMIT_REMOVER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
return new AxisAlignedBB(this.worldPosition, this.worldPosition.add(1, 2, 1));
|
||||
return new AxisAlignedBB(this.pos, this.pos.add(1, 2, 1));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,9 +6,9 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.item.ItemFrameEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
|
@ -17,29 +17,29 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityGratedChute extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public class TileEntityGratedChute extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
public boolean isBlacklist;
|
||||
private final ItemStackHandlerNA items = new ItemStackHandlerNA(1, this, true) {
|
||||
@Override
|
||||
protected boolean canExtract(ItemStack stack, int slot, int amount) {
|
||||
return BlockEntityGratedChute.this.redstonePower <= 0;
|
||||
return TileEntityGratedChute.this.redstonePower <= 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canInsert(ItemStack stack, int slot) {
|
||||
return BlockEntityGratedChute.this.isBlacklist != BlockEntityGratedChute.this.isItemInFrame(stack);
|
||||
return TileEntityGratedChute.this.isBlacklist != TileEntityGratedChute.this.isItemInFrame(stack);
|
||||
}
|
||||
};
|
||||
private int cooldown;
|
||||
|
||||
public BlockEntityGratedChute() {
|
||||
public TileEntityGratedChute() {
|
||||
super(ModTileEntities.GRATED_CHUTE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide) {
|
||||
if (!this.world.isRemote) {
|
||||
if (this.cooldown <= 0) {
|
||||
this.cooldown = 6;
|
||||
if (this.redstonePower > 0)
|
||||
|
@ -48,9 +48,9 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
ItemStack curr = this.items.getStackInSlot(0);
|
||||
push:
|
||||
if (!curr.isEmpty()) {
|
||||
BlockState state = this.level.getBlockState(this.worldPosition);
|
||||
BlockState state = this.world.getBlockState(this.pos);
|
||||
Direction facing = state.get(BlockGratedChute.FACING);
|
||||
BlockEntity tile = this.level.getBlockEntity(this.worldPosition.offset(facing));
|
||||
TileEntity tile = this.world.getTileEntity(this.pos.offset(facing));
|
||||
if (tile == null)
|
||||
break push;
|
||||
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY,
|
||||
|
@ -70,9 +70,9 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
pull:
|
||||
if (curr.isEmpty() || curr.getCount() < curr.getMaxStackSize()) {
|
||||
List<ItemEntity> items = this.level.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(
|
||||
this.worldPosition.getX(), this.worldPosition.getY() + 0.5, this.worldPosition.getZ(),
|
||||
this.worldPosition.getX() + 1, this.worldPosition.getY() + 2, this.worldPosition.getZ() + 1));
|
||||
List<ItemEntity> items = this.world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(
|
||||
this.pos.getX(), this.pos.getY() + 0.5, this.pos.getZ(),
|
||||
this.pos.getX() + 1, this.pos.getY() + 2, this.pos.getZ() + 1));
|
||||
for (ItemEntity item : items) {
|
||||
if (!item.isAlive())
|
||||
continue;
|
||||
|
@ -89,7 +89,7 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
}
|
||||
|
||||
BlockEntity tileUp = this.level.getBlockEntity(this.worldPosition.up());
|
||||
TileEntity tileUp = this.world.getTileEntity(this.pos.up());
|
||||
if (tileUp == null)
|
||||
break pull;
|
||||
IItemHandler handlerUp = tileUp.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN).orElse(null);
|
||||
|
@ -112,7 +112,7 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
|
||||
private boolean isItemInFrame(ItemStack stack) {
|
||||
List<ItemFrameEntity> frames = Helper.getAttachedItemFrames(this.level, this.worldPosition);
|
||||
List<ItemFrameEntity> frames = Helper.getAttachedItemFrames(this.world, this.pos);
|
||||
if (frames.isEmpty())
|
||||
return false;
|
||||
for (ItemFrameEntity frame : frames) {
|
||||
|
@ -125,7 +125,7 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
compound.putInt("cooldown", this.cooldown);
|
||||
|
@ -135,7 +135,7 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
|
|||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
super.readNBT(compound, type);
|
||||
if (type != SaveType.BLOCK) {
|
||||
this.cooldown = compound.getInt("cooldown");
|
||||
|
|
|
@ -6,9 +6,9 @@ import de.ellpeck.naturesaura.packet.PacketParticles;
|
|||
import net.minecraft.block.HopperBlock;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.HopperBlockEntity;
|
||||
import net.minecraft.tileentity.ITickableBlockEntity;
|
||||
import net.minecraft.tileentity.BlockEntity;
|
||||
import net.minecraft.tileentity.HopperTileEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -17,33 +17,33 @@ import net.minecraftforge.items.IItemHandler;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockEntityHopperUpgrade extends BlockEntityImpl implements ITickableBlockEntity {
|
||||
public BlockEntityHopperUpgrade() {
|
||||
public class TileEntityHopperUpgrade extends TileEntityImpl implements ITickableTileEntity {
|
||||
public TileEntityHopperUpgrade() {
|
||||
super(ModTileEntities.HOPPER_UPGRADE);
|
||||
}
|
||||
|
||||
private static boolean isValidHopper(BlockEntity tile) {
|
||||
if (tile instanceof HopperBlockEntity)
|
||||
return tile.getLevel().getBlockState(tile.getPos()).get(HopperBlock.ENABLED);
|
||||
if (tile instanceof BlockEntityGratedChute)
|
||||
return ((BlockEntityGratedChute) tile).redstonePower <= 0;
|
||||
private static boolean isValidHopper(TileEntity tile) {
|
||||
if (tile instanceof HopperTileEntity)
|
||||
return tile.getWorld().getBlockState(tile.getPos()).get(HopperBlock.ENABLED);
|
||||
if (tile instanceof TileEntityGratedChute)
|
||||
return ((TileEntityGratedChute) tile).redstonePower <= 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (!this.level.isClientSide && this.level.getGameTime() % 10 == 0) {
|
||||
if (IAuraChunk.getAuraInArea(this.level, this.worldPosition, 25) < 100000)
|
||||
if (!this.world.isRemote && this.world.getGameTime() % 10 == 0) {
|
||||
if (IAuraChunk.getAuraInArea(this.world, this.pos, 25) < 100000)
|
||||
return;
|
||||
BlockEntity tile = this.level.getBlockEntity(this.worldPosition.down());
|
||||
TileEntity tile = this.world.getTileEntity(this.pos.down());
|
||||
if (!isValidHopper(tile))
|
||||
return;
|
||||
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP).orElse(null);
|
||||
if (handler == null)
|
||||
return;
|
||||
|
||||
List<ItemEntity> items = this.level.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.worldPosition).grow(7));
|
||||
List<ItemEntity> items = this.world.getEntitiesWithinAABB(ItemEntity.class,
|
||||
new AxisAlignedBB(this.pos).grow(7));
|
||||
if (items.isEmpty())
|
||||
return;
|
||||
|
||||
|
@ -67,10 +67,10 @@ public class BlockEntityHopperUpgrade extends BlockEntityImpl implements ITickab
|
|||
if (copy.isEmpty())
|
||||
item.remove();
|
||||
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.level, this.worldPosition, 25, this.worldPosition);
|
||||
IAuraChunk.getAuraChunk(this.level, spot).drainAura(spot, 500);
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 25, this.pos);
|
||||
IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, 500);
|
||||
|
||||
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
|
||||
PacketHandler.sendToAllAround(this.world, this.pos, 32,
|
||||
new PacketParticles((float) item.getPosX(), (float) item.getPosY(), (float) item.getPosZ(), PacketParticles.Type.HOPPER_UPGRADE));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,18 +4,19 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
|||
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
||||
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
|
||||
import de.ellpeck.naturesaura.blocks.ModBlocks;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.Connection;
|
||||
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.world.entity.item.ItemEntity;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.ChunkPos;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.server.SUpdateTileEntityPacket;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
|
@ -23,37 +24,40 @@ import net.minecraftforge.items.IItemHandler;
|
|||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class BlockEntityImpl extends BlockEntity {
|
||||
public class TileEntityImpl extends TileEntity {
|
||||
|
||||
public int redstonePower;
|
||||
private LazyOptional<IItemHandler> itemHandler;
|
||||
private LazyOptional<IAuraContainer> auraContainer;
|
||||
|
||||
public BlockEntityImpl(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||
super(type, pos, state);
|
||||
public TileEntityImpl(TileEntityType<?> tileEntityTypeIn) {
|
||||
super(tileEntityTypeIn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveAdditional(CompoundTag compound) {
|
||||
public CompoundNBT write(CompoundNBT compound) {
|
||||
this.writeNBT(compound, SaveType.TILE);
|
||||
return compound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(CompoundTag compound) {
|
||||
public void read(BlockState state, CompoundNBT compound) {
|
||||
this.readNBT(compound, SaveType.TILE);
|
||||
}
|
||||
|
||||
public void writeNBT(CompoundTag compound, SaveType type) {
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
if (type != SaveType.BLOCK) {
|
||||
super.saveAdditional(compound);
|
||||
super.write(compound);
|
||||
compound.putInt("redstone", this.redstonePower);
|
||||
}
|
||||
}
|
||||
|
||||
public void readNBT(CompoundTag compound, SaveType type) {
|
||||
public void readNBT(CompoundNBT compound, SaveType type) {
|
||||
if (type != SaveType.BLOCK) {
|
||||
super.load(compound);
|
||||
// looks like the block state isn't used in the super
|
||||
super.read(null, compound);
|
||||
this.redstonePower = compound.getInt("redstone");
|
||||
}
|
||||
}
|
||||
|
@ -63,38 +67,36 @@ public class BlockEntityImpl extends BlockEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public final ClientboundBlockEntityDataPacket getUpdatePacket() {
|
||||
return ClientboundBlockEntityDataPacket.create(this, e -> {
|
||||
CompoundTag compound = new CompoundTag();
|
||||
public final SUpdateTileEntityPacket getUpdatePacket() {
|
||||
CompoundNBT compound = new CompoundNBT();
|
||||
this.writeNBT(compound, SaveType.SYNC);
|
||||
return compound;
|
||||
});
|
||||
return new SUpdateTileEntityPacket(this.pos, 0, compound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final CompoundTag getUpdateTag() {
|
||||
CompoundTag compound = new CompoundTag();
|
||||
public final CompoundNBT getUpdateTag() {
|
||||
CompoundNBT compound = new CompoundNBT();
|
||||
this.writeNBT(compound, SaveType.SYNC);
|
||||
return compound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleUpdateTag(CompoundTag tag) {
|
||||
public void handleUpdateTag(BlockState state, CompoundNBT tag) {
|
||||
this.readNBT(tag, SaveType.SYNC);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) {
|
||||
super.onDataPacket(net, pkt);
|
||||
this.readNBT(pkt.getTag(), SaveType.SYNC);
|
||||
public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket packet) {
|
||||
super.onDataPacket(net, packet);
|
||||
this.readNBT(packet.getNbtCompound(), SaveType.SYNC);
|
||||
}
|
||||
|
||||
public void sendToClients() {
|
||||
var world = (ServerLevel) this.getLevel();
|
||||
var entities = world.getChunkSource().chunkMap.getPlayers(new ChunkPos(this.getBlockPos()), false);
|
||||
ClientboundBlockEntityDataPacket packet = this.getUpdatePacket();
|
||||
for (var e : entities)
|
||||
e.connection.send(packet);
|
||||
ServerWorld world = (ServerWorld) this.getWorld();
|
||||
Stream<ServerPlayerEntity> entities = world.getChunkProvider().chunkManager.getTrackingPlayers(new ChunkPos(this.getPos()), false);
|
||||
SUpdateTileEntityPacket packet = this.getUpdatePacket();
|
||||
entities.forEach(e -> e.connection.sendPacket(packet));
|
||||
}
|
||||
|
||||
public IItemHandlerModifiable getItemHandler() {
|
||||
|
@ -126,8 +128,8 @@ public class BlockEntityImpl extends BlockEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setRemoved() {
|
||||
super.setRemoved();
|
||||
public void remove() {
|
||||
super.remove();
|
||||
if (this.itemHandler != null)
|
||||
this.itemHandler.invalidate();
|
||||
if (this.auraContainer != null)
|
||||
|
@ -140,36 +142,40 @@ public class BlockEntityImpl extends BlockEntity {
|
|||
for (int i = 0; i < handler.getSlots(); i++) {
|
||||
ItemStack stack = handler.getStackInSlot(i);
|
||||
if (!stack.isEmpty()) {
|
||||
ItemEntity item = new ItemEntity(this.level, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5, stack);
|
||||
this.level.addFreshEntity(item);
|
||||
ItemEntity item = new ItemEntity(this.world,
|
||||
this.pos.getX() + 0.5, this.pos.getY() + 0.5, this.pos.getZ() + 0.5,
|
||||
stack);
|
||||
this.world.addEntity(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void modifyDrop(ItemStack regularItem) {
|
||||
CompoundTag compound = new CompoundTag();
|
||||
CompoundNBT compound = new CompoundNBT();
|
||||
this.writeNBT(compound, SaveType.BLOCK);
|
||||
if (!compound.isEmpty()) {
|
||||
if (!regularItem.hasTag()) regularItem.setTag(new CompoundTag());
|
||||
if (!regularItem.hasTag())
|
||||
regularItem.setTag(new CompoundNBT());
|
||||
regularItem.getTag().put("data", compound);
|
||||
}
|
||||
}
|
||||
|
||||
public void loadDataOnPlace(ItemStack stack) {
|
||||
if (stack.hasTag()) {
|
||||
CompoundTag compound = stack.getTag().getCompound("data");
|
||||
if (compound != null) this.readNBT(compound, SaveType.BLOCK);
|
||||
CompoundNBT compound = stack.getTag().getCompound("data");
|
||||
if (compound != null)
|
||||
this.readNBT(compound, SaveType.BLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canGenerateRightNow(int toAdd) {
|
||||
if (this.wantsLimitRemover()) {
|
||||
BlockState below = this.level.getBlockState(this.worldPosition.below());
|
||||
BlockState below = this.world.getBlockState(this.pos.down());
|
||||
if (below.getBlock() == ModBlocks.GENERATOR_LIMIT_REMOVER)
|
||||
return true;
|
||||
}
|
||||
int aura = IAuraChunk.getAuraInArea(this.level, this.worldPosition, 35);
|
||||
int aura = IAuraChunk.getAuraInArea(this.world, this.pos, 35);
|
||||
return aura + toAdd <= IAuraChunk.DEFAULT_AURA * 2;
|
||||
}
|
||||
|
||||
|
@ -179,12 +185,14 @@ public class BlockEntityImpl extends BlockEntity {
|
|||
|
||||
public void generateAura(int amount) {
|
||||
while (amount > 0) {
|
||||
BlockPos spot = IAuraChunk.getLowestSpot(this.level, this.worldPosition, 35, this.worldPosition);
|
||||
amount -= IAuraChunk.getAuraChunk(this.level, spot).storeAura(spot, amount);
|
||||
BlockPos spot = IAuraChunk.getLowestSpot(this.world, this.pos, 35, this.pos);
|
||||
amount -= IAuraChunk.getAuraChunk(this.world, spot).storeAura(spot, amount);
|
||||
}
|
||||
}
|
||||
|
||||
public enum SaveType {
|
||||
TILE, SYNC, BLOCK
|
||||
TILE,
|
||||
SYNC,
|
||||
BLOCK
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue