2 Commits
1.19.3 ... 1.16

110 changed files with 2415 additions and 2297 deletions

5
.gitattributes vendored
View File

@@ -1,5 +0,0 @@
# Disable autocrlf on generated files, they always generate with LF
# Add any extra files or paths here to make git stop saying they
# are changed when only line endings change.
src/generated/**/.cache/cache text eol=lf
src/generated/**/*.json text eol=lf

View File

@@ -1,24 +1,31 @@
plugins { buildscript {
id 'eclipse' repositories {
id 'maven-publish' maven { url = 'https://files.minecraftforge.net/maven' }
id 'net.minecraftforge.gradle' version '5.1.+' jcenter()
mavenCentral()
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1+', changing: true
}
} }
apply plugin: 'net.minecraftforge.gradle'
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
version = '1.19.3-2.40' version = '1.16.3-2.32'
group = 'nl.requios.effortlessbuilding' group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'effortlessbuilding' archivesBaseName = 'effortlessbuilding'
// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}"
minecraft { minecraft {
// The mappings can be changed at any time, and must be in the following format. // The mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD Snapshot are built nightly. // snapshot_YYYYMMDD Snapshot are built nightly.
// stable_# Stables are built at the discretion of the MCP team. // stable_# Stables are built at the discretion of the MCP team.
// Use non-default mappings at your own risk. they may not always work. // Use non-default mappings at your own risk. they may not always work.
// Simply re-run your setup task after changing the mappings to update your workspace. // Simply re-run your setup task after changing the mappings to update your workspace.
mappings channel: 'official', version: '1.19.3' mappings channel: 'official', version: '1.16.5'
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
@@ -34,9 +41,6 @@ minecraft {
// Recommended logging level for the console // Recommended logging level for the console
property 'forge.logging.console.level', 'debug' property 'forge.logging.console.level', 'debug'
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
property 'forge.enabledGameTestNamespaces', 'effortlessbuilding'
mods { mods {
effortlessbuilding { effortlessbuilding {
source sourceSets.main source sourceSets.main
@@ -47,31 +51,12 @@ minecraft {
server { server {
workingDirectory project.file('run') workingDirectory project.file('run')
// Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP)
property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.markers', 'REGISTRIES'
// Recommended logging level for the console
property 'forge.logging.console.level', 'debug' property 'forge.logging.console.level', 'debug'
property 'forge.enabledGameTestNamespaces', 'effortlessbuilding'
mods {
effortlessbuilding {
source sourceSets.main
}
}
}
// This run config launches GameTestServer and runs all registered gametests, then exits.
// By default, the server will crash when no gametests are provided.
// The gametest system is also enabled by default for other run configs under the /test command.
gameTestServer {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
property 'forge.enabledGameTestNamespaces', 'effortlessbuilding'
mods { mods {
effortlessbuilding { effortlessbuilding {
source sourceSets.main source sourceSets.main
@@ -82,8 +67,10 @@ minecraft {
data { data {
workingDirectory project.file('run') workingDirectory project.file('run')
// Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP)
property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.markers', 'REGISTRIES'
// Recommended logging level for the console
property 'forge.logging.console.level', 'debug' property 'forge.logging.console.level', 'debug'
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
@@ -98,36 +85,30 @@ minecraft {
} }
} }
// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }
repositories {
// Put repositories for dependencies here
// ForgeGradle automatically adds the Forge maven and Maven Central for you
// If you have mod jar dependencies in ./libs, you can declare them as a repository like so:
// flatDir {
// dir 'libs'
// }
}
dependencies { dependencies {
// Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
// that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
// The userdev artifact is a special name and will get all sorts of transformations applied to it. // The userdev artifact is a special name and will get all sorts of transformations applied to it.
minecraft 'net.minecraftforge:forge:1.19.3-44.1.0' minecraft 'net.minecraftforge:forge:1.16.3-34.0.9'
// Real mod deobf dependency examples - these get remapped to your current mappings // You may put jars on which you depend on in ./libs or you may define them like so..
// compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency // compile "some.group:artifact:version:classifier"
// runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency // compile "some.group:artifact:version"
// implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency
// Examples using mod jars from ./libs // Real examples
// implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
// compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
// The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
// provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// These dependencies get remapped to your current MCP mappings
// deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// For more info... // For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html // http://www.gradle.org/docs/current/userguide/dependency_management.html
} }
// Example for how to get properties into the manifest for reading by the runtime.. // Example for how to get properties into the manifest for reading by the runtime..
@@ -138,18 +119,18 @@ jar {
"Specification-Vendor": "requios", "Specification-Vendor": "requios",
"Specification-Version": "1", // We are version 1 of ourselves "Specification-Version": "1", // We are version 1 of ourselves
"Implementation-Title": project.name, "Implementation-Title": project.name,
"Implementation-Version": project.jar.archiveVersion, "Implementation-Version": "${version}",
"Implementation-Vendor" :"requios", "Implementation-Vendor" :"requios",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
]) ])
} }
} }
// Example configuration to allow publishing using the maven-publish plugin // Example configuration to allow publishing using the maven-publish task
// This is the preferred method to reobfuscate your jar file // This is the preferred method to reobfuscate your jar file
jar.finalizedBy('reobfJar') jar.finalizedBy('reobfJar')
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing // However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing
// publish.dependsOn('reobfJar') //publish.dependsOn('reobfJar')
publishing { publishing {
publications { publications {
@@ -159,11 +140,7 @@ publishing {
} }
repositories { repositories {
maven { maven {
url "file://${project.projectDir}/mcmodsrepo" url "file:///${project.projectDir}/mcmodsrepo"
} }
} }
} }
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

257
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/usr/bin/env bash
# #
# Copyright <20> 2015-2021 the original authors. # Copyright 2015 the original author or authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@@ -17,101 +17,67 @@
# #
############################################################################## ##############################################################################
# ##
# Gradle start up script for POSIX generated by Gradle. ## Gradle start up script for UN*X
# ##
# 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 <20>$var<61>, <20>${var}<7D>, <20>${var:-default}<7D>, <20>${var+SET}<7D>,
# <20>${var#prefix}<7D>, <20>${var%suffix}<7D>, and <20>$( cmd )<29>;
# * compound commands having a testable exit status, especially <20>case<73>;
# * various built-in commands including <20>command<6E>, <20>set<65>, and <20>ulimit<69>.
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
############################################################################## ##############################################################################
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
app_path=$0 PRG="$0"
# Need this for relative symlinks.
# Need this for daisy-chained symlinks. while [ -h "$PRG" ] ; do
while ls=`ls -ld "$PRG"`
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path link=`expr "$ls" : '.*-> \(.*\)$'`
[ -h "$app_path" ] if expr "$link" : '/.*' > /dev/null; then
do PRG="$link"
ls=$( ls -ld "$app_path" ) else
link=${ls#*' -> '} PRG=`dirname "$PRG"`"/$link"
case $link in #( fi
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" 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. # 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='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD="maximum"
warn () { warn () {
echo "$*" echo "$*"
} >&2 }
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} >&2 }
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "$( uname )" in #( case "`uname`" in
CYGWIN* ) cygwin=true ;; #( CYGWIN* )
Darwin* ) darwin=true ;; #( cygwin=true
MSYS* | MINGW* ) msys=true ;; #( ;;
NONSTOP* ) nonstop=true ;; Darwin* )
darwin=true
;;
MSYS* | MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -121,9 +87,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java JAVACMD="$JAVA_HOME/jre/sh/java"
else else
JAVACMD=$JAVA_HOME/bin/java JAVACMD="$JAVA_HOME/bin/java"
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -132,7 +98,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else 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. 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 Please set the JAVA_HOME variable in your environment to match the
@@ -140,95 +106,78 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
case $MAX_FD in #( MAX_FD_LIMIT=`ulimit -H -n`
max*) if [ $? -eq 0 ] ; then
MAX_FD=$( ulimit -H -n ) || if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
warn "Could not query maximum file descriptor limit" MAX_FD="$MAX_FD_LIMIT"
esac fi
case $MAX_FD in #( ulimit -n $MAX_FD
'' | soft) :;; #( if [ $? -ne 0 ] ; then
*) warn "Could not set maximum file descriptor limit: $MAX_FD"
ulimit -n "$MAX_FD" || fi
warn "Could not set maximum file descriptor limit to $MAX_FD" else
esac warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi fi
# Collect all arguments for the java command, stacking in reverse order: # For Darwin, add options to specify how the application appears in the dock
# * args from the command line if $darwin; then
# * the main class name GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
# * -classpath fi
# * -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 # For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=$( cygpath --unix "$JAVACMD" ) JAVACMD=`cygpath --unix "$JAVACMD"`
# Now convert the arguments - kludge to limit ourselves to /bin/sh # We build the pattern for arguments to be converted via cygpath
for arg do ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
if SEP=""
case $arg in #( for dir in $ROOTDIRSRAW ; do
-*) false ;; # don't mess with options #( ROOTDIRS="$ROOTDIRS$SEP$dir"
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath SEP="|"
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi fi
# Collect all arguments for the java command; ARGV=("$@")
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of eval set -- $DEFAULT_JVM_OPTS
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \ IFS=$'
"-Dorg.gradle.appname=$APP_BASE_NAME" \ ' read -rd '' -a JAVA_OPTS_ARR <<< "$(echo $JAVA_OPTS | xargs -n1)"
-classpath "$CLASSPATH" \ IFS=$'
org.gradle.wrapper.GradleWrapperMain \ ' read -rd '' -a GRADLE_OPTS_ARR <<< "$(echo $GRADLE_OPTS | xargs -n1)"
"$@"
# Use "xargs" to parse quoted args. exec "$JAVACMD" "$@" "${JAVA_OPTS_ARR[@]}" "${GRADLE_OPTS_ARR[@]}" "-Dorg.gradle.appname=$APP_BASE_NAME" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "${ARGV[@]}"
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -1,6 +0,0 @@
pluginManagement {
repositories {
gradlePluginPortal()
maven { url = 'https://maven.minecraftforge.net/' }
}
}

View File

@@ -54,20 +54,40 @@ public class BuildConfig {
} }
public static class SurvivalBalancers { public static class SurvivalBalancers {
public final ForgeConfigSpec.ConfigValue<Boolean> breakFar;
public final ForgeConfigSpec.ConfigValue<Boolean> increasedMiningTime;
public final ForgeConfigSpec.ConfigValue<Integer> miningTimePercentage;
public final ForgeConfigSpec.ConfigValue<Integer> quickReplaceMiningLevel; public final ForgeConfigSpec.ConfigValue<Integer> quickReplaceMiningLevel;
public final ForgeConfigSpec.ConfigValue<Integer> undoStackSize; public final ForgeConfigSpec.ConfigValue<Integer> undoStackSize;
public SurvivalBalancers(ForgeConfigSpec.Builder builder) { public SurvivalBalancers(ForgeConfigSpec.Builder builder) {
builder.push("SurvivalBalancers"); builder.push("SurvivalBalancers");
breakFar = builder
.comment("Allows a survival player to break blocks that are far away, in addition to placing blocks.",
"Note: this allows insta-breaking of blocks in survival.")
.define("breakFar", false);
increasedMiningTime = builder
.comment("Increases the time to mine a block when breaking multiple at once.",
"Mining time depends on how many blocks, what type of blocks, and the percentage below.",
"Example: breaking 1 dirt + 1 obsidian takes the time of breaking 1 dirt + 1 obsidian.")
.define("increasedMiningTime", true);
miningTimePercentage = builder
.comment("How much the mining time of each additional block counts towards an increased mining time.",
"A percentage between 0% and 100%, where 0% is the same as disabling it,",
"and 100% takes as much time as breaking each block individually.",
"The block in front of you always counts as 100%.")
.defineInRange("miningTimePercentage", 50, 0, 200);
quickReplaceMiningLevel = builder quickReplaceMiningLevel = builder
.comment("Determines what blocks can be replaced in survival.", .comment("Determines what blocks can be replaced in survival.",
"-1: only blocks that can be harvested by hand (default)", "-1: only blocks that can be harvested by hand (default)",
"0: blocks that can be harvested with wooden or gold tools", "0: blocks that can be harvested with wooden or gold tools",
"1: blocks that can be harvested with stone tools", "1: blocks that can be harvested with stone tools",
"2: blocks that can be harvested with iron tools", "2: blocks that can be harvested with iron tools",
"3: blocks that can be harvested with diamond tools", "3: blocks that can be harvested with diamond tools")
"4: blocks that can be harvested with netherite tools")
.defineInRange("quickReplaceMiningLevel", -1, -1, 3); .defineInRange("quickReplaceMiningLevel", -1, -1, 3);
undoStackSize = builder undoStackSize = builder
@@ -82,7 +102,7 @@ public class BuildConfig {
public static class Visuals { public static class Visuals {
public final ForgeConfigSpec.ConfigValue<Boolean> alwaysShowBlockPreview; public final ForgeConfigSpec.ConfigValue<Boolean> alwaysShowBlockPreview;
public final ForgeConfigSpec.ConfigValue<Double> dissolveTimeMultiplier; public final ForgeConfigSpec.ConfigValue<Double> dissolveTimeMultiplier;
public final ForgeConfigSpec.ConfigValue<Integer> shaderThreshold; public final ForgeConfigSpec.ConfigValue<Integer> shaderTreshold;
public final ForgeConfigSpec.ConfigValue<Boolean> useShaders; public final ForgeConfigSpec.ConfigValue<Boolean> useShaders;
public Visuals(ForgeConfigSpec.Builder builder) { public Visuals(ForgeConfigSpec.Builder builder) {
@@ -100,7 +120,7 @@ public class BuildConfig {
"Relaxing: 1.5") "Relaxing: 1.5")
.define("dissolveTimeMultiplier", 1.0); .define("dissolveTimeMultiplier", 1.0);
shaderThreshold = builder shaderTreshold = builder
.comment("Switch to using the simple performance shader when placing more than this many blocks.") .comment("Switch to using the simple performance shader when placing more than this many blocks.")
.define("shaderTreshold", 1500); .define("shaderTreshold", 1500);

View File

@@ -1,23 +1,21 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import net.minecraft.network.chat.Component; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.Container;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.world.inventory.MenuType; import net.minecraft.item.Item;
import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.item.Item; import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.event.CreativeModeTabEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.network.IContainerFactory; import net.minecraftforge.fml.network.IContainerFactory;
import net.minecraftforge.registries.RegistryObject;
import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager;
@@ -34,9 +32,10 @@ import nl.requios.effortlessbuilding.proxy.ServerProxy;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
// The value here should match an entry in the META-INF/mods.toml file
@Mod(EffortlessBuilding.MODID) @Mod(EffortlessBuilding.MODID)
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class EffortlessBuilding { public class EffortlessBuilding {
public static final String MODID = "effortlessbuilding"; public static final String MODID = "effortlessbuilding";
public static final Logger logger = LogManager.getLogger(); public static final Logger logger = LogManager.getLogger();
@@ -45,7 +44,7 @@ public class EffortlessBuilding {
//Registration //Registration
private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
private static final DeferredRegister<MenuType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, EffortlessBuilding.MODID); private static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, EffortlessBuilding.MODID);
public static final RegistryObject<Item> RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new); public static final RegistryObject<Item> RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new);
public static final RegistryObject<Item> GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new); public static final RegistryObject<Item> GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new);
@@ -54,9 +53,9 @@ public class EffortlessBuilding {
public static final RegistryObject<Item> REACH_UPGRADE_2_ITEM = ITEMS.register("reach_upgrade2", ReachUpgrade2Item::new); public static final RegistryObject<Item> REACH_UPGRADE_2_ITEM = ITEMS.register("reach_upgrade2", ReachUpgrade2Item::new);
public static final RegistryObject<Item> REACH_UPGRADE_3_ITEM = ITEMS.register("reach_upgrade3", ReachUpgrade3Item::new); public static final RegistryObject<Item> REACH_UPGRADE_3_ITEM = ITEMS.register("reach_upgrade3", ReachUpgrade3Item::new);
public static final RegistryObject<MenuType<RandomizerBagContainer>> RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("randomizer_bag", () -> registerContainer(RandomizerBagContainer::new)); public static final RegistryObject<ContainerType<RandomizerBagContainer>> RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("randomizer_bag", () -> registerContainer(RandomizerBagContainer::new));
public static final RegistryObject<MenuType<GoldenRandomizerBagContainer>> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new)); public static final RegistryObject<ContainerType<GoldenRandomizerBagContainer>> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new));
public static final RegistryObject<MenuType<DiamondRandomizerBagContainer>> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new)); public static final RegistryObject<ContainerType<DiamondRandomizerBagContainer>> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new));
public EffortlessBuilding() { public EffortlessBuilding() {
instance = this; instance = this;
@@ -71,15 +70,38 @@ public class EffortlessBuilding {
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, BuildConfig.spec); ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, BuildConfig.spec);
} }
public static <T extends AbstractContainerMenu> MenuType<T> registerContainer(IContainerFactory<T> fact){ public static <T extends Container> ContainerType<T> registerContainer(IContainerFactory<T> fact){
MenuType<T> type = new MenuType<T>(fact); ContainerType<T> type = new ContainerType<T>(fact);
return type; return type;
} }
public static void log(String msg) {
logger.info(msg);
}
public static void log(PlayerEntity player, String msg) {
log(player, msg, false);
}
public static void log(PlayerEntity player, String msg, boolean actionBar) {
player.displayClientMessage(new StringTextComponent(msg), actionBar);
}
//Log with translation supported, call either on client or server (which then sends a message)
public static void logTranslate(PlayerEntity player, String prefix, String translationKey, String suffix, boolean actionBar) {
proxy.logTranslate(player, prefix, translationKey, suffix, actionBar);
}
@SubscribeEvent @SubscribeEvent
public void setup(final FMLCommonSetupEvent event) { public void setup(final FMLCommonSetupEvent event) {
CapabilityManager.INSTANCE.register(ModifierCapabilityManager.IModifierCapability.class, new ModifierCapabilityManager.Storage(), ModifierCapabilityManager.ModifierCapability::new);
CapabilityManager.INSTANCE.register(ModeCapabilityManager.IModeCapability.class, new ModeCapabilityManager.Storage(), ModeCapabilityManager.ModeCapability::new);
PacketHandler.register(); PacketHandler.register();
//TODO 1.13 config
// ConfigManager.sync(MODID, Config.Type.INSTANCE);
proxy.setup(event); proxy.setup(event);
CompatHelper.setup(); CompatHelper.setup();
@@ -87,43 +109,7 @@ public class EffortlessBuilding {
@SubscribeEvent @SubscribeEvent
public void clientSetup(final FMLClientSetupEvent event) { public void clientSetup(final FMLClientSetupEvent event) {
proxy.clientSetup(event); proxy.clientSetup(event);
} }
@SubscribeEvent
public void registerCapabilities(RegisterCapabilitiesEvent event) {
event.register(ModifierCapabilityManager.IModifierCapability.class);
event.register(ModeCapabilityManager.IModeCapability.class);
}
@SubscribeEvent
public void registerCreativeModeTabs(CreativeModeTabEvent.BuildContents event) {
if (event.getTab() == CreativeModeTabs.TOOLS_AND_UTILITIES){
event.accept(RANDOMIZER_BAG_ITEM);
event.accept(GOLDEN_RANDOMIZER_BAG_ITEM);
event.accept(DIAMOND_RANDOMIZER_BAG_ITEM);
event.accept(REACH_UPGRADE_1_ITEM);
event.accept(REACH_UPGRADE_2_ITEM);
event.accept(REACH_UPGRADE_3_ITEM);
}
//To create custom tab see https://gist.github.com/ChampionAsh5357/c21724bafbc630da2ed8899fe0c1d226
}
public static void log(String msg) {
logger.info(msg);
}
public static void log(Player player, String msg) {
log(player, msg, false);
}
public static void log(Player player, String msg, boolean actionBar) {
player.displayClientMessage(Component.literal(msg), actionBar);
}
//Log with translation supported, call either on client or server (which then sends a message)
public static void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) {
proxy.logTranslate(player, prefix, translationKey, suffix, actionBar);
}
} }

View File

@@ -1,40 +1,43 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import net.minecraft.world.InteractionHand; import net.minecraft.block.BlockState;
import net.minecraft.world.item.BlockItem; import net.minecraft.block.Blocks;
import net.minecraft.world.item.ItemStack; import net.minecraft.entity.Entity;
import net.minecraft.world.level.block.Blocks; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.entity.Entity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.util.ResourceLocation;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.math.BlockPos;
import net.minecraft.resources.ResourceLocation; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo;
import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager;
import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager;
import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.network.AddUndoMessage; import nl.requios.effortlessbuilding.network.AddUndoMessage;
import nl.requios.effortlessbuilding.network.ClearUndoMessage; import nl.requios.effortlessbuilding.network.ClearUndoMessage;
import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.network.PacketHandler;
import nl.requios.effortlessbuilding.network.RequestLookAtMessage; import nl.requios.effortlessbuilding.network.RequestLookAtMessage;
@Mod.EventBusSubscriber(modid = EffortlessBuilding.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) import java.util.List;
public class ForgeEventHandler {
@Mod.EventBusSubscriber
public class EventHandler {
@SubscribeEvent @SubscribeEvent
public static void attachCapabilities(AttachCapabilitiesEvent<Entity> event) { public static void attachCapabilities(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof FakePlayer) return; if (event.getObject() instanceof FakePlayer) return;
if (event.getObject() instanceof Player) { if (event.getObject() instanceof PlayerEntity) {
event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "build_modifier"), new ModifierCapabilityManager.Provider()); event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "build_modifier"), new ModifierCapabilityManager.Provider());
event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "build_mode"), new ModeCapabilityManager.Provider()); event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "build_mode"), new ModeCapabilityManager.Provider());
} }
@@ -42,27 +45,19 @@ public class ForgeEventHandler {
@SubscribeEvent @SubscribeEvent
public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) {
if (event.getLevel().isClientSide()) return; if (event.getWorld().isClientSide()) return;
if (!(event.getEntity() instanceof Player)) return; if (!(event.getEntity() instanceof PlayerEntity)) return;
if (event.getEntity() instanceof FakePlayer) return; if (event.getEntity() instanceof FakePlayer) return;
//Cancel event if necessary //Cancel event if necessary
ServerPlayer player = ((ServerPlayer) event.getEntity()); ServerPlayerEntity player = ((ServerPlayerEntity) event.getEntity());
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
if (buildMode != BuildModes.BuildModeEnum.NORMAL) { if (buildMode != BuildModes.BuildModeEnum.NORMAL) {
//Only cancel if itemblock in hand
//Fixed issue with e.g. Create Wrench shift-rightclick disassembling being cancelled.
ItemStack currentItemStack = player.getItemInHand(InteractionHand.MAIN_HAND);
if (currentItemStack.getItem() instanceof BlockItem ||
(CompatHelper.isItemBlockProxy(currentItemStack) && !player.isShiftKeyDown())) {
event.setCanceled(true); event.setCanceled(true);
}
} else if (modifierSettings.doQuickReplace()) { } else if (modifierSettings.doQuickReplace()) {
//Cancel event and send message if QuickReplace //Cancel event and send message if QuickReplace
event.setCanceled(true); event.setCanceled(true);
@@ -85,7 +80,7 @@ public class ForgeEventHandler {
@SubscribeEvent @SubscribeEvent
public static void onBlockBroken(BlockEvent.BreakEvent event) { public static void onBlockBroken(BlockEvent.BreakEvent event) {
if (event.getLevel().isClientSide()) return; if (event.getWorld().isClientSide()) return;
if (event.getPlayer() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
@@ -101,44 +96,83 @@ public class ForgeEventHandler {
BuildModes.onBlockBroken(event.getPlayer(), event.getPos(), false); BuildModes.onBlockBroken(event.getPlayer(), event.getPos(), false);
//Add to undo stack in client //Add to undo stack in client
if (event.getPlayer() instanceof ServerPlayer && event.getState() != null && event.getPos() != null) { if (event.getPlayer() instanceof ServerPlayerEntity && event.getState() != null && event.getPos() != null) {
PacketDistributor.PacketTarget packetTarget = PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getPlayer()); PacketDistributor.PacketTarget packetTarget = PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer());
if (packetTarget != null) if (packetTarget != null)
PacketHandler.INSTANCE.send(packetTarget, new AddUndoMessage(event.getPos(), event.getState(), Blocks.AIR.defaultBlockState())); PacketHandler.INSTANCE.send(packetTarget, new AddUndoMessage(event.getPos(), event.getState(), Blocks.AIR.defaultBlockState()));
} }
} }
} }
@SubscribeEvent
public static void breakSpeed(PlayerEvent.BreakSpeed event) {
//Disable if config says so
if (!BuildConfig.survivalBalancers.increasedMiningTime.get()) return;
if (event.getPlayer() instanceof FakePlayer) return;
PlayerEntity player = event.getPlayer();
World world = player.level;
BlockPos pos = event.getPos();
//EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed()));
float originalBlockHardness = event.getState().getDestroySpeed(world, pos);
if (originalBlockHardness < 0) return; //Dont break bedrock
float totalBlockHardness = 0;
//get coordinates
List<BlockPos> coordinates = BuildModifiers.findCoordinates(player, pos);
for (int i = 1; i < coordinates.size(); i++) {
BlockPos coordinate = coordinates.get(i);
//get existing blockstates at those coordinates
BlockState blockState = world.getBlockState(coordinate);
//add hardness for each blockstate, if can break
if (SurvivalHelper.canBreak(world, player, coordinate))
totalBlockHardness += blockState.getDestroySpeed(world, coordinate);
}
//Grabbing percentage from config
float percentage = (float) BuildConfig.survivalBalancers.miningTimePercentage.get() / 100;
totalBlockHardness *= percentage;
totalBlockHardness += originalBlockHardness;
float newSpeed = event.getOriginalSpeed() / totalBlockHardness * originalBlockHardness;
if (Float.isNaN(newSpeed) || newSpeed == 0f) newSpeed = 1f;
event.setNewSpeed(newSpeed);
//EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed()));
}
@SubscribeEvent @SubscribeEvent
public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
if (event.getEntity() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
Player player = event.getEntity(); PlayerEntity player = event.getPlayer();
ModifierSettingsManager.handleNewPlayer(player); ModifierSettingsManager.handleNewPlayer(player);
ModeSettingsManager.handleNewPlayer(player); ModeSettingsManager.handleNewPlayer(player);
} }
@SubscribeEvent @SubscribeEvent
public static void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) { public static void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) {
if (event.getEntity() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
Player player = event.getEntity(); PlayerEntity player = event.getPlayer();
if (player.getCommandSenderWorld().isClientSide) return; if (player.getCommandSenderWorld().isClientSide) return;
UndoRedo.clear(player); UndoRedo.clear(player);
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ClearUndoMessage()); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), new ClearUndoMessage());
} }
@SubscribeEvent @SubscribeEvent
public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) {
if (event.getEntity() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
Player player = event.getEntity(); PlayerEntity player = event.getPlayer();
ModifierSettingsManager.handleNewPlayer(player); ModifierSettingsManager.handleNewPlayer(player);
ModeSettingsManager.handleNewPlayer(player); ModeSettingsManager.handleNewPlayer(player);
} }
@SubscribeEvent @SubscribeEvent
public static void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) { public static void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) {
if (event.getEntity() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
Player player = event.getEntity(); PlayerEntity player = event.getPlayer();
if (player.getCommandSenderWorld().isClientSide) return; if (player.getCommandSenderWorld().isClientSide) return;
//Set build mode to normal //Set build mode to normal
@@ -157,17 +191,17 @@ public class ForgeEventHandler {
ModeSettingsManager.handleNewPlayer(player); ModeSettingsManager.handleNewPlayer(player);
UndoRedo.clear(player); UndoRedo.clear(player);
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ClearUndoMessage()); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), new ClearUndoMessage());
} }
@SubscribeEvent @SubscribeEvent
public static void onPlayerClone(PlayerEvent.Clone event) { public static void onPlayerClone(PlayerEvent.Clone event) {
if (event.getEntity() instanceof FakePlayer) return; if (event.getPlayer() instanceof FakePlayer) return;
//Attach capabilities on death, otherwise crash //Attach capabilities on death, otherwise crash
Player oldPlayer = event.getOriginal(); PlayerEntity oldPlayer = event.getOriginal();
oldPlayer.revive(); oldPlayer.revive();
Player newPlayer = event.getEntity(); PlayerEntity newPlayer = event.getPlayer();
ModifierSettingsManager.setModifierSettings(newPlayer, ModifierSettingsManager.getModifierSettings(oldPlayer)); ModifierSettingsManager.setModifierSettings(newPlayer, ModifierSettingsManager.getModifierSettings(oldPlayer));
ModeSettingsManager.setModeSettings(newPlayer, ModeSettingsManager.getModeSettings(oldPlayer)); ModeSettingsManager.setModeSettings(newPlayer, ModeSettingsManager.getModeSettings(oldPlayer));
} }

View File

@@ -1,51 +1,46 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.Minecraft;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.KeyMapping; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.util.ResourceLocation;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.event.RegisterShadersEvent;
import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.client.settings.KeyModifier;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.render.BuildRenderTypes; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import org.lwjgl.glfw.GLFW;
import java.io.IOException; import java.util.HashMap;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = {Dist.CLIENT}) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = {Dist.CLIENT})
public class ModClientEventHandler { public class ModClientEventHandler {
private static final HashMap<BuildModes.BuildModeEnum, ResourceLocation> buildModeIcons = new HashMap<>();
private static final HashMap<ModeOptions.ActionEnum, ResourceLocation> modeOptionIcons = new HashMap<>();
@SubscribeEvent @SubscribeEvent
public static void registerKeyMappings(RegisterKeyMappingsEvent event) { public static void onTextureStitch(final TextureStitchEvent.Pre event) {
EffortlessBuilding.log("Registering KeyMappings!"); EffortlessBuilding.log("Stitching textures");
//register icon textures
for (final BuildModes.BuildModeEnum mode : BuildModes.BuildModeEnum.values()) {
final ResourceLocation spriteLocation = new ResourceLocation(EffortlessBuilding.MODID, "icons/" + mode.name().toLowerCase());
event.addSprite(spriteLocation);
buildModeIcons.put(mode, spriteLocation);
}
// register key bindings for (final ModeOptions.ActionEnum action : ModeOptions.ActionEnum.values()) {
ClientProxy.keyBindings = new KeyMapping[6]; final ResourceLocation spriteLocation = new ResourceLocation(EffortlessBuilding.MODID, "icons/" + action.name().toLowerCase());
event.addSprite(spriteLocation);
// instantiate the key bindings modeOptionIcons.put(action, spriteLocation);
ClientProxy.keyBindings[0] = new KeyMapping("key.effortlessbuilding.hud.desc", KeyConflictContext.IN_GAME, InputConstants.getKey(GLFW.GLFW_KEY_KP_ADD, 0), "key.effortlessbuilding.category");
ClientProxy.keyBindings[1] = new KeyMapping("key.effortlessbuilding.replace.desc", KeyConflictContext.IN_GAME, InputConstants.getKey(GLFW.GLFW_KEY_KP_SUBTRACT, 0), "key.effortlessbuilding.category");
ClientProxy.keyBindings[2] = new KeyMapping("key.effortlessbuilding.mode.desc", KeyConflictContext.IN_GAME, InputConstants.getKey(GLFW.GLFW_KEY_LEFT_ALT, 0), "key.effortlessbuilding.category");
ClientProxy.keyBindings[3] = new KeyMapping("key.effortlessbuilding.undo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputConstants.getKey(GLFW.GLFW_KEY_Z, 0), "key.effortlessbuilding.category");
ClientProxy.keyBindings[4] = new KeyMapping("key.effortlessbuilding.redo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputConstants.getKey(GLFW.GLFW_KEY_Y, 0), "key.effortlessbuilding.category");
ClientProxy.keyBindings[5] = new KeyMapping("key.effortlessbuilding.altplacement.desc", KeyConflictContext.IN_GAME, InputConstants.getKey(GLFW.GLFW_KEY_LEFT_CONTROL, 0), "key.effortlessbuilding.category");
for (KeyMapping keyBinding : ClientProxy.keyBindings) {
event.register(keyBinding);
} }
} }
@SubscribeEvent public static TextureAtlasSprite getBuildModeIcon(BuildModes.BuildModeEnum mode) {
public static void registerShaders(RegisterShadersEvent event) throws IOException { return Minecraft.getInstance().getModelManager().getAtlas(AtlasTexture.LOCATION_BLOCKS).getSprite(buildModeIcons.get(mode));
event.registerShader(new ShaderInstance(event.getResourceProvider(), }
new ResourceLocation(EffortlessBuilding.MODID, "dissolve"),
DefaultVertexFormat.BLOCK), public static TextureAtlasSprite getModeOptionIcon(ModeOptions.ActionEnum action) {
shaderInstance -> BuildRenderTypes.dissolveShaderInstance = shaderInstance); return Minecraft.getInstance().getModelManager().getAtlas(AtlasTexture.LOCATION_BLOCKS).getSprite(modeOptionIcons.get(action));
} }
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import java.util.Dictionary; import java.util.Dictionary;
import java.util.Hashtable; import java.util.Hashtable;
@@ -16,24 +16,24 @@ public abstract class BaseBuildMode implements IBuildMode {
protected Dictionary<UUID, Integer> rightClickServerTable = new Hashtable<>(); protected Dictionary<UUID, Integer> rightClickServerTable = new Hashtable<>();
protected Dictionary<UUID, BlockPos> firstPosTable = new Hashtable<>(); protected Dictionary<UUID, BlockPos> firstPosTable = new Hashtable<>();
protected Dictionary<UUID, Direction> sideHitTable = new Hashtable<>(); protected Dictionary<UUID, Direction> sideHitTable = new Hashtable<>();
protected Dictionary<UUID, Vec3> hitVecTable = new Hashtable<>(); protected Dictionary<UUID, Vector3d> hitVecTable = new Hashtable<>();
@Override @Override
public void initialize(Player player) { public void initialize(PlayerEntity player) {
rightClickClientTable.put(player.getUUID(), 0); rightClickClientTable.put(player.getUUID(), 0);
rightClickServerTable.put(player.getUUID(), 0); rightClickServerTable.put(player.getUUID(), 0);
firstPosTable.put(player.getUUID(), BlockPos.ZERO); firstPosTable.put(player.getUUID(), BlockPos.ZERO);
sideHitTable.put(player.getUUID(), Direction.UP); sideHitTable.put(player.getUUID(), Direction.UP);
hitVecTable.put(player.getUUID(), Vec3.ZERO); hitVecTable.put(player.getUUID(), Vector3d.ZERO);
} }
@Override @Override
public Direction getSideHit(Player player) { public Direction getSideHit(PlayerEntity player) {
return sideHitTable.get(player.getUUID()); return sideHitTable.get(player.getUUID());
} }
@Override @Override
public Vec3 getHitVec(Player player) { public Vector3d getHitVec(PlayerEntity player) {
return hitVecTable.get(player.getUUID()); return hitVecTable.get(player.getUUID());
} }
} }

View File

@@ -1,11 +1,12 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.level.ClipContext; import net.minecraft.util.math.RayTraceContext;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector4f;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.buildmodes.*; import nl.requios.effortlessbuilding.buildmode.buildmodes.*;
import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers; import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers;
@@ -14,7 +15,6 @@ import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.network.BlockBrokenMessage; import nl.requios.effortlessbuilding.network.BlockBrokenMessage;
import nl.requios.effortlessbuilding.network.BlockPlacedMessage; import nl.requios.effortlessbuilding.network.BlockPlacedMessage;
import org.joml.Vector4f;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Dictionary; import java.util.Dictionary;
@@ -27,16 +27,16 @@ public class BuildModes {
//Static variables are shared between client and server in singleplayer //Static variables are shared between client and server in singleplayer
//We need them separate //We need them separate
public static Dictionary<Player, Boolean> currentlyBreakingClient = new Hashtable<>(); public static Dictionary<PlayerEntity, Boolean> currentlyBreakingClient = new Hashtable<>();
public static Dictionary<Player, Boolean> currentlyBreakingServer = new Hashtable<>(); public static Dictionary<PlayerEntity, Boolean> currentlyBreakingServer = new Hashtable<>();
//Uses a network message to get the previous raytraceresult from the player //Uses a network message to get the previous raytraceresult from the player
//The server could keep track of all raytraceresults but this might lag with many players //The server could keep track of all raytraceresults but this might lag with many players
//Raytraceresult is needed for sideHit and hitVec //Raytraceresult is needed for sideHit and hitVec
public static void onBlockPlacedMessage(Player player, BlockPlacedMessage message) { public static void onBlockPlacedMessage(PlayerEntity player, BlockPlacedMessage message) {
//Check if not in the middle of breaking //Check if not in the middle of breaking
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
if (currentlyBreaking.get(player) != null && currentlyBreaking.get(player)) { if (currentlyBreaking.get(player) != null && currentlyBreaking.get(player)) {
//Cancel breaking //Cancel breaking
initializeMode(player); initializeMode(player);
@@ -53,6 +53,7 @@ public class BuildModes {
startPos = message.getBlockPos(); startPos = message.getBlockPos();
//Offset in direction of sidehit if not quickreplace and not replaceable //Offset in direction of sidehit if not quickreplace and not replaceable
//TODO 1.13 replaceable
boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable(); boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable();
boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, message.getSideHit()); boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, message.getSideHit());
if (!modifierSettings.doQuickReplace() && !replaceable && !becomesDoubleSlab) { if (!modifierSettings.doQuickReplace() && !replaceable && !becomesDoubleSlab) {
@@ -90,7 +91,7 @@ public class BuildModes {
Direction sideHit = buildMode.instance.getSideHit(player); Direction sideHit = buildMode.instance.getSideHit(player);
if (sideHit == null) sideHit = message.getSideHit(); if (sideHit == null) sideHit = message.getSideHit();
Vec3 hitVec = buildMode.instance.getHitVec(player); Vector3d hitVec = buildMode.instance.getHitVec(player);
if (hitVec == null) hitVec = message.getHitVec(); if (hitVec == null) hitVec = message.getHitVec();
BuildModifiers.onBlockPlaced(player, coordinates, sideHit, hitVec, message.getPlaceStartPos()); BuildModifiers.onBlockPlaced(player, coordinates, sideHit, hitVec, message.getPlaceStartPos());
@@ -98,26 +99,25 @@ public class BuildModes {
//Only works when finishing a buildmode is equal to placing some blocks //Only works when finishing a buildmode is equal to placing some blocks
//No intermediate blocks allowed //No intermediate blocks allowed
currentlyBreaking.remove(player); currentlyBreaking.remove(player);
} }
//Use a network message to break blocks in the distance using clientside mouse input //Use a network message to break blocks in the distance using clientside mouse input
public static void onBlockBrokenMessage(Player player, BlockBrokenMessage message) { public static void onBlockBrokenMessage(PlayerEntity player, BlockBrokenMessage message) {
BlockPos startPos = message.isBlockHit() ? message.getBlockPos() : null; BlockPos startPos = message.isBlockHit() ? message.getBlockPos() : null;
onBlockBroken(player, startPos, true); onBlockBroken(player, startPos, true);
} }
public static void onBlockBroken(Player player, BlockPos startPos, boolean breakStartPos) { public static void onBlockBroken(PlayerEntity player, BlockPos startPos, boolean breakStartPos) {
//Check if not in the middle of placing //Check if not in the middle of placing
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
if (currentlyBreaking.get(player) != null && !currentlyBreaking.get(player)) { if (currentlyBreaking.get(player) != null && !currentlyBreaking.get(player)) {
//Cancel placing //Cancel placing
initializeMode(player); initializeMode(player);
return; return;
} }
if (!ReachHelper.canBreakFar(player)) return;
//If first click //If first click
if (currentlyBreaking.get(player) == null) { if (currentlyBreaking.get(player) == null) {
//If startpos is null, dont do anything //If startpos is null, dont do anything
@@ -129,7 +129,7 @@ public class BuildModes {
//Get coordinates //Get coordinates
BuildModeEnum buildMode = modeSettings.getBuildMode(); BuildModeEnum buildMode = modeSettings.getBuildMode();
List<BlockPos> coordinates = buildMode.instance.onRightClick(player, startPos, Direction.UP, Vec3.ZERO, true); List<BlockPos> coordinates = buildMode.instance.onRightClick(player, startPos, Direction.UP, Vector3d.ZERO, true);
if (coordinates.isEmpty()) { if (coordinates.isEmpty()) {
currentlyBreaking.put(player, true); currentlyBreaking.put(player, true);
@@ -144,7 +144,7 @@ public class BuildModes {
currentlyBreaking.remove(player); currentlyBreaking.remove(player);
} }
public static List<BlockPos> findCoordinates(Player player, BlockPos startPos, boolean skipRaytrace) { public static List<BlockPos> findCoordinates(PlayerEntity player, BlockPos startPos, boolean skipRaytrace) {
List<BlockPos> coordinates = new ArrayList<>(); List<BlockPos> coordinates = new ArrayList<>();
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
@@ -153,61 +153,61 @@ public class BuildModes {
return coordinates; return coordinates;
} }
public static void initializeMode(Player player) { public static void initializeMode(PlayerEntity player) {
//Resetting mode, so not placing or breaking //Resetting mode, so not placing or breaking
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
currentlyBreaking.remove(player); currentlyBreaking.remove(player);
ModeSettingsManager.getModeSettings(player).getBuildMode().instance.initialize(player); ModeSettingsManager.getModeSettings(player).getBuildMode().instance.initialize(player);
} }
public static boolean isCurrentlyPlacing(Player player) { public static boolean isCurrentlyPlacing(PlayerEntity player) {
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
return currentlyBreaking.get(player) != null && !currentlyBreaking.get(player); return currentlyBreaking.get(player) != null && !currentlyBreaking.get(player);
} }
public static boolean isCurrentlyBreaking(Player player) { public static boolean isCurrentlyBreaking(PlayerEntity player) {
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
return currentlyBreaking.get(player) != null && currentlyBreaking.get(player); return currentlyBreaking.get(player) != null && currentlyBreaking.get(player);
} }
//Either placing or breaking //Either placing or breaking
public static boolean isActive(Player player) { public static boolean isActive(PlayerEntity player) {
Dictionary<Player, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<PlayerEntity, Boolean> currentlyBreaking = player.level.isClientSide ? currentlyBreakingClient : currentlyBreakingServer;
return currentlyBreaking.get(player) != null; return currentlyBreaking.get(player) != null;
} }
//Find coordinates on a line bound by a plane //Find coordinates on a line bound by a plane
public static Vec3 findXBound(double x, Vec3 start, Vec3 look) { public static Vector3d findXBound(double x, Vector3d start, Vector3d look) {
//then y and z are //then y and z are
double y = (x - start.x) / look.x * look.y + start.y; double y = (x - start.x) / look.x * look.y + start.y;
double z = (x - start.x) / look.x * look.z + start.z; double z = (x - start.x) / look.x * look.z + start.z;
return new Vec3(x, y, z); return new Vector3d(x, y, z);
} }
//-- Common build mode functionality --// //-- Common build mode functionality --//
public static Vec3 findYBound(double y, Vec3 start, Vec3 look) { public static Vector3d findYBound(double y, Vector3d start, Vector3d look) {
//then x and z are //then x and z are
double x = (y - start.y) / look.y * look.x + start.x; double x = (y - start.y) / look.y * look.x + start.x;
double z = (y - start.y) / look.y * look.z + start.z; double z = (y - start.y) / look.y * look.z + start.z;
return new Vec3(x, y, z); return new Vector3d(x, y, z);
} }
public static Vec3 findZBound(double z, Vec3 start, Vec3 look) { public static Vector3d findZBound(double z, Vector3d start, Vector3d look) {
//then x and y are //then x and y are
double x = (z - start.z) / look.z * look.x + start.x; double x = (z - start.z) / look.z * look.x + start.x;
double y = (z - start.z) / look.z * look.y + start.y; double y = (z - start.z) / look.z * look.y + start.y;
return new Vec3(x, y, z); return new Vector3d(x, y, z);
} }
//Use this instead of player.getLookVec() in any buildmodes code //Use this instead of player.getLookVec() in any buildmodes code
public static Vec3 getPlayerLookVec(Player player) { public static Vector3d getPlayerLookVec(PlayerEntity player) {
Vec3 lookVec = player.getLookAngle(); Vector3d lookVec = player.getLookAngle();
double x = lookVec.x; double x = lookVec.x;
double y = lookVec.y; double y = lookVec.y;
double z = lookVec.z; double z = lookVec.z;
@@ -227,16 +227,16 @@ public class BuildModes {
if (Math.abs(z - 1.0) < 0.0001) z = 0.9999; if (Math.abs(z - 1.0) < 0.0001) z = 0.9999;
if (Math.abs(z + 1.0) < 0.0001) z = -0.9999; if (Math.abs(z + 1.0) < 0.0001) z = -0.9999;
return new Vec3(x, y, z); return new Vector3d(x, y, z);
} }
public static boolean isCriteriaValid(Vec3 start, Vec3 look, int reach, Player player, boolean skipRaytrace, Vec3 lineBound, Vec3 planeBound, double distToPlayerSq) { public static boolean isCriteriaValid(Vector3d start, Vector3d look, int reach, PlayerEntity player, boolean skipRaytrace, Vector3d lineBound, Vector3d planeBound, double distToPlayerSq) {
boolean intersects = false; boolean intersects = false;
if (!skipRaytrace) { if (!skipRaytrace) {
//collision within a 1 block radius to selected is fine //collision within a 1 block radius to selected is fine
ClipContext rayTraceContext = new ClipContext(start, lineBound, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player); RayTraceContext rayTraceContext = new RayTraceContext(start, lineBound, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, player);
HitResult rayTraceResult = player.level.clip(rayTraceContext); RayTraceResult rayTraceResult = player.level.clip(rayTraceContext);
intersects = rayTraceResult != null && rayTraceResult.getType() == HitResult.Type.BLOCK && intersects = rayTraceResult != null && rayTraceResult.getType() == RayTraceResult.Type.BLOCK &&
planeBound.subtract(rayTraceResult.getLocation()).lengthSqr() > 4; planeBound.subtract(rayTraceResult.getLocation()).lengthSqr() > 4;
} }
@@ -258,14 +258,11 @@ public class BuildModes {
CIRCLE("circle", new Circle(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL), CIRCLE("circle", new Circle(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL),
CYLINDER("cylinder", new Cylinder(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL), CYLINDER("cylinder", new Cylinder(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL),
SPHERE("sphere", new Sphere(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL); SPHERE("sphere", new Sphere(), BuildModeCategoryEnum.CIRCULAR, OptionEnum.CIRCLE_START, OptionEnum.FILL);
// PYRAMID("pyramid", new Pyramid(), BuildModeCategoryEnum.ROOF),
// CONE("cone", new Cone(), BuildModeCategoryEnum.ROOF),
// DOME("dome", new Dome(), BuildModeCategoryEnum.ROOF);
private final String name; public String name;
public final IBuildMode instance; public IBuildMode instance;
public final BuildModeCategoryEnum category; public final BuildModeCategoryEnum category;
public final OptionEnum[] options; public OptionEnum[] options;
BuildModeEnum(String name, IBuildMode instance, BuildModeCategoryEnum category, OptionEnum... options) { BuildModeEnum(String name, IBuildMode instance, BuildModeCategoryEnum category, OptionEnum... options) {
this.name = name; this.name = name;
@@ -274,10 +271,6 @@ public class BuildModes {
this.options = options; this.options = options;
} }
public String getName() {
return name;
}
public String getNameKey() { public String getNameKey() {
return "effortlessbuilding.mode." + name; return "effortlessbuilding.mode." + name;
} }

View File

@@ -1,25 +1,25 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import java.util.List; import java.util.List;
public interface IBuildMode { public interface IBuildMode {
//Fired when a player selects a buildmode and when it needs to initializeMode //Fired when a player selects a buildmode and when it needs to initializeMode
void initialize(Player player); void initialize(PlayerEntity player);
//Fired when a block would be placed //Fired when a block would be placed
//Return a list of coordinates where you want to place blocks //Return a list of coordinates where you want to place blocks
List<BlockPos> onRightClick(Player player, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean skipRaytrace); List<BlockPos> onRightClick(PlayerEntity player, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean skipRaytrace);
//Fired continuously for visualization purposes //Fired continuously for visualization purposes
List<BlockPos> findCoordinates(Player player, BlockPos blockPos, boolean skipRaytrace); List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos, boolean skipRaytrace);
Direction getSideHit(Player player); Direction getSideHit(PlayerEntity player);
Vec3 getHitVec(Player player); Vector3d getHitVec(PlayerEntity player);
} }

View File

@@ -1,7 +1,7 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.TextFormatting;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo;
@@ -60,7 +60,7 @@ public class ModeOptions {
} }
//Called on both client and server //Called on both client and server
public static void performAction(Player player, ActionEnum action) { public static void performAction(PlayerEntity player, ActionEnum action) {
if (action == null) return; if (action == null) return;
switch (action) { switch (action) {
@@ -73,7 +73,7 @@ public class ModeOptions {
case REPLACE: case REPLACE:
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
modifierSettings.setQuickReplace(!modifierSettings.doQuickReplace()); modifierSettings.setQuickReplace(!modifierSettings.doQuickReplace());
EffortlessBuilding.log(player, "Set " + ChatFormatting.GOLD + "Quick Replace " + ChatFormatting.RESET + ( EffortlessBuilding.log(player, "Set " + TextFormatting.GOLD + "Quick Replace " + TextFormatting.RESET + (
modifierSettings.doQuickReplace() ? "on" : "off"), true); modifierSettings.doQuickReplace() ? "on" : "off"), true);
break; break;
case OPEN_MODIFIER_SETTINGS: case OPEN_MODIFIER_SETTINGS:

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
@@ -16,33 +16,34 @@ import javax.annotation.Nonnull;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModeSettingsManager { public class ModeSettingsManager {
//Retrieves the buildsettings of a player through the modeCapability capability //Retrieves the buildsettings of a player through the modifierCapability capability
//Never returns null //Never returns null
@Nonnull @Nonnull
public static ModeSettings getModeSettings(Player player) { public static ModeSettings getModeSettings(PlayerEntity player) {
LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability = LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability =
player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null); player.getCapability(ModeCapabilityManager.modeCapability, null);
if (modeCapability.isPresent()) { if (modeCapability.isPresent()) {
ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null); ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null);
if (capability.getModeData() == null){ if (capability.getModeData() == null) {
capability.setModeData(new ModeSettings()); capability.setModeData(new ModeSettings());
} }
return capability.getModeData(); return capability.getModeData();
} }
// EffortlessBuilding.logger.warn("Player does not have modeCapability: " + player); //Player does not have modeCapability capability
//Return dummy settings //Return dummy settings
return new ModeSettings(); return new ModeSettings();
// throw new IllegalArgumentException("Player does not have modeCapability capability");
} }
public static void setModeSettings(Player player, ModeSettings modeSettings) { public static void setModeSettings(PlayerEntity player, ModeSettings modeSettings) {
if (player == null) { if (player == null) {
EffortlessBuilding.log("Cannot set buildmode settings, player is null"); EffortlessBuilding.log("Cannot set buildmode settings, player is null");
return; return;
} }
LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability = LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability =
player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null); player.getCapability(ModeCapabilityManager.modeCapability, null);
modeCapability.ifPresent((capability) -> { modeCapability.ifPresent((capability) -> {
capability.setModeData(modeSettings); capability.setModeData(modeSettings);
@@ -55,7 +56,7 @@ public class ModeSettingsManager {
} }
} }
public static String sanitize(ModeSettings modeSettings, Player player) { public static String sanitize(ModeSettings modeSettings, PlayerEntity player) {
int maxReach = ReachHelper.getMaxReach(player); int maxReach = ReachHelper.getMaxReach(player);
String error = ""; String error = "";
@@ -64,7 +65,7 @@ public class ModeSettingsManager {
return error; return error;
} }
public static void handleNewPlayer(Player player) { public static void handleNewPlayer(PlayerEntity player) {
//Makes sure player has mode settings (if it doesnt it will create it) //Makes sure player has mode settings (if it doesnt it will create it)
getModeSettings(player); getModeSettings(player);
@@ -72,7 +73,7 @@ public class ModeSettingsManager {
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
//Send to client //Send to client
ModeSettingsMessage msg = new ModeSettingsMessage(getModeSettings(player)); ModeSettingsMessage msg = new ModeSettingsMessage(getModeSettings(player));
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), msg); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), msg);
} }
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import java.util.*; import java.util.*;
@@ -12,18 +12,18 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
protected Dictionary<UUID, BlockPos> secondPosTable = new Hashtable<>(); protected Dictionary<UUID, BlockPos> secondPosTable = new Hashtable<>();
//Finds height after floor has been chosen in buildmodes with 3 clicks //Finds height after floor has been chosen in buildmodes with 3 clicks
public static BlockPos findHeight(Player player, BlockPos secondPos, boolean skipRaytrace) { public static BlockPos findHeight(PlayerEntity player, BlockPos secondPos, boolean skipRaytrace) {
Vec3 look = BuildModes.getPlayerLookVec(player); Vector3d look = BuildModes.getPlayerLookVec(player);
Vec3 start = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); Vector3d start = new Vector3d(player.getX(), player.getY() + player.getEyeHeight(), player.getZ());
List<HeightCriteria> criteriaList = new ArrayList<>(3); List<HeightCriteria> criteriaList = new ArrayList<>(3);
//X //X
Vec3 xBound = BuildModes.findXBound(secondPos.getX(), start, look); Vector3d xBound = BuildModes.findXBound(secondPos.getX(), start, look);
criteriaList.add(new HeightCriteria(xBound, secondPos, start)); criteriaList.add(new HeightCriteria(xBound, secondPos, start));
//Z //Z
Vec3 zBound = BuildModes.findZBound(secondPos.getZ(), start, look); Vector3d zBound = BuildModes.findZBound(secondPos.getZ(), start, look);
criteriaList.add(new HeightCriteria(zBound, secondPos, start)); criteriaList.add(new HeightCriteria(zBound, secondPos, start));
//Remove invalid criteria //Remove invalid criteria
@@ -56,13 +56,13 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
} }
@Override @Override
public void initialize(Player player) { public void initialize(PlayerEntity player) {
super.initialize(player); super.initialize(player);
secondPosTable.put(player.getUUID(), BlockPos.ZERO); secondPosTable.put(player.getUUID(), BlockPos.ZERO);
} }
@Override @Override
public List<BlockPos> onRightClick(Player player, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean skipRaytrace) { public List<BlockPos> onRightClick(PlayerEntity player, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable; Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable;
@@ -104,7 +104,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
} }
@Override @Override
public List<BlockPos> findCoordinates(Player player, BlockPos blockPos, boolean skipRaytrace) { public List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable; Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable;
int rightClickNr = rightClickTable.get(player.getUUID()); int rightClickNr = rightClickTable.get(player.getUUID());
@@ -173,24 +173,24 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
} }
//Finds the place of the second block pos //Finds the place of the second block pos
protected abstract BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace); protected abstract BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace);
//Finds the place of the third block pos //Finds the place of the third block pos
protected abstract BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace); protected abstract BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace);
//After first and second pos are known, we want to visualize the blocks in a way (like floor for cube) //After first and second pos are known, we want to visualize the blocks in a way (like floor for cube)
protected abstract List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2); protected abstract List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2);
//After first, second and third pos are known, we want all the blocks //After first, second and third pos are known, we want all the blocks
protected abstract List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3); protected abstract List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3);
static class HeightCriteria { static class HeightCriteria {
Vec3 planeBound; Vector3d planeBound;
Vec3 lineBound; Vector3d lineBound;
double distToLineSq; double distToLineSq;
double distToPlayerSq; double distToPlayerSq;
HeightCriteria(Vec3 planeBound, BlockPos secondPos, Vec3 start) { HeightCriteria(Vector3d planeBound, BlockPos secondPos, Vector3d start) {
this.planeBound = planeBound; this.planeBound = planeBound;
this.lineBound = toLongestLine(this.planeBound, secondPos); this.lineBound = toLongestLine(this.planeBound, secondPos);
this.distToLineSq = this.lineBound.subtract(this.planeBound).lengthSqr(); this.distToLineSq = this.lineBound.subtract(this.planeBound).lengthSqr();
@@ -198,14 +198,14 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
} }
//Make it from a plane into a line, on y axis only //Make it from a plane into a line, on y axis only
private Vec3 toLongestLine(Vec3 boundVec, BlockPos secondPos) { private Vector3d toLongestLine(Vector3d boundVec, BlockPos secondPos) {
BlockPos bound = new BlockPos(boundVec); BlockPos bound = new BlockPos(boundVec);
return new Vec3(secondPos.getX(), bound.getY(), secondPos.getZ()); return new Vector3d(secondPos.getX(), bound.getY(), secondPos.getZ());
} }
//check if its not behind the player and its not too close and not too far //check if its not behind the player and its not too close and not too far
//also check if raytrace from player to block does not intersect blocks //also check if raytrace from player to block does not intersect blocks
public boolean isValid(Vec3 start, Vec3 look, int reach, Player player, boolean skipRaytrace) { public boolean isValid(Vector3d start, Vector3d look, int reach, PlayerEntity player, boolean skipRaytrace) {
return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, lineBound, planeBound, distToPlayerSq); return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, lineBound, planeBound, distToPlayerSq);
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import java.util.ArrayList; import java.util.ArrayList;
@@ -14,7 +14,7 @@ import java.util.UUID;
public abstract class TwoClicksBuildMode extends BaseBuildMode { public abstract class TwoClicksBuildMode extends BaseBuildMode {
@Override @Override
public List<BlockPos> onRightClick(Player player, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean skipRaytrace) { public List<BlockPos> onRightClick(PlayerEntity player, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable; Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable;
@@ -44,7 +44,7 @@ public abstract class TwoClicksBuildMode extends BaseBuildMode {
} }
@Override @Override
public List<BlockPos> findCoordinates(Player player, BlockPos blockPos, boolean skipRaytrace) { public List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable; Dictionary<UUID, Integer> rightClickTable = player.level.isClientSide ? rightClickClientTable : rightClickServerTable;
int rightClickNr = rightClickTable.get(player.getUUID()); int rightClickNr = rightClickTable.get(player.getUUID());
@@ -79,8 +79,8 @@ public abstract class TwoClicksBuildMode extends BaseBuildMode {
} }
//Finds the place of the second block pos based on criteria (floor must be on same height as first click, wall on same plane etc) //Finds the place of the second block pos based on criteria (floor must be on same height as first click, wall on same plane etc)
protected abstract BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace); protected abstract BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace);
//After first and second pos are known, we want all the blocks //After first and second pos are known, we want all the blocks
protected abstract List<BlockPos> getAllBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2); protected abstract List<BlockPos> getAllBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2);
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.Mth; import net.minecraft.util.math.MathHelper;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
@@ -11,7 +11,7 @@ import java.util.List;
public class Circle extends TwoClicksBuildMode { public class Circle extends TwoClicksBuildMode {
public static List<BlockPos> getCircleBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getCircleBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
float centerX = x1; float centerX = x1;
@@ -26,8 +26,8 @@ public class Circle extends TwoClicksBuildMode {
z1 = (int) (centerZ - (z2 - centerZ)); z1 = (int) (centerZ - (z2 - centerZ));
} }
float radiusX = Mth.abs(x2 - centerX); float radiusX = MathHelper.abs(x2 - centerX);
float radiusZ = Mth.abs(z2 - centerZ); float radiusZ = MathHelper.abs(z2 - centerZ);
if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL) if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL)
addCircleBlocks(list, x1, y1, z1, x2, y2, z2, centerX, centerZ, radiusX, radiusZ); addCircleBlocks(list, x1, y1, z1, x2, y2, z2, centerX, centerZ, radiusX, radiusZ);
@@ -66,24 +66,24 @@ public class Circle extends TwoClicksBuildMode {
} }
private static float distance(float x1, float z1, float x2, float z2) { private static float distance(float x1, float z1, float x2, float z2) {
return Mth.sqrt((x2 - x1) * (x2 - x1) + (z2 - z1) * (z2 - z1)); return MathHelper.sqrt((x2 - x1) * (x2 - x1) + (z2 - z1) * (z2 - z1));
} }
public static float calculateEllipseRadius(float centerX, float centerZ, float radiusX, float radiusZ, int x, int z) { public static float calculateEllipseRadius(float centerX, float centerZ, float radiusX, float radiusZ, int x, int z) {
//https://math.stackexchange.com/questions/432902/how-to-get-the-radius-of-an-ellipse-at-a-specific-angle-by-knowing-its-semi-majo //https://math.stackexchange.com/questions/432902/how-to-get-the-radius-of-an-ellipse-at-a-specific-angle-by-knowing-its-semi-majo
float theta = (float) Mth.atan2(z - centerZ, x - centerX); float theta = (float) MathHelper.atan2(z - centerZ, x - centerX);
float part1 = radiusX * radiusX * Mth.sin(theta) * Mth.sin(theta); float part1 = radiusX * radiusX * MathHelper.sin(theta) * MathHelper.sin(theta);
float part2 = radiusZ * radiusZ * Mth.cos(theta) * Mth.cos(theta); float part2 = radiusZ * radiusZ * MathHelper.cos(theta) * MathHelper.cos(theta);
return radiusX * radiusZ / Mth.sqrt(part1 + part2); return radiusX * radiusZ / MathHelper.sqrt(part1 + part2);
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getAllBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getAllBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return getCircleBlocks(player, x1, y1, z1, x2, y2, z2); return getCircleBlocks(player, x1, y1, z1, x2, y2, z2);
} }
} }

View File

@@ -1,31 +0,0 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import java.util.List;
public class Cone extends ThreeClicksBuildMode {
@Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace);
}
@Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace);
}
@Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2);
}
@Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
//TODO
return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
}
}

View File

@@ -1,7 +1,7 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
@@ -10,7 +10,7 @@ import java.util.List;
public class Cube extends ThreeClicksBuildMode { public class Cube extends ThreeClicksBuildMode {
public static List<BlockPos> getFloorBlocksUsingCubeFill(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getFloorBlocksUsingCubeFill(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (ModeOptions.getCubeFill() == ModeOptions.ActionEnum.CUBE_SKELETON) if (ModeOptions.getCubeFill() == ModeOptions.ActionEnum.CUBE_SKELETON)
@@ -21,7 +21,7 @@ public class Cube extends ThreeClicksBuildMode {
return list; return list;
} }
public static List<BlockPos> getCubeBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getCubeBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
switch (ModeOptions.getCubeFill()) { switch (ModeOptions.getCubeFill()) {
@@ -80,22 +80,22 @@ public class Cube extends ThreeClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { protected BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return getFloorBlocksUsingCubeFill(player, x1, y1, z1, x2, y2, z2); return getFloorBlocksUsingCubeFill(player, x1, y1, z1, x2, y2, z2);
} }
@Override @Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { protected List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
return getCubeBlocks(player, x1, y1, z1, x3, y3, z3); return getCubeBlocks(player, x1, y1, z1, x3, y3, z3);
} }
} }

View File

@@ -1,7 +1,7 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import java.util.ArrayList; import java.util.ArrayList;
@@ -9,7 +9,7 @@ import java.util.List;
public class Cylinder extends ThreeClicksBuildMode { public class Cylinder extends ThreeClicksBuildMode {
public static List<BlockPos> getCylinderBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public static List<BlockPos> getCylinderBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
//Get circle blocks (using CIRCLE_START and FILL options built-in) //Get circle blocks (using CIRCLE_START and FILL options built-in)
@@ -29,22 +29,22 @@ public class Cylinder extends ThreeClicksBuildMode {
} }
@Override @Override
public BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { public BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
public BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { public BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
public List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Circle.getCircleBlocks(player, x1, y1, z1, x2, y2, z2); return Circle.getCircleBlocks(player, x1, y1, z1, x2, y2, z2);
} }
@Override @Override
public List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
return getCylinderBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); return getCylinderBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
} }
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import java.util.ArrayList; import java.util.ArrayList;
@@ -11,15 +11,15 @@ import java.util.List;
public class DiagonalLine extends ThreeClicksBuildMode { public class DiagonalLine extends ThreeClicksBuildMode {
//Add diagonal line from first to second //Add diagonal line from first to second
public static List<BlockPos> getDiagonalLineBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, float sampleMultiplier) { public static List<BlockPos> getDiagonalLineBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, float sampleMultiplier) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
Vec3 first = new Vec3(x1, y1, z1).add(0.5, 0.5, 0.5); Vector3d first = new Vector3d(x1, y1, z1).add(0.5, 0.5, 0.5);
Vec3 second = new Vec3(x2, y2, z2).add(0.5, 0.5, 0.5); Vector3d second = new Vector3d(x2, y2, z2).add(0.5, 0.5, 0.5);
int iterations = (int) Math.ceil(first.distanceTo(second) * sampleMultiplier); int iterations = (int) Math.ceil(first.distanceTo(second) * sampleMultiplier);
for (double t = 0; t <= 1.0; t += 1.0 / iterations) { for (double t = 0; t <= 1.0; t += 1.0 / iterations) {
Vec3 lerp = first.add(second.subtract(first).scale(t)); Vector3d lerp = first.add(second.subtract(first).scale(t));
BlockPos candidate = new BlockPos(lerp); BlockPos candidate = new BlockPos(lerp);
//Only add if not equal to the last in the list //Only add if not equal to the last in the list
if (list.isEmpty() || !list.get(list.size() - 1).equals(candidate)) if (list.isEmpty() || !list.get(list.size() - 1).equals(candidate))
@@ -30,23 +30,23 @@ public class DiagonalLine extends ThreeClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { protected BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
//Add diagonal line from first to second //Add diagonal line from first to second
return getDiagonalLineBlocks(player, x1, y1, z1, x2, y2, z2, 10); return getDiagonalLineBlocks(player, x1, y1, z1, x2, y2, z2, 10);
} }
@Override @Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { protected List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
//Add diagonal line from first to third //Add diagonal line from first to third
return getDiagonalLineBlocks(player, x1, y1, z1, x3, y3, z3, 10); return getDiagonalLineBlocks(player, x1, y1, z1, x3, y3, z3, 10);
} }

View File

@@ -1,7 +1,7 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import java.util.ArrayList; import java.util.ArrayList;
@@ -10,7 +10,7 @@ import java.util.List;
public class DiagonalWall extends ThreeClicksBuildMode { public class DiagonalWall extends ThreeClicksBuildMode {
//Add diagonal wall from first to second //Add diagonal wall from first to second
public static List<BlockPos> getDiagonalWallBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public static List<BlockPos> getDiagonalWallBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
//Get diagonal line blocks //Get diagonal line blocks
@@ -30,22 +30,22 @@ public class DiagonalWall extends ThreeClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { protected BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return DiagonalLine.getDiagonalLineBlocks(player, x1, y1, z1, x2, y2, z2, 1); return DiagonalLine.getDiagonalLineBlocks(player, x1, y1, z1, x2, y2, z2, 1);
} }
@Override @Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { protected List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
return getDiagonalWallBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); return getDiagonalWallBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
} }
} }

View File

@@ -1,31 +0,0 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import java.util.List;
public class Dome extends ThreeClicksBuildMode {
@Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace);
}
@Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace);
}
@Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2);
}
@Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
//TODO
return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
}
}

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
@@ -13,14 +13,14 @@ import java.util.List;
public class Floor extends TwoClicksBuildMode { public class Floor extends TwoClicksBuildMode {
public static BlockPos findFloor(Player player, BlockPos firstPos, boolean skipRaytrace) { public static BlockPos findFloor(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
Vec3 look = BuildModes.getPlayerLookVec(player); Vector3d look = BuildModes.getPlayerLookVec(player);
Vec3 start = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); Vector3d start = new Vector3d(player.getX(), player.getY() + player.getEyeHeight(), player.getZ());
List<Criteria> criteriaList = new ArrayList<>(3); List<Criteria> criteriaList = new ArrayList<>(3);
//Y //Y
Vec3 yBound = BuildModes.findYBound(firstPos.getY(), start, look); Vector3d yBound = BuildModes.findYBound(firstPos.getY(), start, look);
criteriaList.add(new Criteria(yBound, start)); criteriaList.add(new Criteria(yBound, start));
//Remove invalid criteria //Remove invalid criteria
@@ -36,7 +36,7 @@ public class Floor extends TwoClicksBuildMode {
return new BlockPos(selected.planeBound); return new BlockPos(selected.planeBound);
} }
public static List<BlockPos> getFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getFloorBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL) if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL)
@@ -66,27 +66,27 @@ public class Floor extends TwoClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return findFloor(player, firstPos, skipRaytrace); return findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getAllBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getAllBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return getFloorBlocks(player, x1, y1, z1, x2, y2, z2); return getFloorBlocks(player, x1, y1, z1, x2, y2, z2);
} }
static class Criteria { static class Criteria {
Vec3 planeBound; Vector3d planeBound;
double distToPlayerSq; double distToPlayerSq;
Criteria(Vec3 planeBound, Vec3 start) { Criteria(Vector3d planeBound, Vector3d start) {
this.planeBound = planeBound; this.planeBound = planeBound;
this.distToPlayerSq = this.planeBound.subtract(start).lengthSqr(); this.distToPlayerSq = this.planeBound.subtract(start).lengthSqr();
} }
//check if its not behind the player and its not too close and not too far //check if its not behind the player and its not too close and not too far
//also check if raytrace from player to block does not intersect blocks //also check if raytrace from player to block does not intersect blocks
public boolean isValid(Vec3 start, Vec3 look, int reach, Player player, boolean skipRaytrace) { public boolean isValid(Vector3d start, Vector3d look, int reach, PlayerEntity player, boolean skipRaytrace) {
return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, planeBound, planeBound, distToPlayerSq); return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, planeBound, planeBound, distToPlayerSq);
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
@@ -12,22 +12,22 @@ import java.util.List;
public class Line extends TwoClicksBuildMode { public class Line extends TwoClicksBuildMode {
public static BlockPos findLine(Player player, BlockPos firstPos, boolean skipRaytrace) { public static BlockPos findLine(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
Vec3 look = BuildModes.getPlayerLookVec(player); Vector3d look = BuildModes.getPlayerLookVec(player);
Vec3 start = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); Vector3d start = new Vector3d(player.getX(), player.getY() + player.getEyeHeight(), player.getZ());
List<Criteria> criteriaList = new ArrayList<>(3); List<Criteria> criteriaList = new ArrayList<>(3);
//X //X
Vec3 xBound = BuildModes.findXBound(firstPos.getX(), start, look); Vector3d xBound = BuildModes.findXBound(firstPos.getX(), start, look);
criteriaList.add(new Criteria(xBound, firstPos, start)); criteriaList.add(new Criteria(xBound, firstPos, start));
//Y //Y
Vec3 yBound = BuildModes.findYBound(firstPos.getY(), start, look); Vector3d yBound = BuildModes.findYBound(firstPos.getY(), start, look);
criteriaList.add(new Criteria(yBound, firstPos, start)); criteriaList.add(new Criteria(yBound, firstPos, start));
//Z //Z
Vec3 zBound = BuildModes.findZBound(firstPos.getZ(), start, look); Vector3d zBound = BuildModes.findZBound(firstPos.getZ(), start, look);
criteriaList.add(new Criteria(zBound, firstPos, start)); criteriaList.add(new Criteria(zBound, firstPos, start));
//Remove invalid criteria //Remove invalid criteria
@@ -61,7 +61,7 @@ public class Line extends TwoClicksBuildMode {
return new BlockPos(selected.lineBound); return new BlockPos(selected.lineBound);
} }
public static List<BlockPos> getLineBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getLineBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (x1 != x2) { if (x1 != x2) {
@@ -94,22 +94,22 @@ public class Line extends TwoClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return findLine(player, firstPos, skipRaytrace); return findLine(player, firstPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getAllBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getAllBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return getLineBlocks(player, x1, y1, z1, x2, y2, z2); return getLineBlocks(player, x1, y1, z1, x2, y2, z2);
} }
static class Criteria { static class Criteria {
Vec3 planeBound; Vector3d planeBound;
Vec3 lineBound; Vector3d lineBound;
double distToLineSq; double distToLineSq;
double distToPlayerSq; double distToPlayerSq;
Criteria(Vec3 planeBound, BlockPos firstPos, Vec3 start) { Criteria(Vector3d planeBound, BlockPos firstPos, Vector3d start) {
this.planeBound = planeBound; this.planeBound = planeBound;
this.lineBound = toLongestLine(this.planeBound, firstPos); this.lineBound = toLongestLine(this.planeBound, firstPos);
this.distToLineSq = this.lineBound.subtract(this.planeBound).lengthSqr(); this.distToLineSq = this.lineBound.subtract(this.planeBound).lengthSqr();
@@ -118,27 +118,27 @@ public class Line extends TwoClicksBuildMode {
//Make it from a plane into a line //Make it from a plane into a line
//Select the axis that is longest //Select the axis that is longest
private Vec3 toLongestLine(Vec3 boundVec, BlockPos firstPos) { private Vector3d toLongestLine(Vector3d boundVec, BlockPos firstPos) {
BlockPos bound = new BlockPos(boundVec); BlockPos bound = new BlockPos(boundVec);
BlockPos firstToSecond = bound.subtract(firstPos); BlockPos firstToSecond = bound.subtract(firstPos);
firstToSecond = new BlockPos(Math.abs(firstToSecond.getX()), Math.abs(firstToSecond.getY()), Math.abs(firstToSecond.getZ())); firstToSecond = new BlockPos(Math.abs(firstToSecond.getX()), Math.abs(firstToSecond.getY()), Math.abs(firstToSecond.getZ()));
int longest = Math.max(firstToSecond.getX(), Math.max(firstToSecond.getY(), firstToSecond.getZ())); int longest = Math.max(firstToSecond.getX(), Math.max(firstToSecond.getY(), firstToSecond.getZ()));
if (longest == firstToSecond.getX()) { if (longest == firstToSecond.getX()) {
return new Vec3(bound.getX(), firstPos.getY(), firstPos.getZ()); return new Vector3d(bound.getX(), firstPos.getY(), firstPos.getZ());
} }
if (longest == firstToSecond.getY()) { if (longest == firstToSecond.getY()) {
return new Vec3(firstPos.getX(), bound.getY(), firstPos.getZ()); return new Vector3d(firstPos.getX(), bound.getY(), firstPos.getZ());
} }
if (longest == firstToSecond.getZ()) { if (longest == firstToSecond.getZ()) {
return new Vec3(firstPos.getX(), firstPos.getY(), bound.getZ()); return new Vector3d(firstPos.getX(), firstPos.getY(), bound.getZ());
} }
return null; return null;
} }
//check if its not behind the player and its not too close and not too far //check if its not behind the player and its not too close and not too far
//also check if raytrace from player to block does not intersect blocks //also check if raytrace from player to block does not intersect blocks
public boolean isValid(Vec3 start, Vec3 look, int reach, Player player, boolean skipRaytrace) { public boolean isValid(Vector3d start, Vector3d look, int reach, PlayerEntity player, boolean skipRaytrace) {
return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, lineBound, planeBound, distToPlayerSq); return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, lineBound, planeBound, distToPlayerSq);
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.IBuildMode; import nl.requios.effortlessbuilding.buildmode.IBuildMode;
import java.util.ArrayList; import java.util.ArrayList;
@@ -11,31 +11,31 @@ import java.util.List;
public class Normal implements IBuildMode { public class Normal implements IBuildMode {
@Override @Override
public void initialize(Player player) { public void initialize(PlayerEntity player) {
} }
@Override @Override
public List<BlockPos> onRightClick(Player player, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean skipRaytrace) { public List<BlockPos> onRightClick(PlayerEntity player, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (blockPos != null) list.add(blockPos); if (blockPos != null) list.add(blockPos);
return list; return list;
} }
@Override @Override
public List<BlockPos> findCoordinates(Player player, BlockPos blockPos, boolean skipRaytrace) { public List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (blockPos != null) list.add(blockPos); if (blockPos != null) list.add(blockPos);
return list; return list;
} }
@Override @Override
public Direction getSideHit(Player player) { public Direction getSideHit(PlayerEntity player) {
return null; return null;
} }
@Override @Override
public Vec3 getHitVec(Player player) { public Vector3d getHitVec(PlayerEntity player) {
return null; return null;
} }
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.IBuildMode; import nl.requios.effortlessbuilding.buildmode.IBuildMode;
import java.util.ArrayList; import java.util.ArrayList;
@@ -11,31 +11,31 @@ import java.util.List;
public class NormalPlus implements IBuildMode { public class NormalPlus implements IBuildMode {
@Override @Override
public void initialize(Player player) { public void initialize(PlayerEntity player) {
} }
@Override @Override
public List<BlockPos> onRightClick(Player player, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean skipRaytrace) { public List<BlockPos> onRightClick(PlayerEntity player, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (blockPos != null) list.add(blockPos); if (blockPos != null) list.add(blockPos);
return list; return list;
} }
@Override @Override
public List<BlockPos> findCoordinates(Player player, BlockPos blockPos, boolean skipRaytrace) { public List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos, boolean skipRaytrace) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (blockPos != null) list.add(blockPos); if (blockPos != null) list.add(blockPos);
return list; return list;
} }
@Override @Override
public Direction getSideHit(Player player) { public Direction getSideHit(PlayerEntity player) {
return null; return null;
} }
@Override @Override
public Vec3 getHitVec(Player player) { public Vector3d getHitVec(PlayerEntity player) {
return null; return null;
} }
} }

View File

@@ -1,34 +0,0 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import nl.requios.effortlessbuilding.helper.ReachHelper;
import java.util.ArrayList;
import java.util.List;
public class Pyramid extends ThreeClicksBuildMode {
@Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace);
}
@Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace);
}
@Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2);
}
@Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
//TODO
return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
}
}

View File

@@ -1,7 +1,7 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
@@ -12,7 +12,7 @@ import java.util.List;
public class SlopeFloor extends ThreeClicksBuildMode { public class SlopeFloor extends ThreeClicksBuildMode {
//Add slope floor from first to second //Add slope floor from first to second
public static List<BlockPos> getSlopeFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public static List<BlockPos> getSlopeFloorBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
int axisLimit = ReachHelper.getMaxBlocksPerAxis(player); int axisLimit = ReachHelper.getMaxBlocksPerAxis(player);
@@ -74,22 +74,22 @@ public class SlopeFloor extends ThreeClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { protected BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2); return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2);
} }
@Override @Override
protected List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { protected List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
return getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); return getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
} }
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.Mth; import net.minecraft.util.math.MathHelper;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
@@ -11,7 +11,7 @@ import java.util.List;
public class Sphere extends ThreeClicksBuildMode { public class Sphere extends ThreeClicksBuildMode {
public static List<BlockPos> getSphereBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public static List<BlockPos> getSphereBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
float centerX = x1; float centerX = x1;
@@ -29,9 +29,9 @@ public class Sphere extends ThreeClicksBuildMode {
z1 = (int) (centerZ - (z2 - centerZ)); z1 = (int) (centerZ - (z2 - centerZ));
} }
float radiusX = Mth.abs(x2 - centerX); float radiusX = MathHelper.abs(x2 - centerX);
float radiusY = Mth.abs(y3 - centerY); float radiusY = MathHelper.abs(y3 - centerY);
float radiusZ = Mth.abs(z2 - centerZ); float radiusZ = MathHelper.abs(z2 - centerZ);
if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL) if (ModeOptions.getFill() == ModeOptions.ActionEnum.FULL)
addSphereBlocks(list, x1, y1, z1, x3, y3, z3, centerX, centerY, centerZ, radiusX, radiusY, radiusZ); addSphereBlocks(list, x1, y1, z1, x3, y3, z3, centerX, centerY, centerZ, radiusX, radiusY, radiusZ);
@@ -76,7 +76,7 @@ public class Sphere extends ThreeClicksBuildMode {
} }
private static float distance(float x1, float y1, float z1, float x2, float y2, float z2) { private static float distance(float x1, float y1, float z1, float x2, float y2, float z2) {
return Mth.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)); return MathHelper.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));
} }
public static float calculateSpheroidRadius(float centerX, float centerY, float centerZ, float radiusX, float radiusY, float radiusZ, int x, int y, int z) { public static float calculateSpheroidRadius(float centerX, float centerY, float centerZ, float radiusX, float radiusY, float radiusZ, int x, int y, int z) {
@@ -89,22 +89,22 @@ public class Sphere extends ThreeClicksBuildMode {
} }
@Override @Override
public BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { public BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return Floor.findFloor(player, firstPos, skipRaytrace); return Floor.findFloor(player, firstPos, skipRaytrace);
} }
@Override @Override
public BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { public BlockPos findThirdPos(PlayerEntity player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) {
return findHeight(player, secondPos, skipRaytrace); return findHeight(player, secondPos, skipRaytrace);
} }
@Override @Override
public List<BlockPos> getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public List<BlockPos> getIntermediateBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return Circle.getCircleBlocks(player, x1, y1, z1, x2, y2, z2); return Circle.getCircleBlocks(player, x1, y1, z1, x2, y2, z2);
} }
@Override @Override
public List<BlockPos> getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public List<BlockPos> getFinalBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
return getSphereBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); return getSphereBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3);
} }
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
@@ -13,18 +13,18 @@ import java.util.List;
public class Wall extends TwoClicksBuildMode { public class Wall extends TwoClicksBuildMode {
public static BlockPos findWall(Player player, BlockPos firstPos, boolean skipRaytrace) { public static BlockPos findWall(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
Vec3 look = BuildModes.getPlayerLookVec(player); Vector3d look = BuildModes.getPlayerLookVec(player);
Vec3 start = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); Vector3d start = new Vector3d(player.getX(), player.getY() + player.getEyeHeight(), player.getZ());
List<Criteria> criteriaList = new ArrayList<>(3); List<Criteria> criteriaList = new ArrayList<>(3);
//X //X
Vec3 xBound = BuildModes.findXBound(firstPos.getX(), start, look); Vector3d xBound = BuildModes.findXBound(firstPos.getX(), start, look);
criteriaList.add(new Criteria(xBound, firstPos, start, look)); criteriaList.add(new Criteria(xBound, firstPos, start, look));
//Z //Z
Vec3 zBound = BuildModes.findZBound(firstPos.getZ(), start, look); Vector3d zBound = BuildModes.findZBound(firstPos.getZ(), start, look);
criteriaList.add(new Criteria(zBound, firstPos, start, look)); criteriaList.add(new Criteria(zBound, firstPos, start, look));
//Remove invalid criteria //Remove invalid criteria
@@ -51,7 +51,7 @@ public class Wall extends TwoClicksBuildMode {
return new BlockPos(selected.planeBound); return new BlockPos(selected.planeBound);
} }
public static List<BlockPos> getWallBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getWallBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
if (x1 == x2) { if (x1 == x2) {
@@ -104,30 +104,30 @@ public class Wall extends TwoClicksBuildMode {
} }
@Override @Override
protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { protected BlockPos findSecondPos(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) {
return findWall(player, firstPos, skipRaytrace); return findWall(player, firstPos, skipRaytrace);
} }
@Override @Override
protected List<BlockPos> getAllBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { protected List<BlockPos> getAllBlocks(PlayerEntity player, int x1, int y1, int z1, int x2, int y2, int z2) {
return getWallBlocks(player, x1, y1, z1, x2, y2, z2); return getWallBlocks(player, x1, y1, z1, x2, y2, z2);
} }
static class Criteria { static class Criteria {
Vec3 planeBound; Vector3d planeBound;
double distToPlayerSq; double distToPlayerSq;
double angle; double angle;
Criteria(Vec3 planeBound, BlockPos firstPos, Vec3 start, Vec3 look) { Criteria(Vector3d planeBound, BlockPos firstPos, Vector3d start, Vector3d look) {
this.planeBound = planeBound; this.planeBound = planeBound;
this.distToPlayerSq = this.planeBound.subtract(start).lengthSqr(); this.distToPlayerSq = this.planeBound.subtract(start).lengthSqr();
Vec3 wall = this.planeBound.subtract(Vec3.atLowerCornerOf(firstPos)); Vector3d wall = this.planeBound.subtract(Vector3d.atLowerCornerOf(firstPos));
this.angle = wall.x * look.x + wall.z * look.z; //dot product ignoring y (looking up/down should not affect this angle) this.angle = wall.x * look.x + wall.z * look.z; //dot product ignoring y (looking up/down should not affect this angle)
} }
//check if its not behind the player and its not too close and not too far //check if its not behind the player and its not too close and not too far
//also check if raytrace from player to block does not intersect blocks //also check if raytrace from player to block does not intersect blocks
public boolean isValid(Vec3 start, Vec3 look, int reach, Player player, boolean skipRaytrace) { public boolean isValid(Vector3d start, Vector3d look, int reach, PlayerEntity player, boolean skipRaytrace) {
return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, planeBound, planeBound, distToPlayerSq); return BuildModes.isCriteriaValid(start, look, reach, player, skipRaytrace, planeBound, planeBound, distToPlayerSq);
} }

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Hand;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.core.Vec3i; import net.minecraft.util.math.vector.Vector3i;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
@@ -16,7 +16,7 @@ import java.util.List;
public class Array { public class Array {
public static List<BlockPos> findCoordinates(Player player, BlockPos startPos) { public static List<BlockPos> findCoordinates(PlayerEntity player, BlockPos startPos) {
List<BlockPos> coordinates = new ArrayList<>(); List<BlockPos> coordinates = new ArrayList<>();
//find arraysettings for the player //find arraysettings for the player
@@ -24,7 +24,7 @@ public class Array {
if (!isEnabled(a)) return coordinates; if (!isEnabled(a)) return coordinates;
BlockPos pos = startPos; BlockPos pos = startPos;
Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); Vector3i offset = new Vector3i(a.offset.getX(), a.offset.getY(), a.offset.getZ());
for (int i = 0; i < a.count; i++) { for (int i = 0; i < a.count; i++) {
pos = pos.offset(offset); pos = pos.offset(offset);
@@ -34,7 +34,7 @@ public class Array {
return coordinates; return coordinates;
} }
public static List<BlockState> findBlockStates(Player player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) { public static List<BlockState> findBlockStates(PlayerEntity player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) {
List<BlockState> blockStates = new ArrayList<>(); List<BlockState> blockStates = new ArrayList<>();
//find arraysettings for the player that placed the block //find arraysettings for the player that placed the block
@@ -42,13 +42,13 @@ public class Array {
if (!isEnabled(a)) return blockStates; if (!isEnabled(a)) return blockStates;
BlockPos pos = startPos; BlockPos pos = startPos;
Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); Vector3i offset = new Vector3i(a.offset.getX(), a.offset.getY(), a.offset.getZ());
//Randomizer bag synergy //Randomizer bag synergy
AbstractRandomizerBagItem randomizerBagItem = null; AbstractRandomizerBagItem randomizerBagItem = null;
IItemHandler bagInventory = null; IItemHandler bagInventory = null;
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem();
bagInventory = randomizerBagItem.getBagInventory(itemStack); bagInventory = randomizerBagItem.getBagInventory(itemStack);
} }
@@ -59,7 +59,7 @@ public class Array {
if (randomizerBagItem != null) { if (randomizerBagItem != null) {
itemStack = randomizerBagItem.pickRandomStack(bagInventory); itemStack = randomizerBagItem.pickRandomStack(bagInventory);
blockState = BuildModifiers blockState = BuildModifiers
.getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND); .getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vector3d(0, 0, 0), Hand.MAIN_HAND);
} }
//blockState = blockState.getBlock().getStateForPlacement(player.world, pos, ) //blockState = blockState.getBlock().getStateForPlacement(player.world, pos, )

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import java.util.List; import java.util.List;
@@ -10,11 +10,11 @@ public class BlockSet {
private final List<BlockPos> coordinates; private final List<BlockPos> coordinates;
private final List<BlockState> previousBlockStates; private final List<BlockState> previousBlockStates;
private final List<BlockState> newBlockStates; private final List<BlockState> newBlockStates;
private final Vec3 hitVec; private final Vector3d hitVec;
private final BlockPos firstPos; private final BlockPos firstPos;
private final BlockPos secondPos; private final BlockPos secondPos;
public BlockSet(List<BlockPos> coordinates, List<BlockState> previousBlockStates, List<BlockState> newBlockStates, Vec3 hitVec, public BlockSet(List<BlockPos> coordinates, List<BlockState> previousBlockStates, List<BlockState> newBlockStates, Vector3d hitVec,
BlockPos firstPos, BlockPos secondPos) { BlockPos firstPos, BlockPos secondPos) {
this.coordinates = coordinates; this.coordinates = coordinates;
this.previousBlockStates = previousBlockStates; this.previousBlockStates = previousBlockStates;
@@ -36,7 +36,7 @@ public class BlockSet {
return newBlockStates; return newBlockStates;
} }
public Vec3 getHitVec() { public Vector3d getHitVec() {
return hitVec; return hitVec;
} }

View File

@@ -1,19 +1,19 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.level.block.Block; import net.minecraft.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.level.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Hand;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.level.Level; import net.minecraft.world.World;
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.helper.InventoryHelper; import nl.requios.effortlessbuilding.helper.InventoryHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper;
@@ -27,12 +27,12 @@ import java.util.List;
public class BuildModifiers { public class BuildModifiers {
//Called from BuildModes //Called from BuildModes
public static void onBlockPlaced(Player player, List<BlockPos> startCoordinates, Direction sideHit, Vec3 hitVec, boolean placeStartPos) { public static void onBlockPlaced(PlayerEntity player, List<BlockPos> startCoordinates, Direction sideHit, Vector3d hitVec, boolean placeStartPos) {
Level world = player.level; World world = player.level;
AbstractRandomizerBagItem.renewRandomness(); AbstractRandomizerBagItem.renewRandomness();
//Format hitvec to 0.x //Format hitvec to 0.x
hitVec = new Vec3(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z))); hitVec = new Vector3d(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z)));
//find coordinates and blockstates //find coordinates and blockstates
List<BlockPos> coordinates = findCoordinates(player, startCoordinates); List<BlockPos> coordinates = findCoordinates(player, startCoordinates);
@@ -94,8 +94,8 @@ public class BuildModifiers {
} }
} }
public static void onBlockBroken(Player player, List<BlockPos> startCoordinates, boolean breakStartPos) { public static void onBlockBroken(PlayerEntity player, List<BlockPos> startCoordinates, boolean breakStartPos) {
Level world = player.level; World world = player.level;
List<BlockPos> coordinates = findCoordinates(player, startCoordinates); List<BlockPos> coordinates = findCoordinates(player, startCoordinates);
@@ -145,12 +145,12 @@ public class BuildModifiers {
//add to undo stack //add to undo stack
BlockPos firstPos = startCoordinates.get(0); BlockPos firstPos = startCoordinates.get(0);
BlockPos secondPos = startCoordinates.get(startCoordinates.size() - 1); BlockPos secondPos = startCoordinates.get(startCoordinates.size() - 1);
Vec3 hitVec = new Vec3(0.5, 0.5, 0.5); Vector3d hitVec = new Vector3d(0.5, 0.5, 0.5);
UndoRedo.addUndo(player, new BlockSet(coordinates, previousBlockStates, newBlockStates, hitVec, firstPos, secondPos)); UndoRedo.addUndo(player, new BlockSet(coordinates, previousBlockStates, newBlockStates, hitVec, firstPos, secondPos));
} }
public static List<BlockPos> findCoordinates(Player player, List<BlockPos> posList) { public static List<BlockPos> findCoordinates(PlayerEntity player, List<BlockPos> posList) {
List<BlockPos> coordinates = new ArrayList<>(); List<BlockPos> coordinates = new ArrayList<>();
//Add current blocks being placed too //Add current blocks being placed too
coordinates.addAll(posList); coordinates.addAll(posList);
@@ -171,18 +171,18 @@ public class BuildModifiers {
return coordinates; return coordinates;
} }
public static List<BlockPos> findCoordinates(Player player, BlockPos blockPos) { public static List<BlockPos> findCoordinates(PlayerEntity player, BlockPos blockPos) {
return findCoordinates(player, new ArrayList<>(Collections.singletonList(blockPos))); return findCoordinates(player, new ArrayList<>(Collections.singletonList(blockPos)));
} }
public static List<BlockState> findBlockStates(Player player, List<BlockPos> posList, Vec3 hitVec, Direction facing, List<ItemStack> itemStacks) { public static List<BlockState> findBlockStates(PlayerEntity player, List<BlockPos> posList, Vector3d hitVec, Direction facing, List<ItemStack> itemStacks) {
List<BlockState> blockStates = new ArrayList<>(); List<BlockState> blockStates = new ArrayList<>();
itemStacks.clear(); itemStacks.clear();
//Get itemstack //Get itemstack
ItemStack itemStack = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack itemStack = player.getItemInHand(Hand.MAIN_HAND);
if (itemStack.isEmpty() || !CompatHelper.isItemBlockProxy(itemStack)) { if (itemStack.isEmpty() || !CompatHelper.isItemBlockProxy(itemStack)) {
itemStack = player.getItemInHand(InteractionHand.OFF_HAND); itemStack = player.getItemInHand(Hand.OFF_HAND);
} }
if (itemStack.isEmpty() || !CompatHelper.isItemBlockProxy(itemStack)) { if (itemStack.isEmpty() || !CompatHelper.isItemBlockProxy(itemStack)) {
return blockStates; return blockStates;
@@ -197,16 +197,13 @@ public class BuildModifiers {
//Add blocks in posList first //Add blocks in posList first
for (BlockPos blockPos : posList) { for (BlockPos blockPos : posList) {
if (!(itemStack.getItem() instanceof BlockItem)) itemBlock = CompatHelper.getItemBlockFromStack(itemStack); if (!(itemStack.getItem() instanceof BlockItem)) itemBlock = CompatHelper.getItemBlockFromStack(itemStack);
BlockState blockState = getBlockStateFromItem(itemBlock, player, blockPos, facing, hitVec, InteractionHand.MAIN_HAND); BlockState blockState = getBlockStateFromItem(itemBlock, player, blockPos, facing, hitVec, Hand.MAIN_HAND);
if (blockState == null) continue;
blockStates.add(blockState); blockStates.add(blockState);
itemStacks.add(itemBlock); itemStacks.add(itemBlock);
} }
for (BlockPos blockPos : posList) { for (BlockPos blockPos : posList) {
BlockState blockState = getBlockStateFromItem(itemBlock, player, blockPos, facing, hitVec, InteractionHand.MAIN_HAND); BlockState blockState = getBlockStateFromItem(itemBlock, player, blockPos, facing, hitVec, Hand.MAIN_HAND);
if (blockState == null) continue;
List<BlockState> arrayBlockStates = Array.findBlockStates(player, blockPos, blockState, itemStack, itemStacks); List<BlockState> arrayBlockStates = Array.findBlockStates(player, blockPos, blockState, itemStack, itemStacks);
blockStates.addAll(arrayBlockStates); blockStates.addAll(arrayBlockStates);
@@ -217,8 +214,6 @@ public class BuildModifiers {
for (int i = 0; i < arrayCoordinates.size(); i++) { for (int i = 0; i < arrayCoordinates.size(); i++) {
BlockPos coordinate = arrayCoordinates.get(i); BlockPos coordinate = arrayCoordinates.get(i);
BlockState blockState1 = arrayBlockStates.get(i); BlockState blockState1 = arrayBlockStates.get(i);
if (blockState1 == null) continue;
blockStates.addAll(Mirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks)); blockStates.addAll(Mirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks));
blockStates.addAll(RadialMirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks)); blockStates.addAll(RadialMirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks));
} }
@@ -243,8 +238,8 @@ public class BuildModifiers {
modifierSettings.doQuickReplace(); modifierSettings.doQuickReplace();
} }
public static BlockState getBlockStateFromItem(ItemStack itemStack, Player player, BlockPos blockPos, Direction facing, Vec3 hitVec, InteractionHand hand) { public static BlockState getBlockStateFromItem(ItemStack itemStack, PlayerEntity player, BlockPos blockPos, Direction facing, Vector3d hitVec, Hand hand) {
return Block.byItem(itemStack.getItem()).getStateForPlacement(new BlockPlaceContext(new UseOnContext(player, hand, new BlockHitResult(hitVec, facing, blockPos, false)))); return Block.byItem(itemStack.getItem()).getStateForPlacement(new BlockItemUseContext(new ItemUseContext(player, hand, new BlockRayTraceResult(hitVec, facing, blockPos, false))));
} }
//Returns true if equal (or both null) //Returns true if equal (or both null)

View File

@@ -1,28 +1,23 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.entity.player.Player; import net.minecraft.block.*;
import net.minecraft.world.item.ItemStack; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.level.block.state.properties.Half; import net.minecraft.item.ItemStack;
import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.state.properties.Half;
import net.minecraft.core.Direction; import net.minecraft.state.properties.SlabType;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.Hand;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.world.level.block.DirectionalBlock;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.level.block.SlabBlock;
import net.minecraft.world.level.block.StairBlock;
import net.minecraft.world.level.block.state.BlockState;
public class Mirror { public class Mirror {
public static List<BlockPos> findCoordinates(Player player, BlockPos startPos) { public static List<BlockPos> findCoordinates(PlayerEntity player, BlockPos startPos) {
List<BlockPos> coordinates = new ArrayList<>(); List<BlockPos> coordinates = new ArrayList<>();
//find mirrorsettings for the player //find mirrorsettings for the player
@@ -62,7 +57,7 @@ public class Mirror {
coordinates.add(newBlockPos); coordinates.add(newBlockPos);
} }
public static List<BlockState> findBlockStates(Player player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) { public static List<BlockState> findBlockStates(PlayerEntity player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) {
List<BlockState> blockStates = new ArrayList<>(); List<BlockState> blockStates = new ArrayList<>();
//find mirrorsettings for the player //find mirrorsettings for the player
@@ -73,22 +68,22 @@ public class Mirror {
AbstractRandomizerBagItem randomizerBagItem = null; AbstractRandomizerBagItem randomizerBagItem = null;
IItemHandler bagInventory = null; IItemHandler bagInventory = null;
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem();
bagInventory = randomizerBagItem.getBagInventory(itemStack); bagInventory = randomizerBagItem.getBagInventory(itemStack);
} }
if (m.mirrorX) if (m.mirrorX)
blockStateMirrorX(player, m, startPos, blockState, bagInventory, itemStack, InteractionHand.MAIN_HAND, blockStates, itemStacks); blockStateMirrorX(player, m, startPos, blockState, bagInventory, itemStack, Hand.MAIN_HAND, blockStates, itemStacks);
if (m.mirrorY) if (m.mirrorY)
blockStateMirrorY(player, m, startPos, blockState, bagInventory, itemStack, InteractionHand.MAIN_HAND, blockStates, itemStacks); blockStateMirrorY(player, m, startPos, blockState, bagInventory, itemStack, Hand.MAIN_HAND, blockStates, itemStacks);
if (m.mirrorZ) if (m.mirrorZ)
blockStateMirrorZ(player, m, startPos, blockState, bagInventory, itemStack, InteractionHand.MAIN_HAND, blockStates, itemStacks); blockStateMirrorZ(player, m, startPos, blockState, bagInventory, itemStack, Hand.MAIN_HAND, blockStates, itemStacks);
return blockStates; return blockStates;
} }
private static void blockStateMirrorX(Player player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState, private static void blockStateMirrorX(PlayerEntity player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState,
IItemHandler bagInventory, ItemStack itemStack, InteractionHand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) { IItemHandler bagInventory, ItemStack itemStack, Hand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) {
//find mirror position //find mirror position
double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5);
BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ());
@@ -96,11 +91,11 @@ public class Mirror {
//Randomizer bag synergy //Randomizer bag synergy
if (bagInventory != null) { if (bagInventory != null) {
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vector3d(0, 0, 0), hand);
} }
//Find blockstate //Find blockstate
BlockState newBlockState = oldBlockState == null ? null : oldBlockState.mirror(net.minecraft.world.level.block.Mirror.FRONT_BACK); BlockState newBlockState = oldBlockState == null ? null : oldBlockState.mirror(net.minecraft.util.Mirror.FRONT_BACK);
//Store blockstate and itemstack //Store blockstate and itemstack
blockStates.add(newBlockState); blockStates.add(newBlockState);
@@ -112,8 +107,8 @@ public class Mirror {
blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks); blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks);
} }
private static void blockStateMirrorY(Player player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState, private static void blockStateMirrorY(PlayerEntity player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState,
IItemHandler bagInventory, ItemStack itemStack, InteractionHand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) { IItemHandler bagInventory, ItemStack itemStack, Hand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) {
//find mirror position //find mirror position
double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5);
BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ());
@@ -121,7 +116,7 @@ public class Mirror {
//Randomizer bag synergy //Randomizer bag synergy
if (bagInventory != null) { if (bagInventory != null) {
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vector3d(0, 0, 0), hand);
} }
//Find blockstate //Find blockstate
@@ -135,8 +130,8 @@ public class Mirror {
blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks); blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks);
} }
private static void blockStateMirrorZ(Player player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState, private static void blockStateMirrorZ(PlayerEntity player, MirrorSettings m, BlockPos oldBlockPos, BlockState oldBlockState,
IItemHandler bagInventory, ItemStack itemStack, InteractionHand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) { IItemHandler bagInventory, ItemStack itemStack, Hand hand, List<BlockState> blockStates, List<ItemStack> itemStacks) {
//find mirror position //find mirror position
double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5);
BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z);
@@ -144,11 +139,11 @@ public class Mirror {
//Randomizer bag synergy //Randomizer bag synergy
if (bagInventory != null) { if (bagInventory != null) {
itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory); itemStack = ((AbstractRandomizerBagItem)itemStack.getItem()).pickRandomStack(bagInventory);
oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vec3(0, 0, 0), hand); oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, Direction.UP, new Vector3d(0, 0, 0), hand);
} }
//Find blockstate //Find blockstate
BlockState newBlockState = oldBlockState == null ? null : oldBlockState.mirror(net.minecraft.world.level.block.Mirror.LEFT_RIGHT); BlockState newBlockState = oldBlockState == null ? null : oldBlockState.mirror(net.minecraft.util.Mirror.LEFT_RIGHT);
//Store blockstate and itemstack //Store blockstate and itemstack
blockStates.add(newBlockState); blockStates.add(newBlockState);
@@ -166,11 +161,11 @@ public class Mirror {
private static BlockState getVerticalMirror(BlockState blockState) { private static BlockState getVerticalMirror(BlockState blockState) {
//Stairs //Stairs
if (blockState.getBlock() instanceof StairBlock) { if (blockState.getBlock() instanceof StairsBlock) {
if (blockState.getValue(StairBlock.HALF) == Half.BOTTOM) { if (blockState.getValue(StairsBlock.HALF) == Half.BOTTOM) {
return blockState.setValue(StairBlock.HALF, Half.TOP); return blockState.setValue(StairsBlock.HALF, Half.TOP);
} else { } else {
return blockState.setValue(StairBlock.HALF, Half.BOTTOM); return blockState.setValue(StairsBlock.HALF, Half.BOTTOM);
} }
} }
@@ -208,7 +203,7 @@ public class Mirror {
public static class MirrorSettings { public static class MirrorSettings {
public boolean enabled = false; public boolean enabled = false;
public Vec3 position = new Vec3(0.5, 64.5, 0.5); public Vector3d position = new Vector3d(0.5, 64.5, 0.5);
public boolean mirrorX = true, mirrorY = false, mirrorZ = false; public boolean mirrorX = true, mirrorY = false, mirrorZ = false;
public int radius = 10; public int radius = 10;
public boolean drawLines = true, drawPlanes = true; public boolean drawLines = true, drawPlanes = true;
@@ -216,7 +211,7 @@ public class Mirror {
public MirrorSettings() { public MirrorSettings() {
} }
public MirrorSettings(boolean mirrorEnabled, Vec3 position, boolean mirrorX, boolean mirrorY, boolean mirrorZ, int radius, boolean drawLines, boolean drawPlanes) { public MirrorSettings(boolean mirrorEnabled, Vector3d position, boolean mirrorX, boolean mirrorY, boolean mirrorZ, int radius, boolean drawLines, boolean drawPlanes) {
this.enabled = mirrorEnabled; this.enabled = mirrorEnabled;
this.position = position; this.position = position;
this.mirrorX = mirrorX; this.mirrorX = mirrorX;

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager;
@@ -20,32 +20,32 @@ public class ModifierSettingsManager {
//Retrieves the buildsettings of a player through the modifierCapability capability //Retrieves the buildsettings of a player through the modifierCapability capability
//Never returns null //Never returns null
@Nonnull @Nonnull
public static ModifierSettings getModifierSettings(Player player) { public static ModifierSettings getModifierSettings(PlayerEntity player) {
LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability = LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability =
player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null); player.getCapability(ModifierCapabilityManager.modifierCapability, null);
if (modifierCapability.isPresent()) { if (modifierCapability.isPresent()) {
ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null); ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null);
if (capability.getModifierData() == null){ if (capability.getModifierData() == null) {
capability.setModifierData(new ModifierSettings()); capability.setModifierData(new ModifierSettings());
} }
return capability.getModifierData(); return capability.getModifierData();
} }
// EffortlessBuilding.logger.warn("Player does not have modifierCapability: " + player); //Player does not have modifierCapability capability
//Return dummy settings //Return dummy settings
return new ModifierSettings(); return new ModifierSettings();
// throw new IllegalArgumentException("Player does not have modifierCapability capability");
} }
public static void setModifierSettings(Player player, ModifierSettings modifierSettings) { public static void setModifierSettings(PlayerEntity player, ModifierSettings modifierSettings) {
if (player == null) { if (player == null) {
EffortlessBuilding.log("Cannot set buildsettings, player is null"); EffortlessBuilding.log("Cannot set buildsettings, player is null");
return; return;
} }
LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability = LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability =
player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null); player.getCapability(ModifierCapabilityManager.modifierCapability, null);
modifierCapability.ifPresent((capability) -> { modifierCapability.ifPresent((capability) -> {
capability.setModifierData(modifierSettings); capability.setModifierData(modifierSettings);
@@ -56,7 +56,7 @@ public class ModifierSettingsManager {
} }
} }
public static String sanitize(ModifierSettings modifierSettings, Player player) { public static String sanitize(ModifierSettings modifierSettings, PlayerEntity player) {
int maxReach = ReachHelper.getMaxReach(player); int maxReach = ReachHelper.getMaxReach(player);
String error = ""; String error = "";
@@ -110,7 +110,7 @@ public class ModifierSettingsManager {
return error; return error;
} }
public static void handleNewPlayer(Player player) { public static void handleNewPlayer(PlayerEntity player) {
//Makes sure player has modifier settings (if it doesnt it will create it) //Makes sure player has modifier settings (if it doesnt it will create it)
getModifierSettings(player); getModifierSettings(player);
@@ -118,7 +118,7 @@ public class ModifierSettingsManager {
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
//Send to client //Send to client
ModifierSettingsMessage msg = new ModifierSettingsMessage(getModifierSettings(player)); ModifierSettingsMessage msg = new ModifierSettingsMessage(getModifierSettings(player));
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), msg); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), msg);
} }
} }

View File

@@ -1,15 +1,15 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Hand;
import net.minecraft.world.level.block.Mirror; import net.minecraft.util.Mirror;
import net.minecraft.world.level.block.Rotation; import net.minecraft.util.Rotation;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.Mth; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
@@ -18,7 +18,7 @@ import java.util.List;
public class RadialMirror { public class RadialMirror {
public static List<BlockPos> findCoordinates(Player player, BlockPos startPos) { public static List<BlockPos> findCoordinates(PlayerEntity player, BlockPos startPos) {
List<BlockPos> coordinates = new ArrayList<>(); List<BlockPos> coordinates = new ArrayList<>();
//find radial mirror settings for the player //find radial mirror settings for the player
@@ -28,10 +28,10 @@ public class RadialMirror {
//get angle between slices //get angle between slices
double sliceAngle = 2 * Math.PI / r.slices; double sliceAngle = 2 * Math.PI / r.slices;
Vec3 startVec = new Vec3(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f); Vector3d startVec = new Vector3d(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f);
Vec3 relStartVec = startVec.subtract(r.position); Vector3d relStartVec = startVec.subtract(r.position);
double startAngleToCenter = Mth.atan2(relStartVec.x, relStartVec.z); double startAngleToCenter = MathHelper.atan2(relStartVec.x, relStartVec.z);
if (startAngleToCenter < 0) startAngleToCenter += Math.PI; if (startAngleToCenter < 0) startAngleToCenter += Math.PI;
double startAngleInSlice = startAngleToCenter % sliceAngle; double startAngleInSlice = startAngleToCenter % sliceAngle;
@@ -43,7 +43,7 @@ public class RadialMirror {
curAngle = curAngle - startAngleInSlice + (sliceAngle - startAngleInSlice); curAngle = curAngle - startAngleInSlice + (sliceAngle - startAngleInSlice);
} }
Vec3 relNewVec = relStartVec.yRot((float) curAngle); Vector3d relNewVec = relStartVec.yRot((float) curAngle);
BlockPos newBlockPos = new BlockPos(r.position.add(relNewVec)); BlockPos newBlockPos = new BlockPos(r.position.add(relNewVec));
if (!coordinates.contains(newBlockPos) && !newBlockPos.equals(startPos)) coordinates.add(newBlockPos); if (!coordinates.contains(newBlockPos) && !newBlockPos.equals(startPos)) coordinates.add(newBlockPos);
} }
@@ -51,7 +51,7 @@ public class RadialMirror {
return coordinates; return coordinates;
} }
public static List<BlockState> findBlockStates(Player player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) { public static List<BlockState> findBlockStates(PlayerEntity player, BlockPos startPos, BlockState blockState, ItemStack itemStack, List<ItemStack> itemStacks) {
List<BlockState> blockStates = new ArrayList<>(); List<BlockState> blockStates = new ArrayList<>();
List<BlockPos> coordinates = new ArrayList<>(); //to keep track of duplicates List<BlockPos> coordinates = new ArrayList<>(); //to keep track of duplicates
@@ -63,21 +63,21 @@ public class RadialMirror {
//get angle between slices //get angle between slices
double sliceAngle = 2 * Math.PI / r.slices; double sliceAngle = 2 * Math.PI / r.slices;
Vec3 startVec = new Vec3(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f); Vector3d startVec = new Vector3d(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f);
Vec3 relStartVec = startVec.subtract(r.position); Vector3d relStartVec = startVec.subtract(r.position);
double startAngleToCenter = Mth.atan2(relStartVec.x, relStartVec.z); double startAngleToCenter = MathHelper.atan2(relStartVec.x, relStartVec.z);
double startAngleToCenterMod = startAngleToCenter < 0 ? startAngleToCenter + Math.PI : startAngleToCenter; double startAngleToCenterMod = startAngleToCenter < 0 ? startAngleToCenter + Math.PI : startAngleToCenter;
double startAngleInSlice = startAngleToCenterMod % sliceAngle; double startAngleInSlice = startAngleToCenterMod % sliceAngle;
//Rotate the original blockstate //Rotate the original blockstate
blockState = rotateOriginalBlockState(player, startPos, startAngleToCenter, blockState); blockState = rotateOriginalBlockState(startAngleToCenter, blockState);
//Randomizer bag synergy //Randomizer bag synergy
AbstractRandomizerBagItem randomizerBagItem = null; AbstractRandomizerBagItem randomizerBagItem = null;
IItemHandler bagInventory = null; IItemHandler bagInventory = null;
if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) { if (!itemStack.isEmpty() && itemStack.getItem() instanceof AbstractRandomizerBagItem) {
randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem() ; randomizerBagItem = (AbstractRandomizerBagItem) itemStack.getItem();
bagInventory = randomizerBagItem.getBagInventory(itemStack); bagInventory = randomizerBagItem.getBagInventory(itemStack);
} }
@@ -91,22 +91,22 @@ public class RadialMirror {
curAngle = curAngle - startAngleInSlice + (sliceAngle - startAngleInSlice); curAngle = curAngle - startAngleInSlice + (sliceAngle - startAngleInSlice);
} }
Vec3 relNewVec = relStartVec.yRot((float) curAngle); Vector3d relNewVec = relStartVec.yRot((float) curAngle);
BlockPos newBlockPos = new BlockPos(r.position.add(relNewVec)); BlockPos newBlockPos = new BlockPos(r.position.add(relNewVec));
if (coordinates.contains(newBlockPos) || newBlockPos.equals(startPos)) continue; //filter out duplicates if (coordinates.contains(newBlockPos) || newBlockPos.equals(startPos)) continue; //filter out duplicates
coordinates.add(newBlockPos); coordinates.add(newBlockPos);
//Randomizer bag synergy //Randomizer bag synergy
if (randomizerBagItem != null) { if (bagInventory != null) {
itemStack = randomizerBagItem.pickRandomStack(bagInventory); itemStack = randomizerBagItem.pickRandomStack(bagInventory);
newBlockState = BuildModifiers newBlockState = BuildModifiers
.getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vec3(0, 0, 0), InteractionHand.MAIN_HAND); .getBlockStateFromItem(itemStack, player, startPos, Direction.UP, new Vector3d(0, 0, 0), Hand.MAIN_HAND);
newBlockState = rotateOriginalBlockState(player, startPos, startAngleToCenter, newBlockState); newBlockState = rotateOriginalBlockState(startAngleToCenter, newBlockState);
} }
//rotate //rotate
newBlockState = rotateBlockState(player, startPos, relNewVec, newBlockState, r.alternate && i % 2 == 1); newBlockState = rotateBlockState(relNewVec, newBlockState, r.alternate && i % 2 == 1);
blockStates.add(newBlockState); blockStates.add(newBlockState);
itemStacks.add(itemStack); itemStacks.add(itemStack);
@@ -115,36 +115,36 @@ public class RadialMirror {
return blockStates; return blockStates;
} }
private static BlockState rotateOriginalBlockState(Player player, BlockPos startPos, double startAngleToCenter, BlockState blockState) { private static BlockState rotateOriginalBlockState(double startAngleToCenter, BlockState blockState) {
BlockState newBlockState = blockState; BlockState newBlockState = blockState;
if (startAngleToCenter < -0.751 * Math.PI || startAngleToCenter > 0.749 * Math.PI) { if (startAngleToCenter < -0.751 * Math.PI || startAngleToCenter > 0.749 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_180); newBlockState = blockState.rotate(Rotation.CLOCKWISE_180);
} else if (startAngleToCenter < -0.251 * Math.PI) { } else if (startAngleToCenter < -0.251 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.COUNTERCLOCKWISE_90); newBlockState = blockState.rotate(Rotation.COUNTERCLOCKWISE_90);
} else if (startAngleToCenter > 0.249 * Math.PI) { } else if (startAngleToCenter > 0.249 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_90); newBlockState = blockState.rotate(Rotation.CLOCKWISE_90);
} }
return newBlockState; return newBlockState;
} }
private static BlockState rotateBlockState(Player player, BlockPos startPos, Vec3 relVec, BlockState blockState, boolean alternate) { private static BlockState rotateBlockState(Vector3d relVec, BlockState blockState, boolean alternate) {
BlockState newBlockState; BlockState newBlockState;
double angleToCenter = Mth.atan2(relVec.x, relVec.z); //between -PI and PI double angleToCenter = MathHelper.atan2(relVec.x, relVec.z); //between -PI and PI
if (angleToCenter < -0.751 * Math.PI || angleToCenter > 0.749 * Math.PI) { if (angleToCenter < -0.751 * Math.PI || angleToCenter > 0.749 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_180); newBlockState = blockState.rotate(Rotation.CLOCKWISE_180);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.FRONT_BACK); newBlockState = newBlockState.mirror(Mirror.FRONT_BACK);
} }
} else if (angleToCenter < -0.251 * Math.PI) { } else if (angleToCenter < -0.251 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_90); newBlockState = blockState.rotate(Rotation.CLOCKWISE_90);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT);
} }
} else if (angleToCenter > 0.249 * Math.PI) { } else if (angleToCenter > 0.249 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.COUNTERCLOCKWISE_90); newBlockState = blockState.rotate(Rotation.COUNTERCLOCKWISE_90);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT);
} }
@@ -161,13 +161,13 @@ public class RadialMirror {
public static boolean isEnabled(RadialMirrorSettings r, BlockPos startPos) { public static boolean isEnabled(RadialMirrorSettings r, BlockPos startPos) {
if (r == null || !r.enabled) return false; if (r == null || !r.enabled) return false;
return !(new Vec3(startPos.getX() + 0.5, startPos.getY() + 0.5, startPos.getZ() + 0.5).subtract(r.position).lengthSqr() > return !(new Vector3d(startPos.getX() + 0.5, startPos.getY() + 0.5, startPos.getZ() + 0.5).subtract(r.position).lengthSqr() >
r.radius * r.radius); r.radius * r.radius);
} }
public static class RadialMirrorSettings { public static class RadialMirrorSettings {
public boolean enabled = false; public boolean enabled = false;
public Vec3 position = new Vec3(0.5, 64.5, 0.5); public Vector3d position = new Vector3d(0.5, 64.5, 0.5);
public int slices = 4; public int slices = 4;
public boolean alternate = false; public boolean alternate = false;
public int radius = 20; public int radius = 20;
@@ -176,7 +176,7 @@ public class RadialMirror {
public RadialMirrorSettings() { public RadialMirrorSettings() {
} }
public RadialMirrorSettings(boolean enabled, Vec3 position, int slices, boolean alternate, int radius, boolean drawLines, boolean drawPlanes) { public RadialMirrorSettings(boolean enabled, Vector3d position, int slices, boolean alternate, int radius, boolean drawLines, boolean drawPlanes) {
this.enabled = enabled; this.enabled = enabled;
this.position = position; this.position = position;
this.slices = slices; this.slices = slices;

View File

@@ -1,15 +1,15 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.world.level.block.Block; import net.minecraft.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.level.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.server.level.ServerLevel; import net.minecraft.world.server.ServerWorld;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.helper.FixedStack; import nl.requios.effortlessbuilding.helper.FixedStack;
@@ -29,7 +29,7 @@ public class UndoRedo {
private static final Map<UUID, FixedStack<BlockSet>> redoStacksServer = new HashMap<>(); private static final Map<UUID, FixedStack<BlockSet>> redoStacksServer = new HashMap<>();
//add to undo stack //add to undo stack
public static void addUndo(Player player, BlockSet blockSet) { public static void addUndo(PlayerEntity player, BlockSet blockSet) {
Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer; Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer;
//Assert coordinates is as long as previous and new blockstate lists //Assert coordinates is as long as previous and new blockstate lists
@@ -56,7 +56,7 @@ public class UndoRedo {
undoStacks.get(player.getUUID()).push(blockSet); undoStacks.get(player.getUUID()).push(blockSet);
} }
private static void addRedo(Player player, BlockSet blockSet) { private static void addRedo(PlayerEntity player, BlockSet blockSet) {
Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer; Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer;
//(No asserts necessary, it's private) //(No asserts necessary, it's private)
@@ -69,7 +69,7 @@ public class UndoRedo {
redoStacks.get(player.getUUID()).push(blockSet); redoStacks.get(player.getUUID()).push(blockSet);
} }
public static boolean undo(Player player) { public static boolean undo(PlayerEntity player) {
Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer; Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer;
if (!undoStacks.containsKey(player.getUUID())) return false; if (!undoStacks.containsKey(player.getUUID())) return false;
@@ -82,7 +82,7 @@ public class UndoRedo {
List<BlockPos> coordinates = blockSet.getCoordinates(); List<BlockPos> coordinates = blockSet.getCoordinates();
List<BlockState> previousBlockStates = blockSet.getPreviousBlockStates(); List<BlockState> previousBlockStates = blockSet.getPreviousBlockStates();
List<BlockState> newBlockStates = blockSet.getNewBlockStates(); List<BlockState> newBlockStates = blockSet.getNewBlockStates();
Vec3 hitVec = blockSet.getHitVec(); Vector3d hitVec = blockSet.getHitVec();
//Find up to date itemstacks in player inventory //Find up to date itemstacks in player inventory
List<ItemStack> itemStacks = findItemStacksInInventory(player, previousBlockStates); List<ItemStack> itemStacks = findItemStacksInInventory(player, previousBlockStates);
@@ -129,7 +129,7 @@ public class UndoRedo {
return true; return true;
} }
public static boolean redo(Player player) { public static boolean redo(PlayerEntity player) {
Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer; Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer;
if (!redoStacks.containsKey(player.getUUID())) return false; if (!redoStacks.containsKey(player.getUUID())) return false;
@@ -142,7 +142,7 @@ public class UndoRedo {
List<BlockPos> coordinates = blockSet.getCoordinates(); List<BlockPos> coordinates = blockSet.getCoordinates();
List<BlockState> previousBlockStates = blockSet.getPreviousBlockStates(); List<BlockState> previousBlockStates = blockSet.getPreviousBlockStates();
List<BlockState> newBlockStates = blockSet.getNewBlockStates(); List<BlockState> newBlockStates = blockSet.getNewBlockStates();
Vec3 hitVec = blockSet.getHitVec(); Vector3d hitVec = blockSet.getHitVec();
//Find up to date itemstacks in player inventory //Find up to date itemstacks in player inventory
List<ItemStack> itemStacks = findItemStacksInInventory(player, newBlockStates); List<ItemStack> itemStacks = findItemStacksInInventory(player, newBlockStates);
@@ -188,7 +188,7 @@ public class UndoRedo {
return true; return true;
} }
public static void clear(Player player) { public static void clear(PlayerEntity player) {
Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer; Map<UUID, FixedStack<BlockSet>> undoStacks = player.level.isClientSide ? undoStacksClient : undoStacksServer;
Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer; Map<UUID, FixedStack<BlockSet>> redoStacks = player.level.isClientSide ? redoStacksClient : redoStacksServer;
if (undoStacks.containsKey(player.getUUID())) { if (undoStacks.containsKey(player.getUUID())) {
@@ -199,7 +199,7 @@ public class UndoRedo {
} }
} }
private static List<ItemStack> findItemStacksInInventory(Player player, List<BlockState> blockStates) { private static List<ItemStack> findItemStacksInInventory(PlayerEntity player, List<BlockState> blockStates) {
List<ItemStack> itemStacks = new ArrayList<>(blockStates.size()); List<ItemStack> itemStacks = new ArrayList<>(blockStates.size());
for (BlockState blockState : blockStates) { for (BlockState blockState : blockStates) {
itemStacks.add(findItemStackInInventory(player, blockState)); itemStacks.add(findItemStackInInventory(player, blockState));
@@ -207,7 +207,7 @@ public class UndoRedo {
return itemStacks; return itemStacks;
} }
private static ItemStack findItemStackInInventory(Player player, BlockState blockState) { private static ItemStack findItemStackInInventory(PlayerEntity player, BlockState blockState) {
ItemStack itemStack = ItemStack.EMPTY; ItemStack itemStack = ItemStack.EMPTY;
if (blockState == null) return itemStack; if (blockState == null) return itemStack;
@@ -221,7 +221,7 @@ public class UndoRedo {
if (itemStack.isEmpty()) { if (itemStack.isEmpty()) {
//Cannot check drops on clientside because loot tables are server only //Cannot check drops on clientside because loot tables are server only
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
List<ItemStack> itemsDropped = Block.getDrops(blockState, (ServerLevel) player.level, BlockPos.ZERO, null); List<ItemStack> itemsDropped = Block.getDrops(blockState, (ServerWorld) player.level, BlockPos.ZERO, null);
for (ItemStack itemStackDropped : itemsDropped) { for (ItemStack itemStackDropped : itemsDropped) {
if (itemStackDropped.getItem() instanceof BlockItem) { if (itemStackDropped.getItem() instanceof BlockItem) {
Block block = ((BlockItem) itemStackDropped.getItem()).getBlock(); Block block = ((BlockItem) itemStackDropped.getItem()).getBlock();

View File

@@ -1,18 +1,19 @@
package nl.requios.effortlessbuilding.capability; package nl.requios.effortlessbuilding.capability;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import nl.requios.effortlessbuilding.item.RandomizerBagItem;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class ItemHandlerCapabilityProvider implements ICapabilitySerializable<CompoundTag> { public class ItemHandlerCapabilityProvider implements ICapabilitySerializable<CompoundNBT> {
IItemHandler itemHandler; IItemHandler itemHandler;
public ItemHandlerCapabilityProvider(int size) { public ItemHandlerCapabilityProvider(int size) {
@@ -26,12 +27,12 @@ public class ItemHandlerCapabilityProvider implements ICapabilitySerializable<Co
} }
@Override @Override
public CompoundTag serializeNBT() { public CompoundNBT serializeNBT() {
return ((ItemStackHandler) itemHandler).serializeNBT(); return ((ItemStackHandler) itemHandler).serializeNBT();
} }
@Override @Override
public void deserializeNBT(CompoundTag nbt) { public void deserializeNBT(CompoundNBT nbt) {
((ItemStackHandler) itemHandler).deserializeNBT(nbt); ((ItemStackHandler) itemHandler).deserializeNBT(nbt);
} }
} }

View File

@@ -1,9 +1,11 @@
package nl.requios.effortlessbuilding.capability; package nl.requios.effortlessbuilding.capability;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.INBT;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraftforge.common.capabilities.*; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -13,18 +15,21 @@ import nl.requios.effortlessbuilding.buildmode.BuildModes;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModeCapabilityManager { public class ModeCapabilityManager {
public static Capability<IModeCapability> MODE_CAPABILITY = CapabilityManager.get(new CapabilityToken<>(){}); @CapabilityInject(IModeCapability.class)
public final static Capability<IModeCapability> modeCapability = null;
// Allows for the capability to persist after death. // Allows for the capability to persist after death.
@SubscribeEvent @SubscribeEvent
public static void clonePlayer(PlayerEvent.Clone event) { public static void clonePlayer(PlayerEvent.Clone event) {
LazyOptional<IModeCapability> original = event.getOriginal().getCapability(MODE_CAPABILITY, null); LazyOptional<IModeCapability> original = event.getOriginal().getCapability(modeCapability, null);
LazyOptional<IModeCapability> clone = event.getEntity().getCapability(MODE_CAPABILITY, null); LazyOptional<IModeCapability> clone = event.getEntity().getCapability(modeCapability, null);
clone.ifPresent(cloneModeCapability -> clone.ifPresent(cloneModeCapability ->
original.ifPresent(originalModeCapability -> original.ifPresent(originalModeCapability ->
cloneModeCapability.setModeData(originalModeCapability.getModeData()))); cloneModeCapability.setModeData(originalModeCapability.getModeData())));
@@ -50,38 +55,10 @@ public class ModeCapabilityManager {
} }
} }
public static class Provider extends CapabilityProvider<Provider> implements ICapabilitySerializable<Tag> { public static class Storage implements Capability.IStorage<IModeCapability> {
private IModeCapability instance = new ModeCapability();
private LazyOptional<IModeCapability> modeCapabilityOptional = LazyOptional.of(() -> instance);
public Provider() {
super(Provider.class);
gatherCapabilities();
}
@Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { public INBT writeNBT(Capability<IModeCapability> capability, IModeCapability instance, Direction side) {
if (cap == MODE_CAPABILITY) return modeCapabilityOptional.cast(); CompoundNBT compound = new CompoundNBT();
return LazyOptional.empty();
}
@Override
public void invalidateCaps() {
super.invalidateCaps();
modeCapabilityOptional.invalidate();
}
@Override
public void reviveCaps() {
super.reviveCaps();
modeCapabilityOptional = LazyOptional.of(() -> instance);
}
@Override
public Tag serializeNBT() {
CompoundTag compound = new CompoundTag();
ModeSettings modeSettings = instance.getModeData(); ModeSettings modeSettings = instance.getModeData();
if (modeSettings == null) modeSettings = new ModeSettings(); if (modeSettings == null) modeSettings = new ModeSettings();
@@ -93,8 +70,8 @@ public class ModeCapabilityManager {
} }
@Override @Override
public void deserializeNBT(Tag nbt) { public void readNBT(Capability<IModeCapability> capability, IModeCapability instance, Direction side, INBT nbt) {
CompoundTag compound = (CompoundTag) nbt; CompoundNBT compound = (CompoundNBT) nbt;
//BuildModes.BuildModeEnum buildMode = BuildModes.BuildModeEnum.values()[compound.getInteger("buildMode")]; //BuildModes.BuildModeEnum buildMode = BuildModes.BuildModeEnum.values()[compound.getInteger("buildMode")];
@@ -103,6 +80,26 @@ public class ModeCapabilityManager {
ModeSettings modeSettings = new ModeSettings(BuildModes.BuildModeEnum.NORMAL); ModeSettings modeSettings = new ModeSettings(BuildModes.BuildModeEnum.NORMAL);
instance.setModeData(modeSettings); instance.setModeData(modeSettings);
} }
}
public static class Provider implements ICapabilitySerializable<INBT> {
IModeCapability inst = modeCapability.getDefaultInstance();
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
return modeCapability.orEmpty(cap, LazyOptional.of(() -> inst));
}
@Override
public INBT serializeNBT() {
return modeCapability.getStorage().writeNBT(modeCapability, inst, null);
}
@Override
public void deserializeNBT(INBT nbt) {
modeCapability.getStorage().readNBT(modeCapability, inst, null, nbt);
}
} }
} }

View File

@@ -1,12 +1,13 @@
package nl.requios.effortlessbuilding.capability; package nl.requios.effortlessbuilding.capability;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.INBT;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.common.capabilities.*; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -18,18 +19,21 @@ import nl.requios.effortlessbuilding.buildmodifier.RadialMirror;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModifierCapabilityManager { public class ModifierCapabilityManager {
public final static Capability<IModifierCapability> MODIFIER_CAPABILITY = CapabilityManager.get(new CapabilityToken<>(){}); @CapabilityInject(IModifierCapability.class)
public final static Capability<IModifierCapability> modifierCapability = null;
// Allows for the capability to persist after death. // Allows for the capability to persist after death.
@SubscribeEvent @SubscribeEvent
public static void clonePlayer(PlayerEvent.Clone event) { public static void clonePlayer(PlayerEvent.Clone event) {
LazyOptional<IModifierCapability> original = event.getOriginal().getCapability(MODIFIER_CAPABILITY, null); LazyOptional<IModifierCapability> original = event.getOriginal().getCapability(modifierCapability, null);
LazyOptional<IModifierCapability> clone = event.getEntity().getCapability(MODIFIER_CAPABILITY, null); LazyOptional<IModifierCapability> clone = event.getEntity().getCapability(modifierCapability, null);
clone.ifPresent(cloneModifierCapability -> clone.ifPresent(cloneModifierCapability ->
original.ifPresent(originalModifierCapability -> original.ifPresent(originalModifierCapability ->
cloneModifierCapability.setModifierData(originalModifierCapability.getModifierData()))); cloneModifierCapability.setModifierData(originalModifierCapability.getModifierData())));
@@ -55,38 +59,10 @@ public class ModifierCapabilityManager {
} }
} }
public static class Provider extends CapabilityProvider<Provider> implements INBTSerializable<Tag> { public static class Storage implements Capability.IStorage<IModifierCapability> {
private final IModifierCapability instance = new ModifierCapability();
private LazyOptional<IModifierCapability> modifierCapabilityOptional = LazyOptional.of(() -> instance);
public Provider() {
super(Provider.class);
gatherCapabilities();
}
@Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { public INBT writeNBT(Capability<IModifierCapability> capability, IModifierCapability instance, Direction side) {
if (cap == MODIFIER_CAPABILITY) return modifierCapabilityOptional.cast(); CompoundNBT compound = new CompoundNBT();
return LazyOptional.empty();
}
@Override
public void invalidateCaps() {
super.invalidateCaps();
modifierCapabilityOptional.invalidate();
}
@Override
public void reviveCaps() {
super.reviveCaps();
modifierCapabilityOptional = LazyOptional.of(() -> instance);
}
@Override
public Tag serializeNBT() {
CompoundTag compound = new CompoundTag();
ModifierSettings modifierSettings = instance.getModifierData(); ModifierSettings modifierSettings = instance.getModifierData();
if (modifierSettings == null) modifierSettings = new ModifierSettings(); if (modifierSettings == null) modifierSettings = new ModifierSettings();
@@ -134,12 +110,12 @@ public class ModifierCapabilityManager {
} }
@Override @Override
public void deserializeNBT(Tag nbt) { public void readNBT(Capability<IModifierCapability> capability, IModifierCapability instance, Direction side, INBT nbt) {
CompoundTag compound = (CompoundTag) nbt; CompoundNBT compound = (CompoundNBT) nbt;
//MIRROR //MIRROR
boolean mirrorEnabled = compound.getBoolean("mirrorEnabled"); boolean mirrorEnabled = compound.getBoolean("mirrorEnabled");
Vec3 mirrorPosition = new Vec3( Vector3d mirrorPosition = new Vector3d(
compound.getDouble("mirrorPosX"), compound.getDouble("mirrorPosX"),
compound.getDouble("mirrorPosY"), compound.getDouble("mirrorPosY"),
compound.getDouble("mirrorPosZ")); compound.getDouble("mirrorPosZ"));
@@ -166,7 +142,7 @@ public class ModifierCapabilityManager {
//RADIAL MIRROR //RADIAL MIRROR
boolean radialMirrorEnabled = compound.getBoolean("radialMirrorEnabled"); boolean radialMirrorEnabled = compound.getBoolean("radialMirrorEnabled");
Vec3 radialMirrorPosition = new Vec3( Vector3d radialMirrorPosition = new Vector3d(
compound.getDouble("radialMirrorPosX"), compound.getDouble("radialMirrorPosX"),
compound.getDouble("radialMirrorPosY"), compound.getDouble("radialMirrorPosY"),
compound.getDouble("radialMirrorPosZ")); compound.getDouble("radialMirrorPosZ"));
@@ -181,6 +157,27 @@ public class ModifierCapabilityManager {
ModifierSettings modifierSettings = new ModifierSettings(mirrorSettings, arraySettings, radialMirrorSettings, false, reachUpgrade); ModifierSettings modifierSettings = new ModifierSettings(mirrorSettings, arraySettings, radialMirrorSettings, false, reachUpgrade);
instance.setModifierData(modifierSettings); instance.setModifierData(modifierSettings);
} }
}
public static class Provider implements ICapabilitySerializable<INBT> {
IModifierCapability inst = modifierCapability.getDefaultInstance();
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
return modifierCapability.orEmpty(cap, LazyOptional.of(() -> inst));
}
@Override
public INBT serializeNBT() {
return modifierCapability.getStorage().writeNBT(modifierCapability, inst, null);
}
@Override
public void deserializeNBT(INBT nbt) {
modifierCapability.getStorage().readNBT(modifierCapability, inst, null, nbt);
}
} }
} }

View File

@@ -0,0 +1,43 @@
package nl.requios.effortlessbuilding.command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.fml.network.PacketDistributor;
import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.network.ModifierSettingsMessage;
import nl.requios.effortlessbuilding.network.PacketHandler;
public class CommandReach {
public static void register(CommandDispatcher<CommandSource> dispatcher) {
dispatcher.register(Commands.literal("reach").then(Commands.literal("set").then(Commands.argument("level", IntegerArgumentType.integer(0, 3)).executes((context) -> {
return setReachLevel(context.getSource().getPlayerOrException(), IntegerArgumentType.getInteger(context, "level"));
}))).then(Commands.literal("get").executes((context -> {
return getReachLevel(context.getSource().getPlayerOrException());
}))));
}
private static int setReachLevel(ServerPlayerEntity player, int level) {
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
modifierSettings.setReachUpgrade(level);
ModifierSettingsManager.setModifierSettings(player, modifierSettings);
//Send to client
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new ModifierSettingsMessage(modifierSettings));
player.sendMessage(new StringTextComponent("Reach level of " + player.getName().getString() + " set to " + modifierSettings.getReachUpgrade()), player.getUUID());
return 1;
}
private static int getReachLevel(ServerPlayerEntity player) {
int reachUpgrade = ModifierSettingsManager.getModifierSettings(player).getReachUpgrade();
EffortlessBuilding.log(player, "Current reach: level " + reachUpgrade);
return 1;
}
}

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.compatibility; package nl.requios.effortlessbuilding.compatibility;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
@@ -59,5 +59,4 @@ public class CompatHelper {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
} }

View File

@@ -1,21 +1,21 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.InteractionHand; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.inventory.container.ClickType;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.Container;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.world.inventory.ClickType; import net.minecraft.inventory.container.Slot;
import net.minecraft.world.inventory.MenuType; import net.minecraft.item.ItemStack;
import net.minecraft.world.inventory.Slot; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.Hand;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.item.DiamondRandomizerBagItem; import nl.requios.effortlessbuilding.item.DiamondRandomizerBagItem;
public class DiamondRandomizerBagContainer extends AbstractContainerMenu { public class DiamondRandomizerBagContainer extends Container {
private static final int INV_START = DiamondRandomizerBagItem.INV_SIZE, private static final int INV_START = DiamondRandomizerBagItem.INV_SIZE,
INV_END = INV_START + 26, INV_END = INV_START + 26,
@@ -23,22 +23,22 @@ public class DiamondRandomizerBagContainer extends AbstractContainerMenu {
HOTBAR_END = HOTBAR_START + 8; HOTBAR_END = HOTBAR_START + 8;
private final IItemHandler bagInventory; private final IItemHandler bagInventory;
public DiamondRandomizerBagContainer(MenuType<?> type, int id){ public DiamondRandomizerBagContainer(ContainerType<?> type, int id){
super(type, id); super(type, id);
bagInventory = null; bagInventory = null;
} }
//Client //Client
public DiamondRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) { public DiamondRandomizerBagContainer(int id, PlayerInventory playerInventory, PacketBuffer packetBuffer) {
this(id, playerInventory); this(id, playerInventory);
} }
//Server? //Server?
public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory) { public DiamondRandomizerBagContainer(int containerId, PlayerInventory playerInventory) {
this(containerId, playerInventory, new ItemStackHandler(DiamondRandomizerBagItem.INV_SIZE)); this(containerId, playerInventory, new ItemStackHandler(DiamondRandomizerBagItem.INV_SIZE));
} }
public DiamondRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) { public DiamondRandomizerBagContainer(int containerId, PlayerInventory playerInventory, IItemHandler inventory) {
super(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), containerId); super(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), containerId);
bagInventory = inventory; bagInventory = inventory;
@@ -62,7 +62,7 @@ public class DiamondRandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public boolean stillValid(Player playerIn) { public boolean stillValid(PlayerEntity playerIn) {
return true; return true;
} }
@@ -74,7 +74,7 @@ public class DiamondRandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public ItemStack quickMoveStack(Player playerIn, int slotIndex) { public ItemStack quickMoveStack(PlayerEntity playerIn, int slotIndex) {
ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.slots.get(slotIndex); Slot slot = this.slots.get(slotIndex);
@@ -124,22 +124,23 @@ public class DiamondRandomizerBagContainer extends AbstractContainerMenu {
* You should override this method to prevent the player from moving the stack that * You should override this method to prevent the player from moving the stack that
* opened the inventory, otherwise if the player moves it, the inventory will not * opened the inventory, otherwise if the player moves it, the inventory will not
* be able to save properly * be able to save properly
* @return
*/ */
@Override @Override
public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) { public ItemStack clicked(int slot, int dragType, ClickType clickTypeIn, PlayerEntity player) {
// this will prevent the player from interacting with the item that opened the inventory: // this will prevent the player from interacting with the item that opened the inventory:
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(Hand.MAIN_HAND))) {
//Do nothing; //Do nothing;
return; return ItemStack.EMPTY;
} }
super.clicked(slot, dragType, clickTypeIn, player); return super.clicked(slot, dragType, clickTypeIn, player);
} }
/** /**
* Callback for when the crafting gui is closed. * Callback for when the crafting gui is closed.
*/ */
@Override @Override
public void removed(Player player) { public void removed(PlayerEntity player) {
super.removed(player); super.removed(player);
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
broadcastChanges(); broadcastChanges();

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.network.chat.Component; import net.minecraft.util.ResourceLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -14,34 +14,32 @@ import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class DiamondRandomizerBagScreen extends AbstractContainerScreen<DiamondRandomizerBagContainer> { public class DiamondRandomizerBagScreen extends ContainerScreen<DiamondRandomizerBagContainer> {
private Inventory inventory; private static final ResourceLocation guiTextures =
new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/diamondrandomizerbag.png");
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/diamondrandomizerbag.png"); public DiamondRandomizerBagScreen(DiamondRandomizerBagContainer randomizerBagContainer, PlayerInventory playerInventory, ITextComponent title) {
public DiamondRandomizerBagScreen(DiamondRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
super(randomizerBagContainer, playerInventory, title); super(randomizerBagContainer, playerInventory, title);
this.inventory = playerInventory;
imageHeight = 167; imageHeight = 167;
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
renderBackground(ms); renderBackground(ms);
super.render(ms, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
this.renderTooltip(ms, mouseX, mouseY); this.renderTooltip(ms, mouseX, mouseY);
} }
@Override @Override
protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { protected void renderLabels(MatrixStack ms, int mouseX, int mouseY) {
this.font.draw(ms, this.title, 8, 6, 0x404040); font.draw(ms, this.title, 8, 6, 0x404040);
this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040); font.draw(ms, inventory.getDisplayName(), 8, imageHeight - 96 + 2, 0x404040);
} }
@Override @Override
protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { protected void renderBg(MatrixStack ms, float partialTicks, int mouseX, int mouseY) {
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f); RenderSystem.color3f(1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, guiTextures); minecraft.getTextureManager().bind(guiTextures);
int marginHorizontal = (width - imageWidth) / 2; int marginHorizontal = (width - imageWidth) / 2;
int marginVertical = (height - imageHeight) / 2; int marginVertical = (height - imageHeight) / 2;
blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight);

View File

@@ -1,21 +1,21 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.InteractionHand; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.inventory.container.ClickType;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.Container;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.world.inventory.ClickType; import net.minecraft.inventory.container.Slot;
import net.minecraft.world.inventory.MenuType; import net.minecraft.item.ItemStack;
import net.minecraft.world.inventory.Slot; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.Hand;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.item.GoldenRandomizerBagItem; import nl.requios.effortlessbuilding.item.GoldenRandomizerBagItem;
public class GoldenRandomizerBagContainer extends AbstractContainerMenu { public class GoldenRandomizerBagContainer extends Container {
private static final int INV_START = GoldenRandomizerBagItem.INV_SIZE, private static final int INV_START = GoldenRandomizerBagItem.INV_SIZE,
INV_END = INV_START + 26, INV_END = INV_START + 26,
@@ -23,22 +23,22 @@ public class GoldenRandomizerBagContainer extends AbstractContainerMenu {
HOTBAR_END = HOTBAR_START + 8; HOTBAR_END = HOTBAR_START + 8;
private final IItemHandler bagInventory; private final IItemHandler bagInventory;
public GoldenRandomizerBagContainer(MenuType<?> type, int id){ public GoldenRandomizerBagContainer(ContainerType<?> type, int id){
super(type, id); super(type, id);
bagInventory = null; bagInventory = null;
} }
//Client //Client
public GoldenRandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) { public GoldenRandomizerBagContainer(int id, PlayerInventory playerInventory, PacketBuffer packetBuffer) {
this(id, playerInventory); this(id, playerInventory);
} }
//Server? //Server?
public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory) { public GoldenRandomizerBagContainer(int containerId, PlayerInventory playerInventory) {
this(containerId, playerInventory, new ItemStackHandler(GoldenRandomizerBagItem.INV_SIZE)); this(containerId, playerInventory, new ItemStackHandler(GoldenRandomizerBagItem.INV_SIZE));
} }
public GoldenRandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) { public GoldenRandomizerBagContainer(int containerId, PlayerInventory playerInventory, IItemHandler inventory) {
super(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), containerId); super(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), containerId);
bagInventory = inventory; bagInventory = inventory;
@@ -60,7 +60,7 @@ public class GoldenRandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public boolean stillValid(Player playerIn) { public boolean stillValid(PlayerEntity playerIn) {
return true; return true;
} }
@@ -72,7 +72,7 @@ public class GoldenRandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public ItemStack quickMoveStack(Player playerIn, int slotIndex) { public ItemStack quickMoveStack(PlayerEntity playerIn, int slotIndex) {
ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.slots.get(slotIndex); Slot slot = this.slots.get(slotIndex);
@@ -122,22 +122,23 @@ public class GoldenRandomizerBagContainer extends AbstractContainerMenu {
* You should override this method to prevent the player from moving the stack that * You should override this method to prevent the player from moving the stack that
* opened the inventory, otherwise if the player moves it, the inventory will not * opened the inventory, otherwise if the player moves it, the inventory will not
* be able to save properly * be able to save properly
* @return
*/ */
@Override @Override
public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) { public ItemStack clicked(int slot, int dragType, ClickType clickTypeIn, PlayerEntity player) {
// this will prevent the player from interacting with the item that opened the inventory: // this will prevent the player from interacting with the item that opened the inventory:
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(Hand.MAIN_HAND))) {
//Do nothing; //Do nothing;
return; return ItemStack.EMPTY;
} }
super.clicked(slot, dragType, clickTypeIn, player); return super.clicked(slot, dragType, clickTypeIn, player);
} }
/** /**
* Callback for when the crafting gui is closed. * Callback for when the crafting gui is closed.
*/ */
@Override @Override
public void removed(Player player) { public void removed(PlayerEntity player) {
super.removed(player); super.removed(player);
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
broadcastChanges(); broadcastChanges();

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.network.chat.Component; import net.minecraft.util.ResourceLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.entity.player.Inventory;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -14,34 +14,32 @@ import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class GoldenRandomizerBagScreen extends AbstractContainerScreen<GoldenRandomizerBagContainer> { public class GoldenRandomizerBagScreen extends ContainerScreen<GoldenRandomizerBagContainer> {
private Inventory inventory; private static final ResourceLocation guiTextures =
new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/goldenrandomizerbag.png");
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/goldenrandomizerbag.png"); public GoldenRandomizerBagScreen(GoldenRandomizerBagContainer randomizerBagContainer, PlayerInventory playerInventory, ITextComponent title) {
public GoldenRandomizerBagScreen(GoldenRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
super(randomizerBagContainer, playerInventory, title); super(randomizerBagContainer, playerInventory, title);
this.inventory = playerInventory;
imageHeight = 134; imageHeight = 134;
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
renderBackground(ms); renderBackground(ms);
super.render(ms, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
this.renderTooltip(ms, mouseX, mouseY); this.renderTooltip(ms, mouseX, mouseY);
} }
@Override @Override
protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { protected void renderLabels(MatrixStack ms, int mouseX, int mouseY) {
this.font.draw(ms, this.title, 8, 6, 0x404040); font.draw(ms, this.title, 8, 6, 0x404040);
this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040); font.draw(ms, inventory.getDisplayName(), 8, imageHeight - 96 + 2, 0x404040);
} }
@Override @Override
protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { protected void renderBg(MatrixStack ms, float partialTicks, int mouseX, int mouseY) {
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f); RenderSystem.color3f(1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, guiTextures); minecraft.getTextureManager().bind(guiTextures);
int marginHorizontal = (width - imageWidth) / 2; int marginHorizontal = (width - imageWidth) / 2;
int marginVertical = (height - imageHeight) / 2; int marginVertical = (height - imageHeight) / 2;
blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight);

View File

@@ -1,21 +1,21 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.inventory.ClickType; import net.minecraft.inventory.container.ClickType;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.inventory.container.Container;
import net.minecraft.world.inventory.MenuType; import net.minecraft.inventory.container.ContainerType;
import net.minecraft.world.inventory.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Hand;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.item.RandomizerBagItem; import nl.requios.effortlessbuilding.item.RandomizerBagItem;
public class RandomizerBagContainer extends AbstractContainerMenu { public class RandomizerBagContainer extends Container {
private static final int INV_START = RandomizerBagItem.INV_SIZE, private static final int INV_START = RandomizerBagItem.INV_SIZE,
INV_END = INV_START + 26, INV_END = INV_START + 26,
@@ -23,22 +23,22 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
HOTBAR_END = HOTBAR_START + 8; HOTBAR_END = HOTBAR_START + 8;
private final IItemHandler bagInventory; private final IItemHandler bagInventory;
public RandomizerBagContainer(MenuType<?> type, int id){ public RandomizerBagContainer(ContainerType<?> type, int id){
super(type, id); super(type, id);
bagInventory = null; bagInventory = null;
} }
//Client //Client
public RandomizerBagContainer(int id, Inventory playerInventory, FriendlyByteBuf packetBuffer) { public RandomizerBagContainer(int id, PlayerInventory playerInventory, PacketBuffer packetBuffer) {
this(id, playerInventory); this(id, playerInventory);
} }
//Server? //Server?
public RandomizerBagContainer(int containerId, Inventory playerInventory) { public RandomizerBagContainer(int containerId, PlayerInventory playerInventory) {
this(containerId, playerInventory, new ItemStackHandler(RandomizerBagItem.INV_SIZE)); this(containerId, playerInventory, new ItemStackHandler(RandomizerBagItem.INV_SIZE));
} }
public RandomizerBagContainer(int containerId, Inventory playerInventory, IItemHandler inventory) { public RandomizerBagContainer(int containerId, PlayerInventory playerInventory, IItemHandler inventory) {
super(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), containerId); super(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), containerId);
bagInventory = inventory; bagInventory = inventory;
@@ -60,7 +60,7 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public boolean stillValid(Player playerIn) { public boolean stillValid(PlayerEntity playerIn) {
return true; return true;
} }
@@ -72,7 +72,7 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
} }
@Override @Override
public ItemStack quickMoveStack(Player playerIn, int slotIndex) { public ItemStack quickMoveStack(PlayerEntity playerIn, int slotIndex) {
ItemStack itemstack = ItemStack.EMPTY; ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.slots.get(slotIndex); Slot slot = this.slots.get(slotIndex);
@@ -122,22 +122,23 @@ public class RandomizerBagContainer extends AbstractContainerMenu {
* You should override this method to prevent the player from moving the stack that * You should override this method to prevent the player from moving the stack that
* opened the inventory, otherwise if the player moves it, the inventory will not * opened the inventory, otherwise if the player moves it, the inventory will not
* be able to save properly * be able to save properly
* @return
*/ */
@Override @Override
public void clicked(int slot, int dragType, ClickType clickTypeIn, Player player) { public ItemStack clicked(int slot, int dragType, ClickType clickTypeIn, PlayerEntity player) {
// this will prevent the player from interacting with the item that opened the inventory: // this will prevent the player from interacting with the item that opened the inventory:
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(InteractionHand.MAIN_HAND))) { if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getItem().equals(player.getItemInHand(Hand.MAIN_HAND))) {
//Do nothing; //Do nothing;
return; return ItemStack.EMPTY;
} }
super.clicked(slot, dragType, clickTypeIn, player); return super.clicked(slot, dragType, clickTypeIn, player);
} }
/** /**
* Callback for when the crafting gui is closed. * Callback for when the crafting gui is closed.
*/ */
@Override @Override
public void removed(Player player) { public void removed(PlayerEntity player) {
super.removed(player); super.removed(player);
if (!player.level.isClientSide) { if (!player.level.isClientSide) {
broadcastChanges(); broadcastChanges();

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.gui; package nl.requios.effortlessbuilding.gui;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -14,34 +14,32 @@ import javax.annotation.ParametersAreNonnullByDefault;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class RandomizerBagScreen extends AbstractContainerScreen<RandomizerBagContainer> { public class RandomizerBagScreen extends ContainerScreen<RandomizerBagContainer> {
private Inventory inventory; private static final ResourceLocation guiTextures =
new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png");
private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png"); public RandomizerBagScreen(RandomizerBagContainer randomizerBagContainer, PlayerInventory playerInventory, ITextComponent title) {
super(randomizerBagContainer, playerInventory, title);//new TranslationTextComponent("effortlessbuilding.screen.randomizer_bag"));
public RandomizerBagScreen(RandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) {
super(randomizerBagContainer, playerInventory, title);
this.inventory = playerInventory;
imageHeight = 134; imageHeight = 134;
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
renderBackground(ms); renderBackground(ms);
super.render(ms, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
this.renderTooltip(ms, mouseX, mouseY); this.renderTooltip(ms, mouseX, mouseY);
} }
@Override @Override
protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { protected void renderLabels(MatrixStack ms, int mouseX, int mouseY) {
this.font.draw(ms, this.title, 8, 6, 0x404040); font.draw(ms, this.title, 8, 6, 0x404040);
this.font.draw(ms, this.playerInventoryTitle, 8, imageHeight - 96 + 2, 0x404040); font.draw(ms, inventory.getDisplayName(), 8, imageHeight - 96 + 2, 0x404040);
} }
@Override @Override
protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { protected void renderBg(MatrixStack ms, float partialTicks, int mouseX, int mouseY) {
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1f); RenderSystem.color3f(1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, guiTextures); minecraft.getTextureManager().bind(guiTextures);
int marginHorizontal = (width - imageWidth) / 2; int marginHorizontal = (width - imageWidth) / 2;
int marginVertical = (height - imageHeight) / 2; int marginVertical = (height - imageHeight) / 2;
blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight); blit(ms, marginHorizontal, marginVertical, 0, 0, imageWidth, imageHeight);

View File

@@ -1,21 +1,26 @@
package nl.requios.effortlessbuilding.gui.buildmode; package nl.requios.effortlessbuilding.gui.buildmode;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.client.audio.SimpleSound;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.client.gui.components.ObjectSelectionList; import net.minecraft.client.gui.widget.list.ExtendedList;
import net.minecraft.sounds.SoundEvents; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Mth; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.network.chat.Component; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.gui.widget.ExtendedButton; import net.minecraftforge.fml.client.gui.widget.ExtendedButton;
import net.minecraftforge.client.gui.widget.ForgeSlider; import net.minecraftforge.fml.client.gui.widget.Slider;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
@@ -31,7 +36,7 @@ public class PlayerSettingsGui extends Screen {
private Button closeButton; private Button closeButton;
public PlayerSettingsGui() { public PlayerSettingsGui() {
super(Component.translatable("effortlessbuilding.screen.player_settings")); super(new TranslationTextComponent("effortlessbuilding.screen.player_settings"));
} }
@Override @Override
@@ -43,20 +48,22 @@ public class PlayerSettingsGui extends Screen {
int yy = top; int yy = top;
shaderTypeList = new ShaderTypeList(this.minecraft); shaderTypeList = new ShaderTypeList(this.minecraft);
addWidget(shaderTypeList); this.children.add(shaderTypeList);
//TODO set selected name //TODO set selected name
Component currentShaderName = ShaderType.DISSOLVE_BLUE.name; ITextComponent currentShaderName = ShaderType.DISSOLVE_BLUE.name;
shaderTypeButton = new ExtendedButton(right - 180, yy, 180, 20, currentShaderName, (button) -> { shaderTypeButton = new ExtendedButton(right - 180, yy, 180, 20, currentShaderName, (button) -> {
showShaderList = !showShaderList; showShaderList = !showShaderList;
}); });
addRenderableOnly(shaderTypeButton); addButton(shaderTypeButton);
yy += 50; yy += 50;
ForgeSlider slider = new ForgeSlider(right - 200, yy, 200, 20, Component.empty(), Component.empty(), 0.5, 2.0, 1.0, true); Slider slider = new Slider(right - 200, yy, 200, 20, StringTextComponent.EMPTY, StringTextComponent.EMPTY, 0.5, 2.0, 1.0, true, true, (button) -> {
addRenderableOnly(slider);
closeButton = new ExtendedButton(left + 50, bottom - 20, 180, 20, Component.literal("Done"), (button) -> this.minecraft.player.closeContainer()); });
addRenderableOnly(closeButton); addButton(slider);
closeButton = new ExtendedButton(left + 50, bottom - 20, 180, 20, new StringTextComponent("Done"), (button) -> this.minecraft.player.closeContainer());
addButton(closeButton);
} }
@Override @Override
@@ -65,7 +72,7 @@ public class PlayerSettingsGui extends Screen {
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
this.renderBackground(ms); this.renderBackground(ms);
int yy = top; int yy = top;
@@ -100,20 +107,20 @@ public class PlayerSettingsGui extends Screen {
DISSOLVE_BLUE("Dissolve Blue"), DISSOLVE_BLUE("Dissolve Blue"),
DISSOLVE_ORANGE("Dissolve Orange"); DISSOLVE_ORANGE("Dissolve Orange");
public Component name; public ITextComponent name;
ShaderType(Component name) { ShaderType(ITextComponent name) {
this.name = name; this.name = name;
} }
ShaderType(String name) { ShaderType(String name) {
this.name = Component.literal(name); this.name = new StringTextComponent(name);
} }
} }
//Inspired by LanguageScreen //Inspired by LanguageScreen
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
class ShaderTypeList extends ObjectSelectionList<PlayerSettingsGui.ShaderTypeList.ShaderTypeEntry> { class ShaderTypeList extends ExtendedList<PlayerSettingsGui.ShaderTypeList.ShaderTypeEntry> {
public ShaderTypeList(Minecraft mcIn) { public ShaderTypeList(Minecraft mcIn) {
super(mcIn, 180, 140, top + 20, top + 100, 18); super(mcIn, 180, 140, top + 20, top + 100, 18);
@@ -142,7 +149,7 @@ public class PlayerSettingsGui extends Screen {
@Override @Override
public void setSelected(PlayerSettingsGui.ShaderTypeList.ShaderTypeEntry selected) { public void setSelected(PlayerSettingsGui.ShaderTypeList.ShaderTypeEntry selected) {
super.setSelected(selected); super.setSelected(selected);
Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); Minecraft.getInstance().getSoundManager().play(SimpleSound.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
EffortlessBuilding.log("Selected shader " + selected.shaderType.name); EffortlessBuilding.log("Selected shader " + selected.shaderType.name);
shaderTypeButton.setMessage(selected.shaderType.name); shaderTypeButton.setMessage(selected.shaderType.name);
// showShaderList = false; // showShaderList = false;
@@ -187,20 +194,20 @@ public class PlayerSettingsGui extends Screen {
return right - 6; return right - 6;
} }
//From AbstractSelectionList, disabled parts //From AbstractList, disabled parts
@Override @Override
public void render(PoseStack ms, int p_render_1_, int p_render_2_, float p_render_3_) { public void render(MatrixStack ms, int p_render_1_, int p_render_2_, float p_render_3_) {
this.renderBackground(ms); this.renderBackground(ms);
int i = this.getScrollbarPosition(); int i = this.getScrollbarPosition();
int j = i + 6; int j = i + 6;
Tesselator tessellator = Tesselator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
// this.minecraft.getTextureManager().bindTexture(AbstractGui.BACKGROUND_LOCATION); // this.minecraft.getTextureManager().bindTexture(AbstractGui.BACKGROUND_LOCATION);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
float f = 32.0F; float f = 32.0F;
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_COLOR);
bufferbuilder.vertex(this.x0, this.y1, 0.0D).color(20, 20, 20, 180).endVertex(); bufferbuilder.vertex(this.x0, this.y1, 0.0D).color(20, 20, 20, 180).endVertex();
bufferbuilder.vertex(this.x1, this.y1, 0.0D).color(20, 20, 20, 180).endVertex(); bufferbuilder.vertex(this.x1, this.y1, 0.0D).color(20, 20, 20, 180).endVertex();
bufferbuilder.vertex(this.x1, this.y0, 0.0D).color(20, 20, 20, 180).endVertex(); bufferbuilder.vertex(this.x1, this.y0, 0.0D).color(20, 20, 20, 180).endVertex();
@@ -212,12 +219,14 @@ public class PlayerSettingsGui extends Screen {
this.renderHeader(ms, k, l, tessellator); this.renderHeader(ms, k, l, tessellator);
} }
this.renderList(ms, p_render_1_, p_render_2_, p_render_3_); this.renderList(ms, k, l, p_render_1_, p_render_2_, p_render_3_);
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();
// this.renderHoleBackground(0, this.y0, 255, 255); // this.renderHoleBackground(0, this.y0, 255, 255);
// this.renderHoleBackground(this.y1, this.height, 255, 255); // this.renderHoleBackground(this.y1, this.height, 255, 255);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
RenderSystem.disableAlphaTest();
RenderSystem.shadeModel(7425);
RenderSystem.disableTexture(); RenderSystem.disableTexture();
// int i1 = 4; // int i1 = 4;
// bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); // bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
@@ -237,25 +246,25 @@ public class PlayerSettingsGui extends Screen {
int j1 = this.getMaxScroll(); int j1 = this.getMaxScroll();
if (j1 > 0) { if (j1 > 0) {
int k1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition()); int k1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition());
k1 = Mth.clamp(k1, 32, this.y1 - this.y0 - 8); k1 = MathHelper.clamp(k1, 32, this.y1 - this.y0 - 8);
int l1 = (int) this.getScrollAmount() * (this.y1 - this.y0 - k1) / j1 + this.y0; int l1 = (int) this.getScrollAmount() * (this.y1 - this.y0 - k1) / j1 + this.y0;
if (l1 < this.y0) { if (l1 < this.y0) {
l1 = this.y0; l1 = this.y0;
} }
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(i, this.y1, 0.0D).uv(0.0F, 1.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(i, this.y1, 0.0D).uv(0.0F, 1.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(j, this.y1, 0.0D).uv(1.0F, 1.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(j, this.y1, 0.0D).uv(1.0F, 1.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(j, this.y0, 0.0D).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(j, this.y0, 0.0D).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(i, this.y0, 0.0D).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(i, this.y0, 0.0D).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex();
tessellator.end(); tessellator.end();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(i, l1 + k1, 0.0D).uv(0.0F, 1.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(i, l1 + k1, 0.0D).uv(0.0F, 1.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(j, l1 + k1, 0.0D).uv(1.0F, 1.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(j, l1 + k1, 0.0D).uv(1.0F, 1.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(j, l1, 0.0D).uv(1.0F, 0.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(j, l1, 0.0D).uv(1.0F, 0.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(i, l1, 0.0D).uv(0.0F, 0.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(i, l1, 0.0D).uv(0.0F, 0.0F).color(128, 128, 128, 255).endVertex();
tessellator.end(); tessellator.end();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(i, l1 + k1 - 1, 0.0D).uv(0.0F, 1.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(i, l1 + k1 - 1, 0.0D).uv(0.0F, 1.0F).color(192, 192, 192, 255).endVertex();
bufferbuilder.vertex(j - 1, l1 + k1 - 1, 0.0D).uv(1.0F, 1.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(j - 1, l1 + k1 - 1, 0.0D).uv(1.0F, 1.0F).color(192, 192, 192, 255).endVertex();
bufferbuilder.vertex(j - 1, l1, 0.0D).uv(1.0F, 0.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(j - 1, l1, 0.0D).uv(1.0F, 0.0F).color(192, 192, 192, 255).endVertex();
@@ -265,6 +274,8 @@ public class PlayerSettingsGui extends Screen {
// this.renderDecorations(p_render_1_, p_render_2_); // this.renderDecorations(p_render_1_, p_render_2_);
RenderSystem.enableTexture(); RenderSystem.enableTexture();
RenderSystem.shadeModel(7424);
RenderSystem.enableAlphaTest();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
} }
@@ -273,7 +284,7 @@ public class PlayerSettingsGui extends Screen {
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class ShaderTypeEntry extends ObjectSelectionList.Entry<ShaderTypeEntry> { public class ShaderTypeEntry extends ExtendedList.AbstractListEntry<ShaderTypeEntry> {
private final ShaderType shaderType; private final ShaderType shaderType;
public ShaderTypeEntry(ShaderType shaderType) { public ShaderTypeEntry(ShaderType shaderType) {
@@ -281,7 +292,7 @@ public class PlayerSettingsGui extends Screen {
} }
@Override @Override
public void render(PoseStack ms, int itemIndex, int rowTop, int rowLeft, int rowWidth, int rowHeight, int mouseX, int mouseY, boolean hovered, float partialTicks) { public void render(MatrixStack ms, int itemIndex, int rowTop, int rowLeft, int rowWidth, int rowHeight, int mouseX, int mouseY, boolean hovered, float partialTicks) {
if (rowTop + 10 > ShaderTypeList.this.y0 && rowTop + rowHeight - 5 < ShaderTypeList.this.y1) if (rowTop + 10 > ShaderTypeList.this.y0 && rowTop + rowHeight - 5 < ShaderTypeList.this.y1)
drawString(ms, font, shaderType.name, ShaderTypeList.this.x0 + 8, rowTop + 4, 0xFFFFFF); drawString(ms, font, shaderType.name, ShaderTypeList.this.x0 + 8, rowTop + 4, 0xFFFFFF);
} }
@@ -295,11 +306,6 @@ public class PlayerSettingsGui extends Screen {
return false; return false;
} }
} }
@Override
public Component getNarration() {
return null;
}
} }
} }
} }

View File

@@ -1,23 +1,27 @@
package nl.requios.effortlessbuilding.gui.buildmode; package nl.requios.effortlessbuilding.gui.buildmode;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.audio.SimpleSound;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.resources.language.I18n; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.KeyMapping; import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.Direction; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.ChatFormatting; import net.minecraft.client.resources.I18n;
import net.minecraft.network.chat.Component; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.resources.ResourceLocation; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Direction;
import net.minecraft.sounds.SoundSource; import net.minecraft.util.SoundCategory;
import net.minecraft.util.RandomSource; import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.vector.Vector4f;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.TranslationTextComponent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.ModClientEventHandler;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
import nl.requios.effortlessbuilding.network.ModeActionMessage; import nl.requios.effortlessbuilding.network.ModeActionMessage;
@@ -25,7 +29,6 @@ import nl.requios.effortlessbuilding.network.ModeSettingsMessage;
import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.network.PacketHandler;
import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.proxy.ClientProxy;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
import org.joml.Vector4f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
@@ -39,7 +42,7 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions.OptionEnum;
/** /**
* Initially from Chisels and Bits by AlgorithmX2 * Initially from Chisels and Bits by AlgorithmX2
* https://github.com/AlgorithmX2/Chisels-and-Bits/blob/1.12/src/main/java/mod/chiselsandbits/client/gui/ChiselsAndBitsMenu.java * <a href="https://github.com/AlgorithmX2/Chisels-and-Bits/blob/1.12/src/main/java/mod/chiselsandbits/client/gui/ChiselsAndBitsMenu.java">Link</a>
*/ */
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@@ -74,7 +77,7 @@ public class RadialMenu extends Screen {
private float visibility; private float visibility;
public RadialMenu() { public RadialMenu() {
super(Component.translatable("effortlessbuilding.screen.radial_menu")); super(new TranslationTextComponent("effortlessbuilding.screen.radial_menu"));
} }
public boolean isVisible() { public boolean isVisible() {
@@ -98,11 +101,11 @@ public class RadialMenu extends Screen {
} }
@Override @Override
public void render(PoseStack ms, final int mouseX, final int mouseY, final float partialTicks) { public void render(MatrixStack ms, final int mouseX, final int mouseY, final float partialTicks) {
BuildModeEnum currentBuildMode = ModeSettingsManager.getModeSettings(minecraft.player).getBuildMode(); BuildModeEnum currentBuildMode = ModeSettingsManager.getModeSettings(minecraft.player).getBuildMode();
ms.pushPose(); RenderSystem.pushMatrix();
ms.translate(0, 0, 200); RenderSystem.translatef(0.0F, 0.0F, 200.0F);
visibility += fadeSpeed * partialTicks; visibility += fadeSpeed * partialTicks;
if (visibility > 1f) visibility = 1f; if (visibility > 1f) visibility = 1f;
@@ -114,19 +117,22 @@ public class RadialMenu extends Screen {
RenderSystem.disableTexture(); RenderSystem.disableTexture();
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.disableAlphaTest();
RenderSystem.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); RenderSystem.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
final Tesselator tessellator = Tesselator.getInstance(); RenderSystem.shadeModel(GL11.GL_SMOOTH);
final Tessellator tessellator = Tessellator.getInstance();
final BufferBuilder buffer = tessellator.getBuilder(); final BufferBuilder buffer = tessellator.getBuilder();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
final double middleX = width / 2.0; final double middleX = width / 2.0;
final double middleY = height / 2.0; final double middleY = height / 2.0;
//Fix for high def (retina) displays: use custom mouse coordinates //Fix for high def (retina) displays: use custom mouse coordinates
//Borrowed from GameRenderer::updateCameraAndRender //Borrowed from GameRenderer::updateCameraAndRender
int mouseXX = (int) (minecraft.mouseHandler.xpos() * (double) minecraft.getWindow().getGuiScaledWidth() / (double) minecraft.getWindow().getScreenWidth()); Minecraft mc = Minecraft.getInstance();
int mouseYY = (int) (minecraft.mouseHandler.ypos() * (double) minecraft.getWindow().getGuiScaledHeight() / (double) minecraft.getWindow().getScreenHeight()); int mouseXX = (int) (mc.mouseHandler.xpos() * (double) mc.getWindow().getGuiScaledWidth() / (double) mc.getWindow().getScreenWidth());
int mouseYY = (int) (mc.mouseHandler.ypos() * (double) mc.getWindow().getGuiScaledHeight() / (double) mc.getWindow().getScreenHeight());
final double mouseXCenter = mouseXX - middleX; final double mouseXCenter = mouseXX - middleX;
final double mouseYCenter = mouseYY - middleY; final double mouseYCenter = mouseYY - middleY;
@@ -173,28 +179,28 @@ public class RadialMenu extends Screen {
drawSideButtonBackgrounds(buffer, middleX, middleY, mouseXCenter, mouseYCenter, buttons); drawSideButtonBackgrounds(buffer, middleX, middleY, mouseXCenter, mouseYCenter, buttons);
tessellator.end(); tessellator.end();
RenderSystem.disableBlend();
RenderSystem.enableTexture();
drawIcons(ms, middleX, middleY, modes, buttons); drawIcons(buffer, middleX, middleY, mc, modes, buttons);
tessellator.end();
drawTexts(ms, currentBuildMode, middleX, middleY, modes, buttons, options); drawTexts(ms, currentBuildMode, middleX, middleY, modes, buttons, options);
ms.popPose(); RenderSystem.popMatrix();
} }
private void drawRadialButtonBackgrounds(BuildModeEnum currentBuildMode, BufferBuilder buffer, double middleX, double middleY, private void drawRadialButtonBackgrounds(BuildModeEnum currentBuildMode, BufferBuilder buffer, double middleX, double middleY,
double mouseXCenter, double mouseYCenter, double mouseRadians, double quarterCircle, ArrayList<MenuRegion> modes) { double mouseXCenter, double mouseYCenter, double mouseRadians, double quarterCircle, ArrayList<MenuRegion> modes) {
if (!modes.isEmpty()) { if (!modes.isEmpty()) {
final int totalModes = Math.max(3, modes.size()); final int totalModes = Math.max(3, modes.size());
final double fragment = Math.PI * 0.005; //gap between buttons in radians at inner edge final double fragment = Math.PI * 0.005;
final double fragment2 = Math.PI * 0.0025; //gap between buttons in radians at outer edge final double fragment2 = Math.PI * 0.0025;
final double radiansPerObject = 2.0 * Math.PI / totalModes; final double perObject = 2.0 * Math.PI / totalModes;
for (int i = 0; i < modes.size(); i++) { for (int i = 0; i < modes.size(); i++) {
MenuRegion menuRegion = modes.get(i); MenuRegion menuRegion = modes.get(i);
final double beginRadians = i * radiansPerObject - quarterCircle; final double beginRadians = i * perObject - quarterCircle;
final double endRadians = (i + 1) * radiansPerObject - quarterCircle; final double endRadians = (i + 1) * perObject - quarterCircle;
menuRegion.x1 = Math.cos(beginRadians); menuRegion.x1 = Math.cos(beginRadians);
menuRegion.x2 = Math.cos(endRadians); menuRegion.x2 = Math.cos(endRadians);
@@ -236,8 +242,8 @@ public class RadialMenu extends Screen {
final double categoryLineOuterEdge = ringInnerEdge + categoryLineWidth; final double categoryLineOuterEdge = ringInnerEdge + categoryLineWidth;
final double x1m3 = Math.cos(beginRadians + fragment) * categoryLineOuterEdge; final double x1m3 = Math.cos(beginRadians + fragment) * categoryLineOuterEdge;
final double x2m3 = Math.cos(endRadians - fragment) * categoryLineOuterEdge;
final double y1m3 = Math.sin(beginRadians + fragment) * categoryLineOuterEdge; final double y1m3 = Math.sin(beginRadians + fragment) * categoryLineOuterEdge;
final double x2m3 = Math.cos(endRadians - fragment) * categoryLineOuterEdge;
final double y2m3 = Math.sin(endRadians - fragment) * categoryLineOuterEdge; final double y2m3 = Math.sin(endRadians - fragment) * categoryLineOuterEdge;
buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex();
@@ -278,12 +284,17 @@ public class RadialMenu extends Screen {
} }
} }
private void drawIcons(PoseStack ms, double middleX, double middleY, private void drawIcons(BufferBuilder buffer, double middleX, double middleY, Minecraft mc, ArrayList<MenuRegion> modes, ArrayList<MenuButton> buttons) {
ArrayList<MenuRegion> modes, ArrayList<MenuButton> buttons) { RenderSystem.shadeModel(GL11.GL_FLAT);
ms.pushPose();
RenderSystem.translatef(0f, 0f, 5f);
RenderSystem.enableTexture(); RenderSystem.enableTexture();
RenderSystem.setShader(GameRenderer::getPositionColorTexShader); RenderSystem.color3f(1f, 1f, 1f);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f); RenderSystem.disableBlend();
RenderSystem.enableAlphaTest();
mc.getTextureManager().bind(AtlasTexture.LOCATION_BLOCKS);
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR);
//Draw buildmode icons //Draw buildmode icons
for (final MenuRegion menuRegion : modes) { for (final MenuRegion menuRegion : modes) {
@@ -291,24 +302,55 @@ public class RadialMenu extends Screen {
final double x = (menuRegion.x1 + menuRegion.x2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); final double x = (menuRegion.x1 + menuRegion.x2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge);
final double y = (menuRegion.y1 + menuRegion.y2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); final double y = (menuRegion.y1 + menuRegion.y2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge);
RenderSystem.setShaderTexture(0, new ResourceLocation(EffortlessBuilding.MODID, "textures/icons/" + menuRegion.mode.getName() + ".png")); final TextureAtlasSprite sprite = ModClientEventHandler.getBuildModeIcon(menuRegion.mode);
blit(ms, (int) (middleX + x - 8), (int) (middleY + y - 8), 16, 16, 0, 0, 18, 18, 18, 18);
final double x1 = x - 8;
final double x2 = x + 8;
final double y1 = y - 8;
final double y2 = y + 8;
final float f = 1f;
final float a = 1f;
final double u1 = 0;
final double u2 = 16;
final double v1 = 0;
final double v2 = 16;
buffer.vertex(middleX + x1, middleY + y1, getBlitOffset()).uv(sprite.getU(u1), sprite.getV(v1)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + x1, middleY + y2, getBlitOffset()).uv(sprite.getU(u1), sprite.getV(v2)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + x2, middleY + y2, getBlitOffset()).uv(sprite.getU(u2), sprite.getV(v2)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + x2, middleY + y1, getBlitOffset()).uv(sprite.getU(u2), sprite.getV(v1)).color(f, f, f, a).endVertex();
} }
//Draw action icons //Draw action icons
for (final MenuButton button : buttons) { for (final MenuButton button : buttons) {
final double x = (button.x1 + button.x2) / 2 + 0.01; final float f = 1f;
final double y = (button.y1 + button.y2) / 2 + 0.01; final float a = 1f;
RenderSystem.setShaderTexture(0, new ResourceLocation(EffortlessBuilding.MODID, "textures/icons/" + button.action.name().toLowerCase() + ".png")); final double u1 = 0;
blit(ms, (int) (middleX + x - 8), (int) (middleY + y - 8), 16, 16, 0, 0, 18, 18, 18, 18); final double u2 = 16;
final double v1 = 0;
final double v2 = 16;
final TextureAtlasSprite sprite = ModClientEventHandler.getModeOptionIcon(button.action);
final double btnmiddleX = (button.x1 + button.x2) / 2 + 0.01;
final double btnmiddleY = (button.y1 + button.y2) / 2 + 0.01;
final double btnx1 = btnmiddleX - 8;
final double btnx2 = btnmiddleX + 8;
final double btny1 = btnmiddleY - 8;
final double btny2 = btnmiddleY + 8;
buffer.vertex(middleX + btnx1, middleY + btny1, getBlitOffset()).uv(sprite.getU(u1), sprite.getV(v1)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + btnx1, middleY + btny2, getBlitOffset()).uv(sprite.getU(u1), sprite.getV(v2)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + btnx2, middleY + btny2, getBlitOffset()).uv(sprite.getU(u2), sprite.getV(v2)).color(f, f, f, a).endVertex();
buffer.vertex(middleX + btnx2, middleY + btny1, getBlitOffset()).uv(sprite.getU(u2), sprite.getV(v1)).color(f, f, f, a).endVertex();
}
} }
ms.popPose(); private void drawTexts(MatrixStack ms, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList<MenuRegion> modes, ArrayList<MenuButton> buttons, OptionEnum[] options) {
}
private void drawTexts(PoseStack ms, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList<MenuRegion> modes, ArrayList<MenuButton> buttons, OptionEnum[] options) {
//font.drawStringWithShadow("Actions", (int) (middleX - buttonDistance - 13) - font.getStringWidth("Actions") * 0.5f, (int) middleY - 38, 0xffffffff); //font.drawStringWithShadow("Actions", (int) (middleX - buttonDistance - 13) - font.getStringWidth("Actions") * 0.5f, (int) middleY - 38, 0xffffffff);
//Draw option strings //Draw option strings
@@ -328,7 +370,7 @@ public class RadialMenu extends Screen {
final double y = (menuRegion.y1 + menuRegion.y2) * 0.5; final double y = (menuRegion.y1 + menuRegion.y2) * 0.5;
int fixed_x = (int) (x * textDistance); int fixed_x = (int) (x * textDistance);
int fixed_y = (int) (y * textDistance) - font.lineHeight / 2; final int fixed_y = (int) (y * textDistance) - font.lineHeight / 2;
String text = I18n.get(menuRegion.mode.getNameKey()); String text = I18n.get(menuRegion.mode.getNameKey());
if (x <= -0.2) { if (x <= -0.2) {
@@ -348,13 +390,13 @@ public class RadialMenu extends Screen {
//Draw action text //Draw action text
for (final MenuButton button : buttons) { for (final MenuButton button : buttons) {
if (button.highlighted) { if (button.highlighted) {
String text = ChatFormatting.AQUA + button.name; String text = TextFormatting.AQUA + button.name;
//Add keybind in brackets //Add keybind in brackets
String keybind = findKeybind(button, currentBuildMode); String keybind = findKeybind(button, currentBuildMode);
String keybindFormatted = ""; String keybindFormatted = "";
if (!keybind.isEmpty()) if (!keybind.isEmpty())
keybindFormatted = ChatFormatting.GRAY + "(" + WordUtils.capitalizeFully(keybind) + ")"; keybindFormatted = TextFormatting.GRAY + "(" + WordUtils.capitalizeFully(keybind) + ")";
if (button.textSide == Direction.WEST) { if (button.textSide == Direction.WEST) {
@@ -397,7 +439,7 @@ public class RadialMenu extends Screen {
if (button.action == ActionEnum.OPEN_MODIFIER_SETTINGS) keybindingIndex = 0; if (button.action == ActionEnum.OPEN_MODIFIER_SETTINGS) keybindingIndex = 0;
if (keybindingIndex != -1) { if (keybindingIndex != -1) {
KeyMapping keyMap = ClientProxy.keyBindings[keybindingIndex]; KeyBinding keyMap = ClientProxy.keyBindings[keybindingIndex];
if (!keyMap.getKeyModifier().name().equals("none")) { if (!keyMap.getKeyModifier().name().equals("none")) {
result = keyMap.getKeyModifier().name() + " "; result = keyMap.getKeyModifier().name() + " ";
@@ -448,7 +490,7 @@ public class RadialMenu extends Screen {
} }
private void performAction(boolean fromMouseClick) { private void performAction(boolean fromMouseClick) {
LocalPlayer player = Minecraft.getInstance().player; PlayerEntity player = Minecraft.getInstance().player;
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
@@ -479,8 +521,7 @@ public class RadialMenu extends Screen {
public static void playRadialMenuSound() { public static void playRadialMenuSound() {
final float volume = 0.1f; final float volume = 0.1f;
if (volume >= 0.0001f) { if (volume >= 0.0001f) {
SimpleSoundInstance sound = new SimpleSoundInstance(SoundEvents.UI_BUTTON_CLICK.get(), SoundSource.MASTER, volume, SimpleSound sound = new SimpleSound(SoundEvents.UI_BUTTON_CLICK, SoundCategory.MASTER, volume, 1.0f, Minecraft.getInstance().player.blockPosition());
1.0f, RandomSource.create(), Minecraft.getInstance().player.blockPosition());
Minecraft.getInstance().getSoundManager().play(sound); Minecraft.getInstance().getSoundManager().play(sound);
} }
} }

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.gui.buildmodifier; package nl.requios.effortlessbuilding.gui.buildmodifier;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -33,8 +33,8 @@ public class ArraySettingsGui extends GuiCollapsibleScrollEntry {
} }
@Override @Override
public void init(List<Renderable> renderables) { public void init(List<Widget> buttons) {
super.init(renderables); super.init(buttons);
int y = top; int y = top;
buttonArrayEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) { buttonArrayEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) {
@@ -44,28 +44,28 @@ public class ArraySettingsGui extends GuiCollapsibleScrollEntry {
setCollapsed(!buttonArrayEnabled.isChecked()); setCollapsed(!buttonArrayEnabled.isChecked());
} }
}; };
renderables.add(buttonArrayEnabled); buttons.add(buttonArrayEnabled);
y = top + 20; y = top + 20;
textArrayOffsetX = new GuiNumberField(font, renderables, left + 70, y, 50, 18); textArrayOffsetX = new GuiNumberField(font, buttons, left + 70, y, 50, 18);
textArrayOffsetX.setNumber(0); textArrayOffsetX.setNumber(0);
textArrayOffsetX.setTooltip(Component.literal("How much each copy is shifted.")); textArrayOffsetX.setTooltip(new StringTextComponent("How much each copy is shifted."));
arrayNumberFieldList.add(textArrayOffsetX); arrayNumberFieldList.add(textArrayOffsetX);
textArrayOffsetY = new GuiNumberField(font, renderables, left + 140, y, 50, 18); textArrayOffsetY = new GuiNumberField(font, buttons, left + 140, y, 50, 18);
textArrayOffsetY.setNumber(0); textArrayOffsetY.setNumber(0);
textArrayOffsetY.setTooltip(Component.literal("How much each copy is shifted.")); textArrayOffsetY.setTooltip(new StringTextComponent("How much each copy is shifted."));
arrayNumberFieldList.add(textArrayOffsetY); arrayNumberFieldList.add(textArrayOffsetY);
textArrayOffsetZ = new GuiNumberField(font, renderables, left + 210, y, 50, 18); textArrayOffsetZ = new GuiNumberField(font, buttons, left + 210, y, 50, 18);
textArrayOffsetZ.setNumber(0); textArrayOffsetZ.setNumber(0);
textArrayOffsetZ.setTooltip(Component.literal("How much each copy is shifted.")); textArrayOffsetZ.setTooltip(new StringTextComponent("How much each copy is shifted."));
arrayNumberFieldList.add(textArrayOffsetZ); arrayNumberFieldList.add(textArrayOffsetZ);
y = top + 50; y = top + 50;
textArrayCount = new GuiNumberField(font, renderables, left + 55, y, 50, 18); textArrayCount = new GuiNumberField(font, buttons, left + 55, y, 50, 18);
textArrayCount.setNumber(5); textArrayCount.setNumber(5);
textArrayCount.setTooltip(Component.literal("How many copies should be made.")); textArrayCount.setTooltip(new StringTextComponent("How many copies should be made."));
arrayNumberFieldList.add(textArrayCount); arrayNumberFieldList.add(textArrayCount);
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(mc.player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(mc.player);
@@ -86,14 +86,14 @@ public class ArraySettingsGui extends GuiCollapsibleScrollEntry {
} }
@Override @Override
public void drawEntry(PoseStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, public void drawEntry(MatrixStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY,
boolean isSelected, float partialTicks) { boolean isSelected, float partialTicks) {
int yy = y; int yy = y;
int offset = 8; int offset = 8;
buttonArrayEnabled.render(ms, mouseX, mouseY, partialTicks); buttonArrayEnabled.render(ms, mouseX, mouseY, partialTicks);
if (buttonArrayEnabled.isChecked()) { if (buttonArrayEnabled.isChecked()) {
buttonArrayEnabled.setY(yy); buttonArrayEnabled.y = yy;
font.draw(ms, "Array enabled", left + offset, yy + 2, 0xFFFFFF); font.draw(ms, "Array enabled", left + offset, yy + 2, 0xFFFFFF);
yy = y + 20; yy = y + 20;
@@ -111,19 +111,19 @@ public class ArraySettingsGui extends GuiCollapsibleScrollEntry {
int currentReach = Math.max(-1, getArrayReach()); int currentReach = Math.max(-1, getArrayReach());
int maxReach = ReachHelper.getMaxReach(mc.player); int maxReach = ReachHelper.getMaxReach(mc.player);
ChatFormatting reachColor = isCurrentReachValid(currentReach, maxReach) ? ChatFormatting.GRAY : ChatFormatting.RED; TextFormatting reachColor = isCurrentReachValid(currentReach, maxReach) ? TextFormatting.GRAY : TextFormatting.RED;
String reachText = "Reach: " + reachColor + currentReach + ChatFormatting.GRAY + "/" + ChatFormatting.GRAY + maxReach; String reachText = "Reach: " + reachColor + currentReach + TextFormatting.GRAY + "/" + TextFormatting.GRAY + maxReach;
font.draw(ms, reachText, left + 176 + offset, yy + 5, 0xFFFFFF); font.draw(ms, reachText, left + 176 + offset, yy + 5, 0xFFFFFF);
arrayNumberFieldList.forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks)); arrayNumberFieldList.forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks));
} else { } else {
buttonArrayEnabled.setY(yy); buttonArrayEnabled.y = yy;
font.draw(ms, "Array disabled", left + offset, yy + 2, 0x999999); font.draw(ms, "Array disabled", left + offset, yy + 2, 0x999999);
} }
} }
public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY) {
//Draw tooltips last //Draw tooltips last
if (buttonArrayEnabled.isChecked()) { if (buttonArrayEnabled.isChecked()) {
arrayNumberFieldList.forEach(numberField -> numberField.drawTooltip(ms, scrollPane.parent, mouseX, mouseY)); arrayNumberFieldList.forEach(numberField -> numberField.drawTooltip(ms, scrollPane.parent, mouseX, mouseY));

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.gui.buildmodifier; package nl.requios.effortlessbuilding.gui.buildmodifier;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.network.chat.Component; import net.minecraft.util.ResourceLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -40,8 +40,8 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
} }
@Override @Override
public void init(List<Renderable> renderables) { public void init(List<Widget> buttonList) {
super.init(renderables); super.init(buttonList);
int y = top - 2; int y = top - 2;
buttonMirrorEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) { buttonMirrorEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) {
@@ -51,23 +51,23 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
setCollapsed(!buttonMirrorEnabled.isChecked()); setCollapsed(!buttonMirrorEnabled.isChecked());
} }
}; };
renderables.add(buttonMirrorEnabled); buttonList.add(buttonMirrorEnabled);
y = top + 18; y = top + 18;
textMirrorPosX = new GuiNumberField(font, renderables, left + 58, y, 62, 18); textMirrorPosX = new GuiNumberField(font, buttonList, left + 58, y, 62, 18);
textMirrorPosX.setNumber(0); textMirrorPosX.setNumber(0);
textMirrorPosX.setTooltip( textMirrorPosX.setTooltip(
Arrays.asList(Component.literal("The position of the mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); Arrays.asList(new StringTextComponent("The position of the mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
mirrorNumberFieldList.add(textMirrorPosX); mirrorNumberFieldList.add(textMirrorPosX);
textMirrorPosY = new GuiNumberField(font, renderables, left + 138, y, 62, 18); textMirrorPosY = new GuiNumberField(font, buttonList, left + 138, y, 62, 18);
textMirrorPosY.setNumber(64); textMirrorPosY.setNumber(64);
textMirrorPosY.setTooltip(Arrays.asList(Component.literal("The position of the mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); textMirrorPosY.setTooltip(Arrays.asList(new StringTextComponent("The position of the mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
mirrorNumberFieldList.add(textMirrorPosY); mirrorNumberFieldList.add(textMirrorPosY);
textMirrorPosZ = new GuiNumberField(font, renderables, left + 218, y, 62, 18); textMirrorPosZ = new GuiNumberField(font, buttonList, left + 218, y, 62, 18);
textMirrorPosZ.setNumber(0); textMirrorPosZ.setNumber(0);
textMirrorPosZ.setTooltip(Arrays.asList(Component.literal("The position of the mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); textMirrorPosZ.setTooltip(Arrays.asList(new StringTextComponent("The position of the mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
mirrorNumberFieldList.add(textMirrorPosZ); mirrorNumberFieldList.add(textMirrorPosZ);
y = top + 50; y = top + 50;
@@ -81,56 +81,56 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
mirrorButtonList.add(buttonMirrorZ); mirrorButtonList.add(buttonMirrorZ);
y = top + 47; y = top + 47;
textMirrorRadius = new GuiNumberField(font, renderables, left + 218, y, 62, 18); textMirrorRadius = new GuiNumberField(font, buttonList, left + 218, y, 62, 18);
textMirrorRadius.setNumber(50); textMirrorRadius.setNumber(50);
//TODO change to diameter (remove /2) //TODO change to diameter (remove /2)
textMirrorRadius.setTooltip(Arrays.asList(Component.literal("How far the mirror reaches in any direction."), textMirrorRadius.setTooltip(Arrays.asList(new StringTextComponent("How far the mirror reaches in any direction."),
Component.literal("Max: ").withStyle(ChatFormatting.GRAY).append(Component.literal(String.valueOf(ReachHelper.getMaxReach(mc.player) / 2)).withStyle(ChatFormatting.GOLD)), new StringTextComponent("Max: ").withStyle(TextFormatting.GRAY).append(new StringTextComponent(String.valueOf(ReachHelper.getMaxReach(mc.player) / 2)).withStyle(TextFormatting.GOLD)),
Component.literal("Upgradeable in survival with reach upgrades.").withStyle(ChatFormatting.GRAY))); new StringTextComponent("Upgradeable in survival with reach upgrades.").withStyle(TextFormatting.GRAY)));
mirrorNumberFieldList.add(textMirrorRadius); mirrorNumberFieldList.add(textMirrorRadius);
y = top + 72; y = top + 72;
buttonCurrentPosition = new GuiIconButton(left + 5, y, 0, 0, BUILDING_ICONS, button -> { buttonCurrentPosition = new GuiIconButton(left + 5, y, 0, 0, BUILDING_ICONS, button -> {
Vec3 pos = new Vec3(Math.floor(mc.player.getX()) + 0.5, Math.floor(mc.player.getY()) + 0.5, Math.floor(mc.player.getZ()) + 0.5); Vector3d pos = new Vector3d(Math.floor(mc.player.getX()) + 0.5, Math.floor(mc.player.getY()) + 0.5, Math.floor(mc.player.getZ()) + 0.5);
textMirrorPosX.setNumber(pos.x); textMirrorPosX.setNumber(pos.x);
textMirrorPosY.setNumber(pos.y); textMirrorPosY.setNumber(pos.y);
textMirrorPosZ.setNumber(pos.z); textMirrorPosZ.setNumber(pos.z);
}); });
buttonCurrentPosition.setTooltip(Component.literal("Set mirror position to current player position")); buttonCurrentPosition.setTooltip(new StringTextComponent("Set mirror position to current player position"));
mirrorIconButtonList.add(buttonCurrentPosition); mirrorIconButtonList.add(buttonCurrentPosition);
buttonToggleOdd = new GuiIconButton(left + 35, y, 0, 20, BUILDING_ICONS, button -> { buttonToggleOdd = new GuiIconButton(left + 35, y, 0, 20, BUILDING_ICONS, button -> {
toggleOdd = !toggleOdd; toggleOdd = !toggleOdd;
buttonToggleOdd.setUseAlternateIcon(toggleOdd); buttonToggleOdd.setUseAlternateIcon(toggleOdd);
if (toggleOdd) { if (toggleOdd) {
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to corner of block"), Component.literal("for even numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to corner of block"), new StringTextComponent("for even numbered builds")));
textMirrorPosX.setNumber(textMirrorPosX.getNumber() + 0.5); textMirrorPosX.setNumber(textMirrorPosX.getNumber() + 0.5);
textMirrorPosY.setNumber(textMirrorPosY.getNumber() + 0.5); textMirrorPosY.setNumber(textMirrorPosY.getNumber() + 0.5);
textMirrorPosZ.setNumber(textMirrorPosZ.getNumber() + 0.5); textMirrorPosZ.setNumber(textMirrorPosZ.getNumber() + 0.5);
} else { } else {
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
textMirrorPosX.setNumber(Math.floor(textMirrorPosX.getNumber())); textMirrorPosX.setNumber(Math.floor(textMirrorPosX.getNumber()));
textMirrorPosY.setNumber(Math.floor(textMirrorPosY.getNumber())); textMirrorPosY.setNumber(Math.floor(textMirrorPosY.getNumber()));
textMirrorPosZ.setNumber(Math.floor(textMirrorPosZ.getNumber())); textMirrorPosZ.setNumber(Math.floor(textMirrorPosZ.getNumber()));
} }
}); });
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
mirrorIconButtonList.add(buttonToggleOdd); mirrorIconButtonList.add(buttonToggleOdd);
buttonDrawLines = new GuiIconButton(left + 65, y, 0, 40, BUILDING_ICONS, button -> { buttonDrawLines = new GuiIconButton(left + 65, y, 0, 40, BUILDING_ICONS, button -> {
drawLines = !drawLines; drawLines = !drawLines;
buttonDrawLines.setUseAlternateIcon(drawLines); buttonDrawLines.setUseAlternateIcon(drawLines);
buttonDrawLines.setTooltip(Component.literal(drawLines ? "Hide lines" : "Show lines")); buttonDrawLines.setTooltip(new StringTextComponent(drawLines ? "Hide lines" : "Show lines"));
}); });
buttonDrawLines.setTooltip(Component.literal("Show lines")); buttonDrawLines.setTooltip(new StringTextComponent("Show lines"));
mirrorIconButtonList.add(buttonDrawLines); mirrorIconButtonList.add(buttonDrawLines);
buttonDrawPlanes = new GuiIconButton(left + 95, y, 0, 60, BUILDING_ICONS, button -> { buttonDrawPlanes = new GuiIconButton(left + 95, y, 0, 60, BUILDING_ICONS, button -> {
drawPlanes = !drawPlanes; drawPlanes = !drawPlanes;
buttonDrawPlanes.setUseAlternateIcon(drawPlanes); buttonDrawPlanes.setUseAlternateIcon(drawPlanes);
buttonDrawPlanes.setTooltip(Component.literal(drawPlanes ? "Hide area" : "Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent(drawPlanes ? "Hide area" : "Show area"));
}); });
buttonDrawPlanes.setTooltip(Component.literal("Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent("Show area"));
mirrorIconButtonList.add(buttonDrawPlanes); mirrorIconButtonList.add(buttonDrawPlanes);
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(mc.player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(mc.player);
@@ -148,20 +148,20 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
drawPlanes = m.drawPlanes; drawPlanes = m.drawPlanes;
buttonDrawLines.setUseAlternateIcon(drawLines); buttonDrawLines.setUseAlternateIcon(drawLines);
buttonDrawPlanes.setUseAlternateIcon(drawPlanes); buttonDrawPlanes.setUseAlternateIcon(drawPlanes);
buttonDrawLines.setTooltip(Component.literal(drawLines ? "Hide lines" : "Show lines")); buttonDrawLines.setTooltip(new StringTextComponent(drawLines ? "Hide lines" : "Show lines"));
buttonDrawPlanes.setTooltip(Component.literal(drawPlanes ? "Hide area" : "Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent(drawPlanes ? "Hide area" : "Show area"));
if (textMirrorPosX.getNumber() == Math.floor(textMirrorPosX.getNumber())) { if (textMirrorPosX.getNumber() == Math.floor(textMirrorPosX.getNumber())) {
toggleOdd = false; toggleOdd = false;
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
} else { } else {
toggleOdd = true; toggleOdd = true;
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to corner of block"), Component.literal("for even numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to corner of block"), new StringTextComponent("for even numbered builds")));
} }
buttonToggleOdd.setUseAlternateIcon(toggleOdd); buttonToggleOdd.setUseAlternateIcon(toggleOdd);
} }
renderables.addAll(mirrorButtonList); buttonList.addAll(mirrorButtonList);
renderables.addAll(mirrorIconButtonList); buttonList.addAll(mirrorIconButtonList);
setCollapsed(!buttonMirrorEnabled.isChecked()); setCollapsed(!buttonMirrorEnabled.isChecked());
} }
@@ -173,7 +173,7 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
} }
@Override @Override
public void drawEntry(PoseStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, public void drawEntry(MatrixStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY,
boolean isSelected, float partialTicks) { boolean isSelected, float partialTicks) {
int yy = y; int yy = y;
@@ -181,7 +181,7 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
buttonMirrorEnabled.render(ms, mouseX, mouseY, partialTicks); buttonMirrorEnabled.render(ms, mouseX, mouseY, partialTicks);
if (buttonMirrorEnabled.isChecked()) { if (buttonMirrorEnabled.isChecked()) {
buttonMirrorEnabled.setY(yy); buttonMirrorEnabled.y = yy;
font.draw(ms, "Mirror enabled", left + offset, yy + 2, 0xFFFFFF); font.draw(ms, "Mirror enabled", left + offset, yy + 2, 0xFFFFFF);
yy = y + 18; yy = y + 18;
@@ -195,29 +195,29 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
yy = y + 50; yy = y + 50;
font.draw(ms, "Direction", left + offset, yy + 2, 0xFFFFFF); font.draw(ms, "Direction", left + offset, yy + 2, 0xFFFFFF);
buttonMirrorX.setY(yy); buttonMirrorX.y = yy;
buttonMirrorY.setY(yy); buttonMirrorY.y = yy;
buttonMirrorZ.setY(yy); buttonMirrorZ.y = yy;
font.draw(ms, "Radius", left + 176 + offset, yy + 2, 0xFFFFFF); font.draw(ms, "Radius", left + 176 + offset, yy + 2, 0xFFFFFF);
textMirrorRadius.y = yy - 3; textMirrorRadius.y = yy - 3;
yy = y + 72; yy = y + 72;
buttonCurrentPosition.setY(yy); buttonCurrentPosition.y = yy;
buttonToggleOdd.setY(yy); buttonToggleOdd.y = yy;
buttonDrawLines.setY(yy); buttonDrawLines.y = yy;
buttonDrawPlanes.setY(yy); buttonDrawPlanes.y = yy;
mirrorButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks)); mirrorButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks));
mirrorIconButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks)); mirrorIconButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks));
mirrorNumberFieldList.forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks)); mirrorNumberFieldList.forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks));
} else { } else {
buttonMirrorEnabled.setY(yy); buttonMirrorEnabled.y = yy;
font.draw(ms, "Mirror disabled", left + offset, yy + 2, 0x999999); font.draw(ms, "Mirror disabled", left + offset, yy + 2, 0x999999);
} }
} }
public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY) {
//Draw tooltips last //Draw tooltips last
if (buttonMirrorEnabled.isChecked()) { if (buttonMirrorEnabled.isChecked()) {
mirrorIconButtonList.forEach(iconButton -> iconButton.drawTooltip(ms, scrollPane.parent, mouseX, mouseY)); mirrorIconButtonList.forEach(iconButton -> iconButton.drawTooltip(ms, scrollPane.parent, mouseX, mouseY));
@@ -251,9 +251,9 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry {
public Mirror.MirrorSettings getMirrorSettings() { public Mirror.MirrorSettings getMirrorSettings() {
boolean mirrorEnabled = buttonMirrorEnabled.isChecked(); boolean mirrorEnabled = buttonMirrorEnabled.isChecked();
Vec3 mirrorPos = new Vec3(0, 64, 0); Vector3d mirrorPos = new Vector3d(0, 64, 0);
try { try {
mirrorPos = new Vec3(textMirrorPosX.getNumber(), textMirrorPosY.getNumber(), textMirrorPosZ.getNumber()); mirrorPos = new Vector3d(textMirrorPosX.getNumber(), textMirrorPosY.getNumber(), textMirrorPosZ.getNumber());
} catch (NumberFormatException | NullPointerException ex) { } catch (NumberFormatException | NullPointerException ex) {
EffortlessBuilding.log(mc.player, "Mirror position not a valid number."); EffortlessBuilding.log(mc.player, "Mirror position not a valid number.");
} }

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.gui.buildmodifier; package nl.requios.effortlessbuilding.gui.buildmodifier;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.gui.widget.ExtendedButton;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.Array; import nl.requios.effortlessbuilding.buildmodifier.Array;
import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.Mirror;
@@ -29,13 +29,12 @@ public class ModifierSettingsGui extends Screen {
private RadialMirrorSettingsGui radialMirrorSettingsGui; private RadialMirrorSettingsGui radialMirrorSettingsGui;
public ModifierSettingsGui() { public ModifierSettingsGui() {
super(Component.translatable("effortlessbuilding.screen.modifier_settings")); super(new TranslationTextComponent("effortlessbuilding.screen.modifier_settings"));
} }
@Override @Override
//Create buttons and labels and add them to buttonList/labelList //Create buttons and labels and add them to buttonList/labelList
protected void init() { protected void init() {
scrollPane = new GuiScrollPane(this, font, 8, height - 30); scrollPane = new GuiScrollPane(this, font, 8, height - 30);
mirrorSettingsGui = new MirrorSettingsGui(scrollPane); mirrorSettingsGui = new MirrorSettingsGui(scrollPane);
@@ -47,14 +46,14 @@ public class ModifierSettingsGui extends Screen {
radialMirrorSettingsGui = new RadialMirrorSettingsGui(scrollPane); radialMirrorSettingsGui = new RadialMirrorSettingsGui(scrollPane);
scrollPane.AddListEntry(radialMirrorSettingsGui); scrollPane.AddListEntry(radialMirrorSettingsGui);
scrollPane.init(renderables); scrollPane.init(buttons);
//Close button //Close button
int y = height - 26; int y = height - 26;
buttonClose = new ExtendedButton(width / 2 - 100, y, 200, 20, Component.literal("Close"), (button) -> { buttonClose = new Button(width / 2 - 100, y, 200, 20, new StringTextComponent("Close"), (button) -> {
Minecraft.getInstance().player.closeContainer(); Minecraft.getInstance().player.closeContainer();
}); });
addRenderableOnly(buttonClose); buttons.add(buttonClose);
} }
@Override @Override
@@ -68,7 +67,7 @@ public class ModifierSettingsGui extends Screen {
@Override @Override
//Set colors using GL11, use the fontObj field to display text //Set colors using GL11, use the fontObj field to display text
//Use drawTexturedModalRect() to transfers areas of a texture resource to the screen //Use drawTexturedModalRect() to transfers areas of a texture resource to the screen
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
this.renderBackground(ms); this.renderBackground(ms);
scrollPane.render(ms, mouseX, mouseY, partialTicks); scrollPane.render(ms, mouseX, mouseY, partialTicks);
@@ -83,28 +82,16 @@ public class ModifierSettingsGui extends Screen {
public boolean charTyped(char typedChar, int keyCode) { public boolean charTyped(char typedChar, int keyCode) {
super.charTyped(typedChar, keyCode); super.charTyped(typedChar, keyCode);
scrollPane.charTyped(typedChar, keyCode); scrollPane.charTyped(typedChar, keyCode);
return false;
}
@Override
public boolean keyPressed(int keyCode, int p_96553_, int p_96554_) {
if (keyCode == ClientProxy.keyBindings[0].getKey().getValue()) { if (keyCode == ClientProxy.keyBindings[0].getKey().getValue()) {
minecraft.player.closeContainer(); minecraft.player.closeContainer();
return true;
} }
return false;
return super.keyPressed(keyCode, p_96553_, p_96554_);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) {
super.mouseClicked(mouseX, mouseY, mouseButton); super.mouseClicked(mouseX, mouseY, mouseButton);
renderables.forEach(renderable -> { buttons.forEach(button -> button.mouseClicked(mouseX, mouseY, mouseButton));
if (renderable instanceof Button) {
Button button = (Button) renderable;
button.mouseClicked(mouseX, mouseY, mouseButton);
}
});
return scrollPane.mouseClicked(mouseX, mouseY, mouseButton); return scrollPane.mouseClicked(mouseX, mouseY, mouseButton);
} }

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.gui.buildmodifier; package nl.requios.effortlessbuilding.gui.buildmodifier;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.network.chat.Component; import net.minecraft.util.ResourceLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -40,8 +40,8 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
} }
@Override @Override
public void init(List<Renderable> renderables) { public void init(List<Widget> buttonList) {
super.init(renderables); super.init(buttonList);
int y = top - 2; int y = top - 2;
buttonRadialMirrorEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) { buttonRadialMirrorEnabled = new GuiCheckBoxFixed(left - 15 + 8, y, "", false) {
@@ -51,81 +51,81 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
setCollapsed(!buttonRadialMirrorEnabled.isChecked()); setCollapsed(!buttonRadialMirrorEnabled.isChecked());
} }
}; };
renderables.add(buttonRadialMirrorEnabled); buttonList.add(buttonRadialMirrorEnabled);
y = top + 18; y = top + 18;
textRadialMirrorPosX = new GuiNumberField(font, renderables, left + 58, y, 62, 18); textRadialMirrorPosX = new GuiNumberField(font, buttonList, left + 58, y, 62, 18);
textRadialMirrorPosX.setNumber(0); textRadialMirrorPosX.setNumber(0);
textRadialMirrorPosX.setTooltip( textRadialMirrorPosX.setTooltip(
Arrays.asList(Component.literal("The position of the radial mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); Arrays.asList(new StringTextComponent("The position of the radial mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
radialMirrorNumberFieldList.add(textRadialMirrorPosX); radialMirrorNumberFieldList.add(textRadialMirrorPosX);
textRadialMirrorPosY = new GuiNumberField(font, renderables, left + 138, y, 62, 18); textRadialMirrorPosY = new GuiNumberField(font, buttonList, left + 138, y, 62, 18);
textRadialMirrorPosY.setNumber(64); textRadialMirrorPosY.setNumber(64);
textRadialMirrorPosY.setTooltip(Arrays.asList(Component.literal("The position of the radial mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); textRadialMirrorPosY.setTooltip(Arrays.asList(new StringTextComponent("The position of the radial mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
radialMirrorNumberFieldList.add(textRadialMirrorPosY); radialMirrorNumberFieldList.add(textRadialMirrorPosY);
textRadialMirrorPosZ = new GuiNumberField(font, renderables, left + 218, y, 62, 18); textRadialMirrorPosZ = new GuiNumberField(font, buttonList, left + 218, y, 62, 18);
textRadialMirrorPosZ.setNumber(0); textRadialMirrorPosZ.setNumber(0);
textRadialMirrorPosZ.setTooltip(Arrays.asList(Component.literal("The position of the radial mirror."), Component.literal("For odd numbered builds add 0.5.").withStyle(ChatFormatting.GRAY))); textRadialMirrorPosZ.setTooltip(Arrays.asList(new StringTextComponent("The position of the radial mirror."), new StringTextComponent("For odd numbered builds add 0.5.").withStyle(TextFormatting.GRAY)));
radialMirrorNumberFieldList.add(textRadialMirrorPosZ); radialMirrorNumberFieldList.add(textRadialMirrorPosZ);
y = top + 47; y = top + 47;
textRadialMirrorSlices = new GuiNumberField(font, renderables, left + 55, y, 50, 18); textRadialMirrorSlices = new GuiNumberField(font, buttonList, left + 55, y, 50, 18);
textRadialMirrorSlices.setNumber(4); textRadialMirrorSlices.setNumber(4);
textRadialMirrorSlices.setTooltip(Arrays.asList(Component.literal("The number of repeating slices."), Component.literal("Minimally 2.").withStyle(ChatFormatting.GRAY))); textRadialMirrorSlices.setTooltip(Arrays.asList(new StringTextComponent("The number of repeating slices."), new StringTextComponent("Minimally 2.").withStyle(TextFormatting.GRAY)));
radialMirrorNumberFieldList.add(textRadialMirrorSlices); radialMirrorNumberFieldList.add(textRadialMirrorSlices);
textRadialMirrorRadius = new GuiNumberField(font, renderables, left + 218, y, 62, 18); textRadialMirrorRadius = new GuiNumberField(font, buttonList, left + 218, y, 62, 18);
textRadialMirrorRadius.setNumber(50); textRadialMirrorRadius.setNumber(50);
//TODO change to diameter (remove /2) //TODO change to diameter (remove /2)
textRadialMirrorRadius.setTooltip(Arrays.asList(Component.literal("How far the radial mirror reaches from its center position."), textRadialMirrorRadius.setTooltip(Arrays.asList(new StringTextComponent("How far the radial mirror reaches from its center position."),
Component.literal("Max: ").withStyle(ChatFormatting.GRAY).append(Component.literal(String.valueOf(ReachHelper.getMaxReach(mc.player) / 2)).withStyle(ChatFormatting.GOLD)), new StringTextComponent("Max: ").withStyle(TextFormatting.GRAY).append(new StringTextComponent(String.valueOf(ReachHelper.getMaxReach(mc.player) / 2)).withStyle(TextFormatting.GOLD)),
Component.literal("Upgradeable in survival with reach upgrades.").withStyle(ChatFormatting.GRAY))); new StringTextComponent("Upgradeable in survival with reach upgrades.").withStyle(TextFormatting.GRAY)));
radialMirrorNumberFieldList.add(textRadialMirrorRadius); radialMirrorNumberFieldList.add(textRadialMirrorRadius);
y = top + 72; y = top + 72;
buttonCurrentPosition = new GuiIconButton(left + 5, y, 0, 0, BUILDING_ICONS, button -> { buttonCurrentPosition = new GuiIconButton(left + 5, y, 0, 0, BUILDING_ICONS, button -> {
Vec3 pos = new Vec3(Math.floor(mc.player.getX()) + 0.5, Math.floor(mc.player.getY()) + 0.5, Math.floor(mc.player.getZ()) + 0.5); Vector3d pos = new Vector3d(Math.floor(mc.player.getX()) + 0.5, Math.floor(mc.player.getY()) + 0.5, Math.floor(mc.player.getZ()) + 0.5);
textRadialMirrorPosX.setNumber(pos.x); textRadialMirrorPosX.setNumber(pos.x);
textRadialMirrorPosY.setNumber(pos.y); textRadialMirrorPosY.setNumber(pos.y);
textRadialMirrorPosZ.setNumber(pos.z); textRadialMirrorPosZ.setNumber(pos.z);
}); });
buttonCurrentPosition.setTooltip(Component.literal("Set radial mirror position to current player position")); buttonCurrentPosition.setTooltip(new StringTextComponent("Set radial mirror position to current player position"));
radialMirrorIconButtonList.add(buttonCurrentPosition); radialMirrorIconButtonList.add(buttonCurrentPosition);
buttonToggleOdd = new GuiIconButton(left + 35, y, 0, 20, BUILDING_ICONS, button -> { buttonToggleOdd = new GuiIconButton(left + 35, y, 0, 20, BUILDING_ICONS, button -> {
toggleOdd = !toggleOdd; toggleOdd = !toggleOdd;
buttonToggleOdd.setUseAlternateIcon(toggleOdd); buttonToggleOdd.setUseAlternateIcon(toggleOdd);
if (toggleOdd) { if (toggleOdd) {
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to corner of block"), Component.literal("for even numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to corner of block"), new StringTextComponent("for even numbered builds")));
textRadialMirrorPosX.setNumber(textRadialMirrorPosX.getNumber() + 0.5); textRadialMirrorPosX.setNumber(textRadialMirrorPosX.getNumber() + 0.5);
textRadialMirrorPosY.setNumber(textRadialMirrorPosY.getNumber() + 0.5); textRadialMirrorPosY.setNumber(textRadialMirrorPosY.getNumber() + 0.5);
textRadialMirrorPosZ.setNumber(textRadialMirrorPosZ.getNumber() + 0.5); textRadialMirrorPosZ.setNumber(textRadialMirrorPosZ.getNumber() + 0.5);
} else { } else {
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
textRadialMirrorPosX.setNumber(Math.floor(textRadialMirrorPosX.getNumber())); textRadialMirrorPosX.setNumber(Math.floor(textRadialMirrorPosX.getNumber()));
textRadialMirrorPosY.setNumber(Math.floor(textRadialMirrorPosY.getNumber())); textRadialMirrorPosY.setNumber(Math.floor(textRadialMirrorPosY.getNumber()));
textRadialMirrorPosZ.setNumber(Math.floor(textRadialMirrorPosZ.getNumber())); textRadialMirrorPosZ.setNumber(Math.floor(textRadialMirrorPosZ.getNumber()));
} }
}); });
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set radial mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set radial mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
radialMirrorIconButtonList.add(buttonToggleOdd); radialMirrorIconButtonList.add(buttonToggleOdd);
buttonDrawLines = new GuiIconButton(left + 65, y, 0, 40, BUILDING_ICONS, button -> { buttonDrawLines = new GuiIconButton(left + 65, y, 0, 40, BUILDING_ICONS, button -> {
drawLines = !drawLines; drawLines = !drawLines;
buttonDrawLines.setUseAlternateIcon(drawLines); buttonDrawLines.setUseAlternateIcon(drawLines);
buttonDrawLines.setTooltip(Component.literal(drawLines ? "Hide lines" : "Show lines")); buttonDrawLines.setTooltip(new StringTextComponent(drawLines ? "Hide lines" : "Show lines"));
}); });
buttonDrawLines.setTooltip(Component.literal("Show lines")); buttonDrawLines.setTooltip(new StringTextComponent("Show lines"));
radialMirrorIconButtonList.add(buttonDrawLines); radialMirrorIconButtonList.add(buttonDrawLines);
buttonDrawPlanes = new GuiIconButton(left + 95, y, 0, 60, BUILDING_ICONS, button -> { buttonDrawPlanes = new GuiIconButton(left + 95, y, 0, 60, BUILDING_ICONS, button -> {
drawPlanes = !drawPlanes; drawPlanes = !drawPlanes;
buttonDrawPlanes.setUseAlternateIcon(drawPlanes); buttonDrawPlanes.setUseAlternateIcon(drawPlanes);
buttonDrawPlanes.setTooltip(Component.literal(drawPlanes ? "Hide area" : "Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent(drawPlanes ? "Hide area" : "Show area"));
}); });
buttonDrawPlanes.setTooltip(Component.literal("Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent("Show area"));
radialMirrorIconButtonList.add(buttonDrawPlanes); radialMirrorIconButtonList.add(buttonDrawPlanes);
y = top + 76; y = top + 76;
@@ -146,20 +146,20 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
drawPlanes = r.drawPlanes; drawPlanes = r.drawPlanes;
buttonDrawLines.setUseAlternateIcon(drawLines); buttonDrawLines.setUseAlternateIcon(drawLines);
buttonDrawPlanes.setUseAlternateIcon(drawPlanes); buttonDrawPlanes.setUseAlternateIcon(drawPlanes);
buttonDrawLines.setTooltip(Component.literal(drawLines ? "Hide lines" : "Show lines")); buttonDrawLines.setTooltip(new StringTextComponent(drawLines ? "Hide lines" : "Show lines"));
buttonDrawPlanes.setTooltip(Component.literal(drawPlanes ? "Hide area" : "Show area")); buttonDrawPlanes.setTooltip(new StringTextComponent(drawPlanes ? "Hide area" : "Show area"));
if (textRadialMirrorPosX.getNumber() == Math.floor(textRadialMirrorPosX.getNumber())) { if (textRadialMirrorPosX.getNumber() == Math.floor(textRadialMirrorPosX.getNumber())) {
toggleOdd = false; toggleOdd = false;
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set radial mirror position to middle of block"), Component.literal("for odd numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set radial mirror position to middle of block"), new StringTextComponent("for odd numbered builds")));
} else { } else {
toggleOdd = true; toggleOdd = true;
buttonToggleOdd.setTooltip(Arrays.asList(Component.literal("Set radial mirror position to corner of block"), Component.literal("for even numbered builds"))); buttonToggleOdd.setTooltip(Arrays.asList(new StringTextComponent("Set radial mirror position to corner of block"), new StringTextComponent("for even numbered builds")));
} }
buttonToggleOdd.setUseAlternateIcon(toggleOdd); buttonToggleOdd.setUseAlternateIcon(toggleOdd);
} }
renderables.addAll(radialMirrorButtonList); buttonList.addAll(radialMirrorButtonList);
renderables.addAll(radialMirrorIconButtonList); buttonList.addAll(radialMirrorIconButtonList);
setCollapsed(!buttonRadialMirrorEnabled.isChecked()); setCollapsed(!buttonRadialMirrorEnabled.isChecked());
} }
@@ -170,7 +170,7 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
@Override @Override
public void drawEntry(PoseStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, public void drawEntry(MatrixStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY,
boolean isSelected, float partialTicks) { boolean isSelected, float partialTicks) {
int yy = y; int yy = y;
@@ -178,7 +178,7 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
buttonRadialMirrorEnabled.render(ms, mouseX, mouseY, partialTicks); buttonRadialMirrorEnabled.render(ms, mouseX, mouseY, partialTicks);
if (buttonRadialMirrorEnabled.isChecked()) { if (buttonRadialMirrorEnabled.isChecked()) {
buttonRadialMirrorEnabled.setY(yy); buttonRadialMirrorEnabled.y = yy;
font.draw(ms, "Radial mirror enabled", left + offset, yy + 2, 0xFFFFFF); font.draw(ms, "Radial mirror enabled", left + offset, yy + 2, 0xFFFFFF);
yy = y + 18; yy = y + 18;
@@ -197,26 +197,26 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
textRadialMirrorRadius.y = yy - 3; textRadialMirrorRadius.y = yy - 3;
yy = y + 72; yy = y + 72;
buttonCurrentPosition.setY(yy); buttonCurrentPosition.y = yy;
buttonToggleOdd.setY(yy); buttonToggleOdd.y = yy;
buttonDrawLines.setY(yy); buttonDrawLines.y = yy;
buttonDrawPlanes.setY(yy); buttonDrawPlanes.y = yy;
yy = y + 76; yy = y + 76;
buttonRadialMirrorAlternate.setY(yy); buttonRadialMirrorAlternate.y = yy;
radialMirrorButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks)); radialMirrorButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks));
radialMirrorIconButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks)); radialMirrorIconButtonList.forEach(button -> button.render(ms, mouseX, mouseY, partialTicks));
radialMirrorNumberFieldList radialMirrorNumberFieldList
.forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks)); .forEach(numberField -> numberField.drawNumberField(ms, mouseX, mouseY, partialTicks));
} else { } else {
buttonRadialMirrorEnabled.setY(yy); buttonRadialMirrorEnabled.y = yy;
font.draw(ms, "Radial mirror disabled", left + offset, yy + 2, 0x999999); font.draw(ms, "Radial mirror disabled", left + offset, yy + 2, 0x999999);
} }
} }
public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY) {
//Draw tooltips last //Draw tooltips last
if (buttonRadialMirrorEnabled.isChecked()) { if (buttonRadialMirrorEnabled.isChecked()) {
radialMirrorIconButtonList.forEach(iconButton -> iconButton.drawTooltip(ms, scrollPane.parent, mouseX, mouseY)); radialMirrorIconButtonList.forEach(iconButton -> iconButton.drawTooltip(ms, scrollPane.parent, mouseX, mouseY));
@@ -250,9 +250,9 @@ public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry {
public RadialMirror.RadialMirrorSettings getRadialMirrorSettings() { public RadialMirror.RadialMirrorSettings getRadialMirrorSettings() {
boolean radialMirrorEnabled = buttonRadialMirrorEnabled.isChecked(); boolean radialMirrorEnabled = buttonRadialMirrorEnabled.isChecked();
Vec3 radialMirrorPos = new Vec3(0, 64, 0); Vector3d radialMirrorPos = new Vector3d(0, 64, 0);
try { try {
radialMirrorPos = new Vec3(textRadialMirrorPosX.getNumber(), textRadialMirrorPosY.getNumber(), textRadialMirrorPosZ radialMirrorPos = new Vector3d(textRadialMirrorPosX.getNumber(), textRadialMirrorPosY.getNumber(), textRadialMirrorPosZ
.getNumber()); .getNumber());
} catch (NumberFormatException | NullPointerException ex) { } catch (NumberFormatException | NullPointerException ex) {
EffortlessBuilding.log(mc.player, "Radial mirror position not a valid number."); EffortlessBuilding.log(mc.player, "Radial mirror position not a valid number.");

View File

@@ -1,11 +1,10 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.client.gui.ScreenUtils; import net.minecraftforge.fml.client.gui.GuiUtils;
import net.minecraftforge.client.gui.widget.ExtendedButton;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
@@ -13,13 +12,13 @@ import javax.annotation.ParametersAreNonnullByDefault;
* This class provides a checkbox style control. * This class provides a checkbox style control.
*/ */
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class GuiCheckBoxFixed extends ExtendedButton { public class GuiCheckBoxFixed extends Button {
private final int boxWidth; private final int boxWidth;
private boolean isChecked; private boolean isChecked;
public GuiCheckBoxFixed(int xPos, int yPos, String displayString, boolean isChecked) { public GuiCheckBoxFixed(int xPos, int yPos, String displayString, boolean isChecked) {
super(xPos, yPos, Minecraft.getInstance().font.width(displayString) + 2 + 11, 11, super(xPos, yPos, Minecraft.getInstance().font.width(displayString) + 2 + 11, 11, new StringTextComponent(displayString), b -> {
Component.literal(displayString), b -> {}, DEFAULT_NARRATION); });
this.isChecked = isChecked; this.isChecked = isChecked;
this.boxWidth = 11; this.boxWidth = 11;
this.height = 11; this.height = 11;
@@ -27,11 +26,11 @@ public class GuiCheckBoxFixed extends ExtendedButton {
} }
@Override @Override
public void renderButton(PoseStack ms, int mouseX, int mouseY, float partial) { public void renderButton(MatrixStack ms, int mouseX, int mouseY, float partial) {
if (this.visible) { if (this.visible) {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
this.isHovered = mouseX >= this.getX() && mouseY >= this.getY() && mouseX < this.getX() + this.boxWidth && mouseY < this.getY() + this.height; this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.boxWidth && mouseY < this.y + this.height;
ScreenUtils.blitWithBorder(ms, WIDGETS_LOCATION, this.getX(), this.getY(), 0, 46, this.boxWidth, this.height, 200, 20, 2, 3, 2, 2, this.getBlitOffset()); GuiUtils.drawContinuousTexturedBox(WIDGETS_LOCATION, this.x, this.y, 0, 46, this.boxWidth, this.height, 200, 20, 2, 3, 2, 2, this.getBlitOffset());
this.renderBg(ms, mc, mouseX, mouseY); this.renderBg(ms, mc, mouseX, mouseY);
int color = 14737632; int color = 14737632;
@@ -42,9 +41,9 @@ public class GuiCheckBoxFixed extends ExtendedButton {
} }
if (this.isChecked) if (this.isChecked)
drawCenteredString(ms, mc.font, "x", this.getX() + this.boxWidth / 2 + 1, this.getY() + 1, 14737632); drawCenteredString(ms, mc.font, "x", this.x + this.boxWidth / 2 + 1, this.y + 1, 14737632);
drawString(ms, mc.font, getMessage(), this.getX() + this.boxWidth + 2, this.getY() + 2, color); drawString(ms, mc.font, getMessage(), this.x + this.boxWidth + 2, this.y + 2, color);
} }
} }

View File

@@ -1,11 +1,10 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -15,7 +14,7 @@ import java.util.List;
public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScrollEntry { public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScrollEntry {
public GuiScrollPane scrollPane; public GuiScrollPane scrollPane;
protected Font font; protected FontRenderer font;
protected Minecraft mc; protected Minecraft mc;
protected boolean isCollapsed = true; protected boolean isCollapsed = true;
@@ -28,7 +27,7 @@ public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScroll
} }
@Override @Override
public void init(List<Renderable> renderables) { public void init(List<Widget> buttonList) {
left = scrollPane.getWidth() / 2 - 140; left = scrollPane.getWidth() / 2 - 140;
right = scrollPane.getWidth() / 2 + 140; right = scrollPane.getWidth() / 2 + 140;
top = scrollPane.getHeight() / 2 - 100; top = scrollPane.getHeight() / 2 - 100;
@@ -40,7 +39,7 @@ public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScroll
} }
@Override @Override
public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY) {
} }
@Override @Override

View File

@@ -1,14 +1,14 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.gui.widget.ExtendedButton;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList; import java.util.ArrayList;
@@ -17,19 +17,19 @@ import java.util.List;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public class GuiIconButton extends ExtendedButton { public class GuiIconButton extends Button {
private final ResourceLocation resourceLocation; private final ResourceLocation resourceLocation;
private final int iconX, iconY, iconWidth, iconHeight, iconAltX, iconAltY; private final int iconX, iconY, iconWidth, iconHeight, iconAltX, iconAltY;
List<Component> tooltip = new ArrayList<>(); List<ITextComponent> tooltip = new ArrayList<>();
private boolean useAltIcon = false; private boolean useAltIcon = false;
public GuiIconButton(int x, int y, int iconX, int iconY, ResourceLocation resourceLocation, Button.OnPress onPress) { public GuiIconButton(int x, int y, int iconX, int iconY, ResourceLocation resourceLocation, Button.IPressable onPress) {
this(x, y, 20, 20, iconX, iconY, 20, 20, 20, 0, resourceLocation, onPress); this(x, y, 20, 20, iconX, iconY, 20, 20, 20, 0, resourceLocation, onPress);
} }
public GuiIconButton(int x, int y, int width, int height, int iconX, int iconY, int iconWidth, int iconHeight, int iconAltX, int iconAltY, ResourceLocation resourceLocation, Button.OnPress onPress) { public GuiIconButton(int x, int y, int width, int height, int iconX, int iconY, int iconWidth, int iconHeight, int iconAltX, int iconAltY, ResourceLocation resourceLocation, Button.IPressable onPress) {
super(x, y, width, height, Component.empty(), onPress, DEFAULT_NARRATION); super(x, y, width, height, StringTextComponent.EMPTY, onPress);
this.iconX = iconX; this.iconX = iconX;
this.iconY = iconY; this.iconY = iconY;
this.iconWidth = iconWidth; this.iconWidth = iconWidth;
@@ -39,11 +39,11 @@ public class GuiIconButton extends ExtendedButton {
this.resourceLocation = resourceLocation; this.resourceLocation = resourceLocation;
} }
public void setTooltip(Component tooltip) { public void setTooltip(ITextComponent tooltip) {
setTooltip(Collections.singletonList(tooltip)); setTooltip(Collections.singletonList(tooltip));
} }
public void setTooltip(List<Component> tooltip) { public void setTooltip(List<ITextComponent> tooltip) {
this.tooltip = tooltip; this.tooltip = tooltip;
} }
@@ -52,11 +52,11 @@ public class GuiIconButton extends ExtendedButton {
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
super.render(ms, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
if (this.visible) { if (this.visible) {
this.isHovered = mouseX >= this.getX() && mouseY >= this.getY() && mouseX < this.getX() + this.width && mouseY < this.getY() + this.height; this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
RenderSystem.setShaderTexture(0, this.resourceLocation); Minecraft.getInstance().getTextureManager().bind(this.resourceLocation);
int currentIconX = this.iconX; int currentIconX = this.iconX;
int currentIconY = this.iconY; int currentIconY = this.iconY;
@@ -66,12 +66,12 @@ public class GuiIconButton extends ExtendedButton {
} }
//Draws a textured rectangle at the current z-value. Used to be drawTexturedModalRect in Gui. //Draws a textured rectangle at the current z-value. Used to be drawTexturedModalRect in Gui.
this.blit(ms, this.getX(), this.getY(), currentIconX, currentIconY, this.iconWidth, this.iconHeight); this.blit(ms, this.x, this.y, currentIconX, currentIconY, this.iconWidth, this.iconHeight);
} }
} }
public void drawTooltip(PoseStack ms, Screen screen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen screen, int mouseX, int mouseY) {
boolean flag = mouseX >= this.getX() && mouseX < this.getX() + width && mouseY >= this.getY() && mouseY < this.getY() + height; boolean flag = mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height;
if (flag) { if (flag) {
screen.renderComponentTooltip(ms, tooltip, mouseX - 10, mouseY + 25); screen.renderComponentTooltip(ms, tooltip, mouseX - 10, mouseY + 25);

View File

@@ -1,21 +1,20 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.ITextComponent;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.gui.widget.ExtendedButton;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.awt.*;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -25,31 +24,31 @@ import java.util.List;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class GuiNumberField extends GuiComponent { public class GuiNumberField extends AbstractGui {
public int x, y, width, height; public int x, y, width, height;
public int buttonWidth = 10; public int buttonWidth = 10;
protected EditBox textField; protected TextFieldWidget textField;
protected Button minusButton, plusButton; protected Button minusButton, plusButton;
List<Component> tooltip = new ArrayList<>(); List<ITextComponent> tooltip = new ArrayList<>();
public GuiNumberField(Font font, List<Renderable> renderables, int x, int y, int width, int height) { public GuiNumberField(FontRenderer font, List<Widget> buttonList, int x, int y, int width, int height) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.width = width; this.width = width;
this.height = height; this.height = height;
textField = new EditBox(font, x + buttonWidth + 1, y + 1, width - 2 * buttonWidth - 2, height - 2, Component.empty()); textField = new TextFieldWidget(font, x + buttonWidth + 1, y + 1, width - 2 * buttonWidth - 2, height - 2, StringTextComponent.EMPTY);
minusButton = new ExtendedButton(x, y - 1, buttonWidth, height + 2, Component.literal("-"), button -> { minusButton = new Button(x, y - 1, buttonWidth, height + 2, new StringTextComponent("-"), button -> {
float valueChanged = 1f; float valueChanged = 1f;
if (Screen.hasControlDown()) valueChanged = 5f; if (Screen.hasControlDown()) valueChanged = 5f;
if (Screen.hasShiftDown()) valueChanged = 10f; if (Screen.hasShiftDown()) valueChanged = 10f;
setNumber(getNumber() - valueChanged); setNumber(getNumber() - valueChanged);
}); });
plusButton = new ExtendedButton(x + width - buttonWidth, y - 1, buttonWidth, height + 2, Component.literal("+"), button -> { plusButton = new Button(x + width - buttonWidth, y - 1, buttonWidth, height + 2, new StringTextComponent("+"), button -> {
float valueChanged = 1f; float valueChanged = 1f;
if (Screen.hasControlDown()) valueChanged = 5f; if (Screen.hasControlDown()) valueChanged = 5f;
if (Screen.hasShiftDown()) valueChanged = 10f; if (Screen.hasShiftDown()) valueChanged = 10f;
@@ -57,8 +56,8 @@ public class GuiNumberField extends GuiComponent {
setNumber(getNumber() + valueChanged); setNumber(getNumber() + valueChanged);
}); });
renderables.add(minusButton); buttonList.add(minusButton);
renderables.add(plusButton); buttonList.add(plusButton);
} }
public double getNumber() { public double getNumber() {
@@ -74,11 +73,11 @@ public class GuiNumberField extends GuiComponent {
textField.setValue(DecimalFormat.getInstance().format(number)); textField.setValue(DecimalFormat.getInstance().format(number));
} }
public void setTooltip(Component tooltip) { public void setTooltip(ITextComponent tooltip) {
setTooltip(Collections.singletonList(tooltip)); setTooltip(Collections.singletonList(tooltip));
} }
public void setTooltip(List<Component> tooltip) { public void setTooltip(List<ITextComponent> tooltip) {
this.tooltip = tooltip; this.tooltip = tooltip;
} }
@@ -98,24 +97,24 @@ public class GuiNumberField extends GuiComponent {
return result; return result;
} }
public void drawNumberField(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void drawNumberField(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
textField.setY(y + 1); textField.y = y + 1;
minusButton.setY(y - 1); minusButton.y = y - 1;
plusButton.setY(y - 1); plusButton.y = y - 1;
textField.render(ms, mouseX, mouseY, partialTicks); textField.render(ms, mouseX, mouseY, partialTicks);
minusButton.render(ms, mouseX, mouseY, partialTicks); minusButton.render(ms, mouseX, mouseY, partialTicks);
plusButton.render(ms, mouseX, mouseY, partialTicks); plusButton.render(ms, mouseX, mouseY, partialTicks);
} }
public void drawTooltip(PoseStack ms, Screen screen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen screen, int mouseX, int mouseY) {
boolean insideTextField = mouseX >= x + buttonWidth && mouseX < x + width - buttonWidth && mouseY >= y && mouseY < y + height; boolean insideTextField = mouseX >= x + buttonWidth && mouseX < x + width - buttonWidth && mouseY >= y && mouseY < y + height;
boolean insideMinusButton = mouseX >= x && mouseX < x + buttonWidth && mouseY >= y && mouseY < y + height; boolean insideMinusButton = mouseX >= x && mouseX < x + buttonWidth && mouseY >= y && mouseY < y + height;
boolean insidePlusButton = mouseX >= x + width - buttonWidth && mouseX < x + width && mouseY >= y && mouseY < y + height; boolean insidePlusButton = mouseX >= x + width - buttonWidth && mouseX < x + width && mouseY >= y && mouseY < y + height;
// List<String> textLines = new ArrayList<>(); // List<String> textLines = new ArrayList<>();
List<Component> textLines = new ArrayList<>(); List<ITextComponent> textLines = new ArrayList<>();
if (insideTextField) { if (insideTextField) {
@@ -124,17 +123,17 @@ public class GuiNumberField extends GuiComponent {
} }
if (insideMinusButton) { if (insideMinusButton) {
textLines.add(Component.literal("Hold ").append(Component.literal("shift ").withStyle(ChatFormatting.AQUA)).append("for ") textLines.add(new StringTextComponent("Hold ").append(new StringTextComponent("shift ").withStyle(TextFormatting.AQUA)).append("for ")
.append(Component.literal("10").withStyle(ChatFormatting.RED))); .append(new StringTextComponent("10").withStyle(TextFormatting.RED)));
textLines.add(Component.literal("Hold ").append(Component.literal("ctrl ").withStyle(ChatFormatting.AQUA)).append("for ") textLines.add(new StringTextComponent("Hold ").append(new StringTextComponent("ctrl ").withStyle(TextFormatting.AQUA)).append("for ")
.append(Component.literal("5").withStyle(ChatFormatting.RED))); .append(new StringTextComponent("5").withStyle(TextFormatting.RED)));
} }
if (insidePlusButton) { if (insidePlusButton) {
textLines.add(Component.literal("Hold ").append(Component.literal("shift ").withStyle(ChatFormatting.DARK_GREEN)).append("for ") textLines.add(new StringTextComponent("Hold ").append(new StringTextComponent("shift ").withStyle(TextFormatting.DARK_GREEN)).append("for ")
.append(Component.literal("10").withStyle(ChatFormatting.RED))); .append(new StringTextComponent("10").withStyle(TextFormatting.RED)));
textLines.add(Component.literal("Hold ").append(Component.literal("ctrl ").withStyle(ChatFormatting.DARK_GREEN)).append("for ") textLines.add(new StringTextComponent("Hold ").append(new StringTextComponent("ctrl ").withStyle(TextFormatting.DARK_GREEN)).append("for ")
.append(Component.literal("5").withStyle(ChatFormatting.RED))); .append(new StringTextComponent("5").withStyle(TextFormatting.RED)));
} }
screen.renderComponentTooltip(ms, textLines, mouseX - 10, mouseY + 25); screen.renderComponentTooltip(ms, textLines, mouseX - 10, mouseY + 25);

View File

@@ -1,16 +1,18 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.IGuiEventListener;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Mth; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
@@ -25,14 +27,14 @@ import java.util.List;
public class GuiScrollPane extends SlotGui { public class GuiScrollPane extends SlotGui {
public Screen parent; public Screen parent;
public Font font; public FontRenderer font;
private final List<IScrollEntry> listEntries; private final List<IScrollEntry> listEntries;
private float scrollMultiplier = 1f; private float scrollMultiplier = 1f;
private int mouseX; private int mouseX;
private int mouseY; private int mouseY;
public GuiScrollPane(Screen parent, Font font, int top, int bottom) { public GuiScrollPane(Screen parent, FontRenderer font, int top, int bottom) {
super(Minecraft.getInstance(), parent.width, parent.height, top, bottom, 100); super(Minecraft.getInstance(), parent.width, parent.height, top, bottom, 100);
this.parent = parent; this.parent = parent;
this.font = font; this.font = font;
@@ -72,7 +74,7 @@ public class GuiScrollPane extends SlotGui {
//Removed background //Removed background
@Override @Override
public void render(PoseStack ms, int mouseXIn, int mouseYIn, float partialTicks) { public void render(MatrixStack ms, int mouseXIn, int mouseYIn, float partialTicks) {
if (this.visible) { if (this.visible) {
this.mouseX = mouseXIn; this.mouseX = mouseXIn;
this.mouseY = mouseYIn; this.mouseY = mouseYIn;
@@ -81,7 +83,7 @@ public class GuiScrollPane extends SlotGui {
int scrollbarRight = scrollbarLeft + 6; int scrollbarRight = scrollbarLeft + 6;
this.capYPosition(); this.capYPosition();
Tesselator tessellator = Tesselator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
int insideLeft = this.x0 + this.width / 2 - this.getRowWidth() / 2 + 2; int insideLeft = this.x0 + this.width / 2 - this.getRowWidth() / 2 + 2;
@@ -100,6 +102,8 @@ public class GuiScrollPane extends SlotGui {
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
RenderSystem.disableAlphaTest();
RenderSystem.shadeModel(7425);
RenderSystem.disableTexture(); RenderSystem.disableTexture();
//top //top
@@ -122,25 +126,25 @@ public class GuiScrollPane extends SlotGui {
int maxScroll = this.getMaxScroll(); int maxScroll = this.getMaxScroll();
if (maxScroll > 0) { if (maxScroll > 0) {
int k1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition()); int k1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition());
k1 = Mth.clamp(k1, 32, this.y1 - this.y0 - 8); k1 = MathHelper.clamp(k1, 32, this.y1 - this.y0 - 8);
int l1 = (int) this.yo * (this.y1 - this.y0 - k1) / maxScroll + this.y0; int l1 = (int) this.yo * (this.y1 - this.y0 - k1) / maxScroll + this.y0;
if (l1 < this.y0) { if (l1 < this.y0) {
l1 = this.y0; l1 = this.y0;
} }
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(scrollbarLeft, this.y1, 0.0F).uv(0.0F, 1.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(scrollbarLeft, this.y1, 0.0F).uv(0.0F, 1.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(scrollbarRight, this.y1, 0.0F).uv(1.0F, 1.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(scrollbarRight, this.y1, 0.0F).uv(1.0F, 1.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(scrollbarRight, this.y0, 0.0F).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(scrollbarRight, this.y0, 0.0F).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex();
bufferbuilder.vertex(scrollbarLeft, this.y0, 0.0F).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex(); bufferbuilder.vertex(scrollbarLeft, this.y0, 0.0F).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex();
tessellator.end(); tessellator.end();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(scrollbarLeft, l1 + k1, 0.0F).uv(0.0F, 1.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(scrollbarLeft, l1 + k1, 0.0F).uv(0.0F, 1.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(scrollbarRight, l1 + k1, 0.0F).uv(1.0F, 1.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(scrollbarRight, l1 + k1, 0.0F).uv(1.0F, 1.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(scrollbarRight, l1, 0.0F).uv(1.0F, 0.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(scrollbarRight, l1, 0.0F).uv(1.0F, 0.0F).color(128, 128, 128, 255).endVertex();
bufferbuilder.vertex(scrollbarLeft, l1, 0.0F).uv(0.0F, 0.0F).color(128, 128, 128, 255).endVertex(); bufferbuilder.vertex(scrollbarLeft, l1, 0.0F).uv(0.0F, 0.0F).color(128, 128, 128, 255).endVertex();
tessellator.end(); tessellator.end();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
bufferbuilder.vertex(scrollbarLeft, l1 + k1 - 1, 0.0F).uv(0.0F, 1.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(scrollbarLeft, l1 + k1 - 1, 0.0F).uv(0.0F, 1.0F).color(192, 192, 192, 255).endVertex();
bufferbuilder.vertex(scrollbarRight - 1, l1 + k1 - 1, 0.0F).uv(1.0F, 1.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(scrollbarRight - 1, l1 + k1 - 1, 0.0F).uv(1.0F, 1.0F).color(192, 192, 192, 255).endVertex();
bufferbuilder.vertex(scrollbarRight - 1, l1, 0.0F).uv(1.0F, 0.0F).color(192, 192, 192, 255).endVertex(); bufferbuilder.vertex(scrollbarRight - 1, l1, 0.0F).uv(1.0F, 0.0F).color(192, 192, 192, 255).endVertex();
@@ -150,6 +154,8 @@ public class GuiScrollPane extends SlotGui {
//this.renderDecorations(mouseXIn, mouseYIn); //this.renderDecorations(mouseXIn, mouseYIn);
RenderSystem.enableTexture(); RenderSystem.enableTexture();
RenderSystem.shadeModel(7424);
RenderSystem.enableAlphaTest();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
} }
} }
@@ -172,7 +178,7 @@ public class GuiScrollPane extends SlotGui {
} }
@Override @Override
protected void renderItem(PoseStack ms, int slotIndex, int xPos, int yPos, int heightIn, int mouseXIn, int mouseYIn, float partialTicks) { protected void renderItem(MatrixStack ms, int slotIndex, int xPos, int yPos, int heightIn, int mouseXIn, int mouseYIn, float partialTicks) {
this.getListEntry(slotIndex).drawEntry(ms, slotIndex, xPos, yPos, this.getRowWidth(), heightIn, mouseXIn, mouseYIn, this.getListEntry(slotIndex).drawEntry(ms, slotIndex, xPos, yPos, this.getRowWidth(), heightIn, mouseXIn, mouseYIn,
this.getSlotIndexFromScreenCoords(mouseXIn, mouseYIn) == slotIndex, partialTicks); this.getSlotIndexFromScreenCoords(mouseXIn, mouseYIn) == slotIndex, partialTicks);
} }
@@ -204,7 +210,7 @@ public class GuiScrollPane extends SlotGui {
} }
@Override @Override
public List<? extends GuiEventListener> children() { public List<? extends IGuiEventListener> children() {
return null; return null;
} }
@@ -299,7 +305,7 @@ public class GuiScrollPane extends SlotGui {
int l1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / int l1 = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) /
(float) this.getMaxPosition()); (float) this.getMaxPosition());
l1 = Mth.clamp(l1, 32, this.y1 - this.y0 - 8); l1 = MathHelper.clamp(l1, 32, this.y1 - this.y0 - 8);
this.scrollMultiplier /= (float) (this.y1 - this.y0 - l1) / (float) maxScroll; this.scrollMultiplier /= (float) (this.y1 - this.y0 - l1) / (float) maxScroll;
} else { } else {
this.scrollMultiplier = 1.0F; this.scrollMultiplier = 1.0F;
@@ -326,9 +332,9 @@ public class GuiScrollPane extends SlotGui {
//Draw in center if it fits //Draw in center if it fits
@Override @Override
protected void renderList(PoseStack ms, int insideLeft, int insideTop, int mouseXIn, int mouseYIn, float partialTicks) { protected void renderList(MatrixStack ms, int insideLeft, int insideTop, int mouseXIn, int mouseYIn, float partialTicks) {
int itemCount = this.getItemCount(); int itemCount = this.getItemCount();
Tesselator tessellator = Tesselator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
//Find y to start with //Find y to start with
@@ -355,15 +361,15 @@ public class GuiScrollPane extends SlotGui {
int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2; int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2;
RenderSystem.disableTexture(); RenderSystem.disableTexture();
float f = this.isFocused() ? 1.0F : 0.5F; float f = this.isFocused() ? 1.0F : 0.5F;
RenderSystem.setShaderColor(f, f, f, 1.0F); RenderSystem.color4f(f, f, f, 1.0F);
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); bufferbuilder.begin(7, DefaultVertexFormats.POSITION);
bufferbuilder.vertex(i1, y + entryHeight2 + 2, 0.0D).endVertex(); bufferbuilder.vertex(i1, y + entryHeight2 + 2, 0.0D).endVertex();
bufferbuilder.vertex(j1, y + entryHeight2 + 2, 0.0D).endVertex(); bufferbuilder.vertex(j1, y + entryHeight2 + 2, 0.0D).endVertex();
bufferbuilder.vertex(j1, y - 2, 0.0D).endVertex(); bufferbuilder.vertex(j1, y - 2, 0.0D).endVertex();
bufferbuilder.vertex(i1, y - 2, 0.0D).endVertex(); bufferbuilder.vertex(i1, y - 2, 0.0D).endVertex();
tessellator.end(); tessellator.end();
RenderSystem.setShaderColor(0.0F, 0.0F, 0.0F, 1.0F); RenderSystem.color4f(0.0F, 0.0F, 0.0F, 1.0F);
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); bufferbuilder.begin(7, DefaultVertexFormats.POSITION);
bufferbuilder.vertex(i1 + 1, y + entryHeight2 + 1, 0.0D).endVertex(); bufferbuilder.vertex(i1 + 1, y + entryHeight2 + 1, 0.0D).endVertex();
bufferbuilder.vertex(j1 - 1, y + entryHeight2 + 1, 0.0D).endVertex(); bufferbuilder.vertex(j1 - 1, y + entryHeight2 + 1, 0.0D).endVertex();
bufferbuilder.vertex(j1 - 1, y - 1, 0.0D).endVertex(); bufferbuilder.vertex(j1 - 1, y - 1, 0.0D).endVertex();
@@ -398,9 +404,9 @@ public class GuiScrollPane extends SlotGui {
} }
//PASSTHROUGHS //PASSTHROUGHS
public void init(List<Renderable> renderables) { public void init(List<Widget> buttonList) {
for (IScrollEntry entry : this.listEntries) { for (IScrollEntry entry : this.listEntries) {
entry.init(renderables); entry.init(buttonList);
} }
} }
@@ -409,7 +415,7 @@ public class GuiScrollPane extends SlotGui {
entry.updateScreen(); entry.updateScreen();
} }
public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { public void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY) {
for (IScrollEntry entry : this.listEntries) for (IScrollEntry entry : this.listEntries)
entry.drawTooltip(ms, guiScreen, mouseX, mouseY); entry.drawTooltip(ms, guiScreen, mouseX, mouseY);
} }
@@ -436,11 +442,11 @@ public class GuiScrollPane extends SlotGui {
} }
public interface IScrollEntry { public interface IScrollEntry {
void init(List<Renderable> renderables); void init(List<Widget> buttonList);
void updateScreen(); void updateScreen();
void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY); void drawTooltip(MatrixStack ms, Screen guiScreen, int mouseX, int mouseY);
boolean charTyped(char eventChar, int eventKey); boolean charTyped(char eventChar, int eventKey);
@@ -450,7 +456,7 @@ public class GuiScrollPane extends SlotGui {
void updatePosition(int slotIndex, int x, int y, float partialTicks); void updatePosition(int slotIndex, int x, int y, float partialTicks);
void drawEntry(PoseStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float partialTicks); void drawEntry(MatrixStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float partialTicks);
/** /**
* Called when the mouse is clicked within this entry. Returning true means that something within this entry was * Called when the mouse is clicked within this entry. Returning true means that something within this entry was

View File

@@ -1,13 +1,16 @@
package nl.requios.effortlessbuilding.gui.elements; package nl.requios.effortlessbuilding.gui.elements;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.FocusableGui;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.IGuiEventListener;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.IRenderable;
import net.minecraft.util.Mth; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -19,7 +22,7 @@ import java.util.List;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public abstract class SlotGui extends AbstractContainerEventHandler implements Renderable { public abstract class SlotGui extends FocusableGui implements IRenderable {
protected final Minecraft minecraft; protected final Minecraft minecraft;
protected final int itemHeight; protected final int itemHeight;
protected int width; protected int width;
@@ -53,7 +56,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
protected abstract int getItemCount(); protected abstract int getItemCount();
public List<? extends GuiEventListener> children() { public List<? extends IGuiEventListener> children() {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -72,9 +75,9 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
protected void updateItemPosition(int p_updateItemPosition_1_, int p_updateItemPosition_2_, int p_updateItemPosition_3_, float p_updateItemPosition_4_) { protected void updateItemPosition(int p_updateItemPosition_1_, int p_updateItemPosition_2_, int p_updateItemPosition_3_, float p_updateItemPosition_4_) {
} }
protected abstract void renderItem(PoseStack ms, int p_renderItem_1_, int p_renderItem_2_, int p_renderItem_3_, int p_renderItem_4_, int p_renderItem_5_, int p_renderItem_6_, float p_renderItem_7_); protected abstract void renderItem(MatrixStack ms, int p_renderItem_1_, int p_renderItem_2_, int p_renderItem_3_, int p_renderItem_4_, int p_renderItem_5_, int p_renderItem_6_, float p_renderItem_7_);
protected void renderHeader(int p_renderHeader_1_, int p_renderHeader_2_, Tesselator p_renderHeader_3_) { protected void renderHeader(int p_renderHeader_1_, int p_renderHeader_2_, Tessellator p_renderHeader_3_) {
} }
protected void clickedHeader(int p_clickedHeader_1_, int p_clickedHeader_2_) { protected void clickedHeader(int p_clickedHeader_1_, int p_clickedHeader_2_) {
@@ -83,13 +86,13 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
public int getItemAtPosition(double p_getItemAtPosition_1_, double p_getItemAtPosition_3_) { public int getItemAtPosition(double p_getItemAtPosition_1_, double p_getItemAtPosition_3_) {
int i = this.x0 + this.width / 2 - this.getRowWidth() / 2; int i = this.x0 + this.width / 2 - this.getRowWidth() / 2;
int j = this.x0 + this.width / 2 + this.getRowWidth() / 2; int j = this.x0 + this.width / 2 + this.getRowWidth() / 2;
int k = Mth.floor(p_getItemAtPosition_3_ - (double) this.y0) - this.headerHeight + (int) this.yo - 4; int k = MathHelper.floor(p_getItemAtPosition_3_ - (double) this.y0) - this.headerHeight + (int) this.yo - 4;
int l = k / this.itemHeight; int l = k / this.itemHeight;
return p_getItemAtPosition_1_ < (double) this.getScrollbarPosition() && p_getItemAtPosition_1_ >= (double) i && p_getItemAtPosition_1_ <= (double) j && l >= 0 && k >= 0 && l < this.getItemCount() ? l : -1; return p_getItemAtPosition_1_ < (double) this.getScrollbarPosition() && p_getItemAtPosition_1_ >= (double) i && p_getItemAtPosition_1_ <= (double) j && l >= 0 && k >= 0 && l < this.getItemCount() ? l : -1;
} }
protected void capYPosition() { protected void capYPosition() {
this.yo = Mth.clamp(this.yo, 0.0D, this.getMaxScroll()); this.yo = MathHelper.clamp(this.yo, 0.0D, this.getMaxScroll());
} }
public int getMaxScroll() { public int getMaxScroll() {
@@ -104,7 +107,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
return p_isMouseInList_3_ >= (double) this.y0 && p_isMouseInList_3_ <= (double) this.y1 && p_isMouseInList_1_ >= (double) this.x0 && p_isMouseInList_1_ <= (double) this.x1; return p_isMouseInList_3_ >= (double) this.y0 && p_isMouseInList_3_ <= (double) this.y1 && p_isMouseInList_1_ >= (double) this.x0 && p_isMouseInList_1_ <= (double) this.x1;
} }
public abstract void render(PoseStack ms, int p_render_1_, int p_render_2_, float p_render_3_); public abstract void render(MatrixStack ms, int p_render_1_, int p_render_2_, float p_render_3_);
protected void updateScrollingState(double p_updateScrollingState_1_, double p_updateScrollingState_3_, int p_updateScrollingState_5_) { protected void updateScrollingState(double p_updateScrollingState_1_, double p_updateScrollingState_3_, int p_updateScrollingState_5_) {
this.scrolling = p_updateScrollingState_5_ == 0 && p_updateScrollingState_1_ >= (double) this.getScrollbarPosition() && p_updateScrollingState_1_ < (double) (this.getScrollbarPosition() + 6); this.scrolling = p_updateScrollingState_5_ == 0 && p_updateScrollingState_1_ >= (double) this.getScrollbarPosition() && p_updateScrollingState_1_ < (double) (this.getScrollbarPosition() + 6);
@@ -155,7 +158,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
} }
int i = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition()); int i = (int) ((float) ((this.y1 - this.y0) * (this.y1 - this.y0)) / (float) this.getMaxPosition());
i = Mth.clamp(i, 32, this.y1 - this.y0 - 8); i = MathHelper.clamp(i, 32, this.y1 - this.y0 - 8);
double d1 = d0 / (double) (this.y1 - this.y0 - i); double d1 = d0 / (double) (this.y1 - this.y0 - i);
if (d1 < 1.0D) { if (d1 < 1.0D) {
d1 = 1.0D; d1 = 1.0D;
@@ -211,9 +214,9 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
return 220; return 220;
} }
protected void renderList(PoseStack ms, int p_renderList_1_, int p_renderList_2_, int p_renderList_3_, int p_renderList_4_, float p_renderList_5_) { protected void renderList(MatrixStack ms, int p_renderList_1_, int p_renderList_2_, int p_renderList_3_, int p_renderList_4_, float p_renderList_5_) {
int i = this.getItemCount(); int i = this.getItemCount();
Tesselator tessellator = Tesselator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
for (int j = 0; j < i; ++j) { for (int j = 0; j < i; ++j) {
@@ -228,15 +231,15 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements R
int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2; int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2;
RenderSystem.disableTexture(); RenderSystem.disableTexture();
float f = this.isFocused() ? 1.0F : 0.5F; float f = this.isFocused() ? 1.0F : 0.5F;
RenderSystem.setShaderColor(f, f, f, 1.0F); RenderSystem.color4f(f, f, f, 1.0F);
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); bufferbuilder.begin(7, DefaultVertexFormats.POSITION);
bufferbuilder.vertex(i1, k + l + 2, 0.0D).endVertex(); bufferbuilder.vertex(i1, k + l + 2, 0.0D).endVertex();
bufferbuilder.vertex(j1, k + l + 2, 0.0D).endVertex(); bufferbuilder.vertex(j1, k + l + 2, 0.0D).endVertex();
bufferbuilder.vertex(j1, k - 2, 0.0D).endVertex(); bufferbuilder.vertex(j1, k - 2, 0.0D).endVertex();
bufferbuilder.vertex(i1, k - 2, 0.0D).endVertex(); bufferbuilder.vertex(i1, k - 2, 0.0D).endVertex();
tessellator.end(); tessellator.end();
RenderSystem.setShaderColor(0.0F, 0.0F, 0.0F, 1.0F); RenderSystem.color4f(0.0F, 0.0F, 0.0F, 1.0F);
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); bufferbuilder.begin(7, DefaultVertexFormats.POSITION);
bufferbuilder.vertex(i1 + 1, k + l + 1, 0.0D).endVertex(); bufferbuilder.vertex(i1 + 1, k + l + 1, 0.0D).endVertex();
bufferbuilder.vertex(j1 - 1, k + l + 1, 0.0D).endVertex(); bufferbuilder.vertex(j1 - 1, k + l + 1, 0.0D).endVertex();
bufferbuilder.vertex(j1 - 1, k - 1, 0.0D).endVertex(); bufferbuilder.vertex(j1 - 1, k - 1, 0.0D).endVertex();

View File

@@ -1,14 +1,14 @@
package nl.requios.effortlessbuilding.helper; package nl.requios.effortlessbuilding.helper;
import net.minecraft.world.level.block.Block; import net.minecraft.block.Block;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
public class InventoryHelper { public class InventoryHelper {
public static ItemStack findItemStackInInventory(Player player, Block block) { public static ItemStack findItemStackInInventory(PlayerEntity player, Block block) {
for (ItemStack invStack : player.getInventory().items) { for (ItemStack invStack : player.inventory.items) {
if (!invStack.isEmpty() && invStack.getItem() instanceof BlockItem && if (!invStack.isEmpty() && invStack.getItem() instanceof BlockItem &&
((BlockItem) invStack.getItem()).getBlock().equals(block)) { ((BlockItem) invStack.getItem()).getBlock().equals(block)) {
return invStack; return invStack;
@@ -17,9 +17,9 @@ public class InventoryHelper {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
public static int findTotalBlocksInInventory(Player player, Block block) { public static int findTotalBlocksInInventory(PlayerEntity player, Block block) {
int total = 0; int total = 0;
for (ItemStack invStack : player.getInventory().items) { for (ItemStack invStack : player.inventory.items) {
if (!invStack.isEmpty() && invStack.getItem() instanceof BlockItem && if (!invStack.isEmpty() && invStack.getItem() instanceof BlockItem &&
((BlockItem) invStack.getItem()).getBlock().equals(block)) { ((BlockItem) invStack.getItem()).getBlock().equals(block)) {
total += invStack.getCount(); total += invStack.getCount();

View File

@@ -1,12 +1,12 @@
package nl.requios.effortlessbuilding.helper; package nl.requios.effortlessbuilding.helper;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Mth; import net.minecraft.util.math.MathHelper;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
public class ReachHelper { public class ReachHelper {
public static int getMaxReach(Player player) { public static int getMaxReach(PlayerEntity player) {
if (player.isCreative()) return BuildConfig.reach.maxReachCreative.get(); if (player.isCreative()) return BuildConfig.reach.maxReachCreative.get();
if (!BuildConfig.reach.enableReachUpgrades.get()) return BuildConfig.reach.maxReachLevel3.get(); if (!BuildConfig.reach.enableReachUpgrades.get()) return BuildConfig.reach.maxReachLevel3.get();
@@ -26,29 +26,29 @@ public class ReachHelper {
return BuildConfig.reach.maxReachLevel0.get(); return BuildConfig.reach.maxReachLevel0.get();
} }
public static int getPlacementReach(Player player) { public static int getPlacementReach(PlayerEntity player) {
return getMaxReach(player) / 4; return getMaxReach(player) / 4;
} }
public static int getMaxBlocksPlacedAtOnce(Player player) { public static int getMaxBlocksPlacedAtOnce(PlayerEntity player) {
if (player.isCreative()) return 1000000; if (player.isCreative()) return 1000000;
return Mth.ceil(Math.pow(getMaxReach(player), 1.6)); return MathHelper.ceil(Math.pow(getMaxReach(player), 1.6));
//Level 0: 121 //Level 0: 121
//Level 1: 523 //Level 1: 523
//Level 2: 1585 //Level 2: 1585
//Level 3: 4805 //Level 3: 4805
} }
public static int getMaxBlocksPerAxis(Player player) { public static int getMaxBlocksPerAxis(PlayerEntity player) {
if (player.isCreative()) return 2000; if (player.isCreative()) return 2000;
return Mth.ceil(getMaxReach(player) * 0.3); return MathHelper.ceil(getMaxReach(player) * 0.3);
//Level 0: 6 //Level 0: 6
//Level 1: 15 //Level 1: 15
//Level 2: 30 //Level 2: 30
//Level 3: 60 //Level 3: 60
} }
public static boolean canBreakFar(Player player) { public static boolean canBreakFar(PlayerEntity player) {
return player.isCreative(); return player.isCreative() || BuildConfig.survivalBalancers.breakFar.get();
} }
} }

View File

@@ -1,33 +1,27 @@
package nl.requios.effortlessbuilding.helper; package nl.requios.effortlessbuilding.helper;
import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.core.BlockPos; import net.minecraft.block.*;
import net.minecraft.core.Direction; import net.minecraft.block.material.Material;
import net.minecraft.core.Registry; import net.minecraft.entity.Entity;
import net.minecraft.core.registries.Registries; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.sounds.SoundSource; import net.minecraft.item.BlockItem;
import net.minecraft.tags.BlockTags; import net.minecraft.item.ItemStack;
import net.minecraft.world.InteractionHand; import net.minecraft.util.CachedBlockInfo;
import net.minecraft.world.entity.Entity; import net.minecraft.util.Direction;
import net.minecraft.world.entity.player.Player; import net.minecraft.util.Hand;
import net.minecraft.world.item.BlockItem; import net.minecraft.util.SoundCategory;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.level.Level; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.level.block.Block; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.World;
import net.minecraft.world.level.block.SlabBlock; import net.minecraftforge.common.ToolType;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.event.ForgeEventFactory;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class SurvivalHelper { public class SurvivalHelper {
@@ -35,13 +29,13 @@ public class SurvivalHelper {
//Used for all placing of blocks in this mod. //Used for all placing of blocks in this mod.
//Checks if area is loaded, if player has the right permissions, if existing block can be replaced (drops it if so) and consumes an item from the stack. //Checks if area is loaded, if player has the right permissions, if existing block can be replaced (drops it if so) and consumes an item from the stack.
//Based on ItemBlock#onItemUse //Based on ItemBlock#onItemUse
public static boolean placeBlock(Level world, Player player, BlockPos pos, BlockState blockState, public static boolean placeBlock(World world, PlayerEntity player, BlockPos pos, BlockState blockState,
ItemStack origstack, Direction facing, Vec3 hitVec, boolean skipPlaceCheck, ItemStack origstack, Direction facing, Vector3d hitVec, boolean skipPlaceCheck,
boolean skipCollisionCheck, boolean playSound) { boolean skipCollisionCheck, boolean playSound) {
if (!world.isLoaded(pos)) return false; if (!world.isLoaded(pos)) return false;
ItemStack itemstack = origstack; ItemStack itemstack = origstack;
if (blockState.isAir() || itemstack.isEmpty()) { if (blockState.getBlock().isAir(blockState, world, pos) || itemstack.isEmpty()) {
dropBlock(world, player, pos); dropBlock(world, player, pos);
world.removeBlock(pos, false); world.removeBlock(pos, false);
return true; return true;
@@ -68,15 +62,15 @@ public class SurvivalHelper {
if (!world.setBlock(pos, blockState, 3)) return false; if (!world.setBlock(pos, blockState, 3)) return false;
BlockItem.updateCustomBlockEntityTag(world, player, pos, itemstack); //Actually BlockItem::onBlockPlaced but that is protected BlockItem.updateCustomBlockEntityTag(world, player, pos, itemstack); //Actually BlockItem::onBlockPlaced but that is protected
block.setPlacedBy(world, pos, blockState, player, itemstack); block.setPlacedBy(world, pos, blockState, player, itemstack);
if (player instanceof ServerPlayer) { if (player instanceof ServerPlayerEntity) {
CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, pos, itemstack); CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, pos, itemstack);
} }
BlockState afterState = world.getBlockState(pos); BlockState afterState = world.getBlockState(pos);
if (playSound) { if (playSound) {
SoundType soundtype = afterState.getBlock().getSoundType(afterState, world, pos, player); SoundType soundtype = afterState.getBlock().getSoundType(afterState, world, pos, player);
world.playSound(null, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); world.playSound(null, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
} }
if (!player.isCreative() && Block.byItem(itemstack.getItem()) == block) { if (!player.isCreative() && Block.byItem(itemstack.getItem()) == block) {
@@ -114,7 +108,7 @@ public class SurvivalHelper {
//Used for all breaking of blocks in this mod. //Used for all breaking of blocks in this mod.
//Checks if area is loaded, if appropriate tool is used in survival mode, and drops the block directly into the players inventory //Checks if area is loaded, if appropriate tool is used in survival mode, and drops the block directly into the players inventory
public static boolean breakBlock(Level world, Player player, BlockPos pos, boolean skipChecks) { public static boolean breakBlock(World world, PlayerEntity player, BlockPos pos, boolean skipChecks) {
if (!world.isLoaded(pos) && !world.isEmptyBlock(pos)) return false; if (!world.isLoaded(pos) && !world.isEmptyBlock(pos)) return false;
//Check if can break //Check if can break
@@ -135,7 +129,7 @@ public class SurvivalHelper {
} }
//Gives items directly to player //Gives items directly to player
public static void dropBlock(Level world, Player player, BlockPos pos) { public static void dropBlock(World world, PlayerEntity player, BlockPos pos) {
if (player.isCreative()) return; if (player.isCreative()) return;
BlockState blockState = world.getBlockState(pos); BlockState blockState = world.getBlockState(pos);
@@ -186,7 +180,7 @@ public class SurvivalHelper {
* @param sidePlacedOn * @param sidePlacedOn
* @return Whether the player may place the block at pos with itemstack * @return Whether the player may place the block at pos with itemstack
*/ */
public static boolean canPlace(Level world, Player player, BlockPos pos, BlockState newBlockState, ItemStack itemStack, boolean skipCollisionCheck, Direction sidePlacedOn) { public static boolean canPlace(World world, PlayerEntity player, BlockPos pos, BlockState newBlockState, ItemStack itemStack, boolean skipCollisionCheck, Direction sidePlacedOn) {
//Check if itemstack is correct //Check if itemstack is correct
if (!(itemStack.getItem() instanceof BlockItem) || Block.byItem(itemStack.getItem()) != newBlockState.getBlock()) { if (!(itemStack.getItem() instanceof BlockItem) || Block.byItem(itemStack.getItem()) != newBlockState.getBlock()) {
@@ -204,49 +198,44 @@ public class SurvivalHelper {
} }
//Can be harvested with hand? (or in creative) //Can be harvested with hand? (or in creative)
private static boolean canReplace(Level world, Player player, BlockPos pos) { private static boolean canReplace(World world, PlayerEntity player, BlockPos pos) {
if (player.isCreative()) return true; if (player.isCreative()) return true;
BlockState state = world.getBlockState(pos); BlockState state = world.getBlockState(pos);
int miningLevel = BuildConfig.survivalBalancers.quickReplaceMiningLevel.get(); switch (BuildConfig.survivalBalancers.quickReplaceMiningLevel.get()) {
switch (miningLevel) {
case -1: case -1:
return !state.requiresCorrectToolForDrops(); return !state.requiresCorrectToolForDrops();
case 0: case 0:
return !state.is(BlockTags.NEEDS_STONE_TOOL) && return state.getBlock().getHarvestLevel(state) <= 0;
!state.is(BlockTags.NEEDS_IRON_TOOL) &&
!state.is(BlockTags.NEEDS_DIAMOND_TOOL);
case 1: case 1:
return !state.is(BlockTags.NEEDS_IRON_TOOL) && return state.getBlock().getHarvestLevel(state) <= 1;
!state.is(BlockTags.NEEDS_DIAMOND_TOOL);
case 2: case 2:
return !state.is(BlockTags.NEEDS_DIAMOND_TOOL); return state.getBlock().getHarvestLevel(state) <= 2;
case 3: case 3:
case 4: return state.getBlock().getHarvestLevel(state) <= 3;
return true;
} }
return false; return false;
} }
//From Player#mayUseItemAt //From EntityPlayer#canPlayerEdit
private static boolean canPlayerEdit(Player player, Level world, BlockPos pos, ItemStack stack) { private static boolean canPlayerEdit(PlayerEntity player, World world, BlockPos pos, ItemStack stack) {
if (!world.mayInteract(player, pos)) return false; if (!world.mayInteract(player, pos)) return false;
if (player.getAbilities().mayBuild) { if (player.abilities.mayBuild) {
//True in creative and survival mode //True in creative and survival mode
return true; return true;
} else { } else {
//Adventure mode //Adventure mode
BlockInWorld blockinworld = new BlockInWorld(world, pos, false); CachedBlockInfo blockworldstate = new CachedBlockInfo(world, pos, false);
Registry<Block> registry = world.registryAccess().registryOrThrow(Registries.BLOCK); return stack.hasAdventureModePlaceTagForBlock(world.getTagManager(), blockworldstate);
return stack.hasAdventureModePlaceTagForBlock(registry, blockinworld);
} }
} }
//From World#mayPlace //From World#mayPlace
private static boolean mayPlace(Level world, Block blockIn, BlockState newBlockState, BlockPos pos, boolean skipCollisionCheck, Direction sidePlacedOn, @Nullable Entity placer) { private static boolean mayPlace(World world, Block blockIn, BlockState newBlockState, BlockPos pos, boolean skipCollisionCheck, Direction sidePlacedOn, @Nullable Entity placer) {
BlockState iblockstate1 = world.getBlockState(pos); BlockState iblockstate1 = world.getBlockState(pos);
VoxelShape voxelShape = skipCollisionCheck ? null : blockIn.defaultBlockState().getCollisionShape(world, pos); VoxelShape voxelShape = skipCollisionCheck ? null : blockIn.defaultBlockState().getCollisionShape(world, pos);
@@ -255,7 +244,7 @@ public class SurvivalHelper {
} }
//Check if double slab //Check if double slab
if (placer != null && doesBecomeDoubleSlab(((Player) placer), pos, sidePlacedOn)) { if (placer != null && doesBecomeDoubleSlab(((PlayerEntity) placer), pos, sidePlacedOn)) {
return true; return true;
} }
@@ -271,7 +260,7 @@ public class SurvivalHelper {
} }
//Check quickreplace //Check quickreplace
if (placer instanceof Player && ModifierSettingsManager.getModifierSettings(((Player) placer)).doQuickReplace()) { if (placer instanceof PlayerEntity && ModifierSettingsManager.getModifierSettings(((PlayerEntity) placer)).doQuickReplace()) {
return true; return true;
} }
@@ -281,19 +270,48 @@ public class SurvivalHelper {
//Can break using held tool? (or in creative) //Can break using held tool? (or in creative)
public static boolean canBreak(Level world, Player player, BlockPos pos) { public static boolean canBreak(World world, PlayerEntity player, BlockPos pos) {
BlockState blockState = world.getBlockState(pos); BlockState blockState = world.getBlockState(pos);
if (!world.getFluidState(pos).isEmpty()) return false; if (!world.getFluidState(pos).isEmpty()) return false;
if (player.isCreative()) return true; if (player.isCreative()) return true;
return ForgeEventFactory.doPlayerHarvestCheck(player, blockState, true); return canHarvestBlock(blockState.getBlock(), player, world, pos);
} }
public static boolean doesBecomeDoubleSlab(Player player, BlockPos pos, Direction facing) { //From ForgeHooks#canHarvestBlock
public static boolean canHarvestBlock(@Nonnull Block block, @Nonnull PlayerEntity player, @Nonnull World world, @Nonnull BlockPos pos) {
BlockState state = world.getBlockState(pos);
//Dont break bedrock
if (state.getDestroySpeed(world, pos) < 0) {
return false;
}
if (!state.requiresCorrectToolForDrops()) {
return true;
}
ItemStack stack = player.getMainHandItem();
ToolType tool = block.getHarvestTool(state);
if (stack.isEmpty() || tool == null) {
return player.hasCorrectToolForDrops(state);
}
if (stack.getDamageValue() >= stack.getMaxDamage()) return false;
int toolLevel = stack.getItem().getHarvestLevel(stack, tool, player, state);
if (toolLevel < 0) {
return player.hasCorrectToolForDrops(state);
}
return toolLevel >= block.getHarvestLevel(state);
}
public static boolean doesBecomeDoubleSlab(PlayerEntity player, BlockPos pos, Direction facing) {
BlockState placedBlockState = player.level.getBlockState(pos); BlockState placedBlockState = player.level.getBlockState(pos);
ItemStack itemstack = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack itemstack = player.getItemInHand(Hand.MAIN_HAND);
if (CompatHelper.isItemBlockProxy(itemstack)) if (CompatHelper.isItemBlockProxy(itemstack))
itemstack = CompatHelper.getItemBlockFromStack(itemstack); itemstack = CompatHelper.getItemBlockFromStack(itemstack);

View File

@@ -1,26 +1,28 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.world.level.block.Block; import net.minecraft.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.world.level.material.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.world.MenuProvider; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.nbt.CompoundTag; import net.minecraft.item.*;
import net.minecraft.world.InteractionResultHolder; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.world.InteractionResult; import net.minecraft.util.ActionResult;
import net.minecraft.core.Direction; import net.minecraft.util.ActionResultType;
import net.minecraft.world.InteractionHand; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.Hand;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.network.chat.Component; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.level.Level; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
@@ -36,12 +38,6 @@ import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
public abstract class AbstractRandomizerBagItem extends Item { public abstract class AbstractRandomizerBagItem extends Item {
@@ -50,12 +46,12 @@ public abstract class AbstractRandomizerBagItem extends Item {
private static final Random rand = new Random(currentSeed); private static final Random rand = new Random(currentSeed);
public AbstractRandomizerBagItem() { public AbstractRandomizerBagItem() {
super(new Item.Properties().stacksTo(1)); super(new Item.Properties().tab(ItemGroup.TAB_TOOLS).stacksTo(1));
} }
public abstract int getInventorySize(); public abstract int getInventorySize();
public abstract MenuProvider getContainerProvider(ItemStack item); public abstract INamedContainerProvider getContainerProvider(ItemStack item);
/** /**
* Get the inventory of a randomizer bag by checking the capability. * Get the inventory of a randomizer bag by checking the capability.
@@ -116,40 +112,40 @@ public abstract class AbstractRandomizerBagItem extends Item {
} }
@Override @Override
public InteractionResult useOn(UseOnContext ctx) { public ActionResultType useOn(ItemUseContext ctx) {
Player player = ctx.getPlayer(); PlayerEntity player = ctx.getPlayer();
Level world = ctx.getLevel(); World world = ctx.getLevel();
BlockPos pos = ctx.getClickedPos(); BlockPos pos = ctx.getClickedPos();
Direction facing = ctx.getClickedFace(); Direction facing = ctx.getClickedFace();
ItemStack item = ctx.getItemInHand(); ItemStack item = ctx.getItemInHand();
Vec3 hitVec = ctx.getClickLocation(); Vector3d hitVec = ctx.getClickLocation();
if (player == null) return InteractionResult.FAIL; if (player == null) return ActionResultType.FAIL;
if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking() if (ctx.getPlayer() != null && ctx.getPlayer().isShiftKeyDown()) { //ctx.isPlacerSneaking()
if (world.isClientSide) return InteractionResult.SUCCESS; if (world.isClientSide) return ActionResultType.SUCCESS;
//Open inventory //Open inventory
NetworkHooks.openScreen((ServerPlayer) player, getContainerProvider(item)); NetworkHooks.openGui((ServerPlayerEntity) player, getContainerProvider(item));
} else { } else {
if (world.isClientSide) return InteractionResult.SUCCESS; if (world.isClientSide) return ActionResultType.SUCCESS;
//Only place manually if in normal vanilla mode //Only place manually if in normal vanilla mode
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) { if (buildMode != BuildModes.BuildModeEnum.NORMAL || modifierSettings.doQuickReplace()) {
return InteractionResult.FAIL; return ActionResultType.FAIL;
} }
//Use item //Use item
//Get bag inventory //Get bag inventory
//TODO offhand support //TODO offhand support
ItemStack bag = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack bag = player.getItemInHand(Hand.MAIN_HAND);
IItemHandler bagInventory = getBagInventory(bag); IItemHandler bagInventory = getBagInventory(bag);
if (bagInventory == null) if (bagInventory == null)
return InteractionResult.FAIL; return ActionResultType.FAIL;
ItemStack toPlace = pickRandomStack(bagInventory); ItemStack toPlace = pickRandomStack(bagInventory);
if (toPlace.isEmpty()) return InteractionResult.FAIL; if (toPlace.isEmpty()) return ActionResultType.FAIL;
//Previously: use onItemUse to place block (no synergy) //Previously: use onItemUse to place block (no synergy)
//bag.setItemDamage(toPlace.getMetadata()); //bag.setItemDamage(toPlace.getMetadata());
@@ -160,7 +156,7 @@ public abstract class AbstractRandomizerBagItem extends Item {
pos = pos.relative(facing); pos = pos.relative(facing);
} }
BlockPlaceContext blockItemUseContext = new BlockPlaceContext(new UseOnContext(player, InteractionHand.MAIN_HAND, new BlockHitResult(hitVec, facing, pos, false))); BlockItemUseContext blockItemUseContext = new BlockItemUseContext(new ItemUseContext(player, Hand.MAIN_HAND, new BlockRayTraceResult(hitVec, facing, pos, false)));
BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext); BlockState blockState = Block.byItem(toPlace.getItem()).getStateForPlacement(blockItemUseContext);
SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true); SurvivalHelper.placeBlock(world, player, pos, blockState, toPlace, facing, hitVec, false, false, true);
@@ -172,30 +168,30 @@ public abstract class AbstractRandomizerBagItem extends Item {
// Mirror.onBlockPlaced(placeEvent); // Mirror.onBlockPlaced(placeEvent);
// Array.onBlockPlaced(placeEvent); // Array.onBlockPlaced(placeEvent);
} }
return InteractionResult.SUCCESS; return ActionResultType.SUCCESS;
} }
@Override @Override
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) { public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
ItemStack bag = player.getItemInHand(hand); ItemStack bag = player.getItemInHand(hand);
if (player.isShiftKeyDown()) { if (player.isShiftKeyDown()) {
if (world.isClientSide) return new InteractionResultHolder<>(InteractionResult.SUCCESS, bag); if (world.isClientSide) return new ActionResult<>(ActionResultType.SUCCESS, bag);
//Open inventory //Open inventory
NetworkHooks.openScreen((ServerPlayer) player, getContainerProvider(bag)); NetworkHooks.openGui((ServerPlayerEntity) player, getContainerProvider(bag));
} else { } else {
//Use item //Use item
//Get bag inventory //Get bag inventory
IItemHandler bagInventory = getBagInventory(bag); IItemHandler bagInventory = getBagInventory(bag);
if (bagInventory == null) if (bagInventory == null)
return new InteractionResultHolder<>(InteractionResult.FAIL, bag); return new ActionResult<>(ActionResultType.FAIL, bag);
ItemStack toUse = pickRandomStack(bagInventory); ItemStack toUse = pickRandomStack(bagInventory);
if (toUse.isEmpty()) return new InteractionResultHolder<>(InteractionResult.FAIL, bag); if (toUse.isEmpty()) return new ActionResult<>(ActionResultType.FAIL, bag);
return toUse.use(world, player, hand); return toUse.use(world, player, hand);
} }
return new InteractionResultHolder<>(InteractionResult.PASS, bag); return new ActionResult<>(ActionResultType.PASS, bag);
} }
@Override @Override
@@ -205,16 +201,21 @@ public abstract class AbstractRandomizerBagItem extends Item {
@Nullable @Nullable
@Override @Override
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
return new ItemHandlerCapabilityProvider(getInventorySize()); return new ItemHandlerCapabilityProvider(getInventorySize());
} }
@Override @Override
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) { public void appendHoverText(ItemStack stack, @Nullable World world, List<ITextComponent> tooltip, ITooltipFlag flag) {
tooltip.add(Component.literal(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block")); tooltip.add(new StringTextComponent(TextFormatting.BLUE + "Rightclick" + TextFormatting.GRAY + " to place a random block"));
tooltip.add(Component.literal(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory")); tooltip.add(new StringTextComponent(TextFormatting.BLUE + "Sneak + rightclick" + TextFormatting.GRAY + " to open inventory"));
if (world != null && world.players().size() > 1) { if (world != null && world.players().size() > 1) {
tooltip.add(Component.literal(ChatFormatting.YELLOW + "Experimental on servers: may lose inventory")); tooltip.add(new StringTextComponent(TextFormatting.YELLOW + "Experimental on servers: may lose inventory"));
} }
} }
@Override
public String getDescriptionId() {
return this.getRegistryName().toString();
}
} }

View File

@@ -1,11 +1,12 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.network.chat.Component; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.MenuProvider; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.inventory.container.Container;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.item.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer; import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagContainer;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -19,11 +20,11 @@ public class DiamondRandomizerBagItem extends AbstractRandomizerBagItem{
} }
@Override @Override
public MenuProvider getContainerProvider(ItemStack bag) { public INamedContainerProvider getContainerProvider(ItemStack bag) {
return new ContainerProvider(bag); return new ContainerProvider(bag);
} }
public static class ContainerProvider implements MenuProvider { public static class ContainerProvider implements INamedContainerProvider {
private final ItemStack bag; private final ItemStack bag;
@@ -32,13 +33,13 @@ public class DiamondRandomizerBagItem extends AbstractRandomizerBagItem{
} }
@Override @Override
public Component getDisplayName() { public ITextComponent getDisplayName() {
return Component.translatable("item.effortlessbuilding.diamond_randomizer_bag"); return new TranslationTextComponent("effortlessbuilding:diamond_randomizer_bag");
} }
@Nullable @Nullable
@Override @Override
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { public Container createMenu(int containerId, PlayerInventory playerInventory, PlayerEntity player) {
return new DiamondRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); return new DiamondRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
} }
} }

View File

@@ -1,11 +1,12 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.network.chat.Component; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.MenuProvider; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.inventory.container.Container;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.item.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer; import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagContainer;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -19,11 +20,11 @@ public class GoldenRandomizerBagItem extends AbstractRandomizerBagItem{
} }
@Override @Override
public MenuProvider getContainerProvider(ItemStack bag) { public INamedContainerProvider getContainerProvider(ItemStack bag) {
return new ContainerProvider(bag); return new ContainerProvider(bag);
} }
public static class ContainerProvider implements MenuProvider { public static class ContainerProvider implements INamedContainerProvider {
private final ItemStack bag; private final ItemStack bag;
@@ -32,13 +33,13 @@ public class GoldenRandomizerBagItem extends AbstractRandomizerBagItem{
} }
@Override @Override
public Component getDisplayName() { public ITextComponent getDisplayName() {
return Component.translatable("item.effortlessbuilding.golden_randomizer_bag"); return new TranslationTextComponent("effortlessbuilding:golden_randomizer_bag");
} }
@Nullable @Nullable
@Override @Override
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { public Container createMenu(int containerId, PlayerInventory playerInventory, PlayerEntity player) {
return new GoldenRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); return new GoldenRandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
} }
} }

View File

@@ -1,16 +1,17 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.network.chat.Component; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.MenuProvider; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.inventory.container.Container;
import net.minecraft.world.entity.player.Player; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.item.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import nl.requios.effortlessbuilding.gui.RandomizerBagContainer; import nl.requios.effortlessbuilding.gui.RandomizerBagContainer;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class RandomizerBagItem extends AbstractRandomizerBagItem { public class RandomizerBagItem extends AbstractRandomizerBagItem{
public static final int INV_SIZE = 5; public static final int INV_SIZE = 5;
@Override @Override
@@ -19,11 +20,11 @@ public class RandomizerBagItem extends AbstractRandomizerBagItem {
} }
@Override @Override
public MenuProvider getContainerProvider(ItemStack bag) { public INamedContainerProvider getContainerProvider(ItemStack bag) {
return new ContainerProvider(bag); return new ContainerProvider(bag);
} }
public static class ContainerProvider implements MenuProvider { public static class ContainerProvider implements INamedContainerProvider {
private final ItemStack bag; private final ItemStack bag;
@@ -32,13 +33,13 @@ public class RandomizerBagItem extends AbstractRandomizerBagItem {
} }
@Override @Override
public Component getDisplayName() { public ITextComponent getDisplayName() {
return Component.translatable("item.effortlessbuilding.randomizer_bag"); return new TranslationTextComponent("effortlessbuilding:randomizer_bag");
} }
@Nullable @Nullable
@Override @Override
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { public Container createMenu(int containerId, PlayerInventory playerInventory, PlayerEntity player) {
return new RandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag)); return new RandomizerBagContainer(containerId, playerInventory, ((AbstractRandomizerBagItem)bag.getItem()).getBagInventory(bag));
} }
} }

View File

@@ -1,14 +1,16 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.Item; import net.minecraft.item.Item;
import net.minecraft.world.item.CreativeModeTab; import net.minecraft.item.ItemGroup;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.chat.Component; import net.minecraft.util.*;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.level.Level; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
@@ -18,26 +20,20 @@ import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List; import java.util.List;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class ReachUpgrade1Item extends Item { public class ReachUpgrade1Item extends Item {
public ReachUpgrade1Item() { public ReachUpgrade1Item() {
super(new Item.Properties().stacksTo(1)); super(new Item.Properties().tab(ItemGroup.TAB_TOOLS).stacksTo(1));
} }
@Override @Override
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) { public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (player.isCreative()) { if (player.isCreative()) {
if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative."); if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative.");
if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config."); if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config.");
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
@@ -48,22 +44,26 @@ public class ReachUpgrade1Item extends Item {
if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player)); if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player));
player.setItemInHand(hand, ItemStack.EMPTY); player.setItemInHand(hand, ItemStack.EMPTY);
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} else if (currentLevel > 0) { } else if (currentLevel > 0) {
if (world.isClientSide) if (world.isClientSide)
EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper
.getMaxReach(player) + "."); .getMaxReach(player) + ".");
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} }
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
@Override @Override
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) { public void appendHoverText(ItemStack stack, @Nullable World world, List<ITextComponent> tooltip, ITooltipFlag flag) {
tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + BuildConfig.reach.maxReachLevel1.get())); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Consume to increase reach to " + TextFormatting.BLUE + BuildConfig.reach.maxReachLevel1.get()));
} }
@Override
public String getDescriptionId() {
return this.getRegistryName().toString();
}
} }

View File

@@ -1,14 +1,16 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.Item; import net.minecraft.item.Item;
import net.minecraft.world.item.CreativeModeTab; import net.minecraft.item.ItemGroup;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.chat.Component; import net.minecraft.util.*;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.level.Level; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
@@ -16,29 +18,22 @@ import nl.requios.effortlessbuilding.helper.ReachHelper;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.awt.*;
import java.util.List; import java.util.List;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class ReachUpgrade2Item extends Item { public class ReachUpgrade2Item extends Item {
public ReachUpgrade2Item() { public ReachUpgrade2Item() {
super(new Item.Properties().stacksTo(1)); super(new Item.Properties().tab(ItemGroup.TAB_TOOLS).stacksTo(1));
} }
@Override @Override
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) { public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (player.isCreative()) { if (player.isCreative()) {
if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative."); if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative.");
if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config."); if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config.");
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
@@ -48,27 +43,32 @@ public class ReachUpgrade2Item extends Item {
if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player)); if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player));
player.setItemInHand(hand, ItemStack.EMPTY); player.setItemInHand(hand, ItemStack.EMPTY);
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} else if (currentLevel < 1) { } else if (currentLevel < 1) {
if (world.isClientSide) EffortlessBuilding.log(player, "Use Reach Upgrade 1 first."); if (world.isClientSide) EffortlessBuilding.log(player, "Use Reach Upgrade 1 first.");
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} else if (currentLevel > 1) { } else if (currentLevel > 1) {
if (world.isClientSide) if (world.isClientSide)
EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper
.getMaxReach(player) + "."); .getMaxReach(player) + ".");
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} }
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
@Override @Override
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) { public void appendHoverText(ItemStack stack, @Nullable World world, List<ITextComponent> tooltip, ITooltipFlag flag) {
tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + BuildConfig.reach.maxReachLevel2.get())); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Consume to increase reach to " + TextFormatting.BLUE + BuildConfig.reach.maxReachLevel2.get()));
tooltip.add(Component.literal(ChatFormatting.GRAY + "Previous upgrades need to be consumed first")); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Previous upgrades need to be consumed first"));
}
@Override
public String getDescriptionId() {
return this.getRegistryName().toString();
} }
} }

View File

@@ -1,14 +1,16 @@
package nl.requios.effortlessbuilding.item; package nl.requios.effortlessbuilding.item;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.Item; import net.minecraft.item.Item;
import net.minecraft.world.item.CreativeModeTab; import net.minecraft.item.ItemGroup;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.chat.Component; import net.minecraft.util.*;
import net.minecraft.ChatFormatting; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.level.Level; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
@@ -18,26 +20,20 @@ import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List; import java.util.List;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class ReachUpgrade3Item extends Item { public class ReachUpgrade3Item extends Item {
public ReachUpgrade3Item() { public ReachUpgrade3Item() {
super(new Item.Properties().stacksTo(1)); super(new Item.Properties().tab(ItemGroup.TAB_TOOLS).stacksTo(1));
} }
@Override @Override
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) { public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (player.isCreative()) { if (player.isCreative()) {
if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative."); if (world.isClientSide) EffortlessBuilding.log(player, "Reach upgrades are not necessary in creative.");
if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config."); if (world.isClientSide) EffortlessBuilding.log(player, "Still want increased reach? Use the config.");
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
@@ -47,7 +43,7 @@ public class ReachUpgrade3Item extends Item {
if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player)); if (world.isClientSide) EffortlessBuilding.log(player, "Upgraded reach to " + ReachHelper.getMaxReach(player));
player.setItemInHand(hand, ItemStack.EMPTY); player.setItemInHand(hand, ItemStack.EMPTY);
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} else if (currentLevel < 2) { } else if (currentLevel < 2) {
if (currentLevel == 0) if (currentLevel == 0)
@@ -55,23 +51,27 @@ public class ReachUpgrade3Item extends Item {
if (currentLevel == 1) if (currentLevel == 1)
if (world.isClientSide) EffortlessBuilding.log(player, "Use Reach Upgrade 2 first."); if (world.isClientSide) EffortlessBuilding.log(player, "Use Reach Upgrade 2 first.");
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} else if (currentLevel > 2) { } else if (currentLevel > 2) {
if (world.isClientSide) if (world.isClientSide)
EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper EffortlessBuilding.log(player, "Already used this upgrade! Current reach is " + ReachHelper
.getMaxReach(player) + "."); .getMaxReach(player) + ".");
SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather"));
player.playSound(soundEvent, 1f, 1f); player.playSound(soundEvent, 1f, 1f);
} }
return new InteractionResultHolder<>(InteractionResult.PASS, player.getItemInHand(hand)); return new ActionResult<>(ActionResultType.PASS, player.getItemInHand(hand));
} }
@Override @Override
public void appendHoverText(ItemStack stack, @Nullable Level world, List<Component> tooltip, TooltipFlag flag) { public void appendHoverText(ItemStack stack, @Nullable World world, List<ITextComponent> tooltip, ITooltipFlag flag) {
tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + BuildConfig.reach.maxReachLevel3.get())); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Consume to increase reach to " + TextFormatting.BLUE + BuildConfig.reach.maxReachLevel3.get()));
tooltip.add(Component.literal(ChatFormatting.GRAY + "Previous upgrades need to be consumed first")); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Previous upgrades need to be consumed first"));
} }
@Override
public String getDescriptionId() {
return this.getRegistryName().toString();
}
} }

View File

@@ -1,20 +1,16 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.level.block.Block; import net.minecraft.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.BlockSet; import nl.requios.effortlessbuilding.buildmodifier.BlockSet;
import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo;
import nl.requios.effortlessbuilding.render.BlockPreviewRenderer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -39,7 +35,7 @@ public class AddUndoMessage {
this.newBlockState = newBlockState; this.newBlockState = newBlockState;
} }
public static void encode(AddUndoMessage message, FriendlyByteBuf buf) { public static void encode(AddUndoMessage message, PacketBuffer buf) {
buf.writeInt(message.coordinate.getX()); buf.writeInt(message.coordinate.getX());
buf.writeInt(message.coordinate.getY()); buf.writeInt(message.coordinate.getY());
buf.writeInt(message.coordinate.getZ()); buf.writeInt(message.coordinate.getZ());
@@ -47,7 +43,7 @@ public class AddUndoMessage {
buf.writeInt(Block.getId(message.newBlockState)); buf.writeInt(Block.getId(message.newBlockState));
} }
public static AddUndoMessage decode(FriendlyByteBuf buf) { public static AddUndoMessage decode(PacketBuffer buf) {
BlockPos coordinate = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); BlockPos coordinate = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt());
BlockState previousBlockState = Block.stateById(buf.readInt()); BlockState previousBlockState = Block.stateById(buf.readInt());
BlockState newBlockState = Block.stateById(buf.readInt()); BlockState newBlockState = Block.stateById(buf.readInt());
@@ -71,17 +67,8 @@ public class AddUndoMessage {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) {
//Received clientside //Received clientside
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx));
}
});
ctx.get().setPacketHandled(true);
}
}
@OnlyIn(Dist.CLIENT) PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
public static class ClientHandler {
public static void handle(AddUndoMessage message, Supplier<NetworkEvent.Context> ctx) {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
//Add to undo stack clientside //Add to undo stack clientside
//Only the appropriate player that needs to add this to the undo stack gets this message //Only the appropriate player that needs to add this to the undo stack gets this message
UndoRedo.addUndo(player, new BlockSet( UndoRedo.addUndo(player, new BlockSet(
@@ -94,8 +81,11 @@ public class AddUndoMessage {
new ArrayList<BlockState>() {{ new ArrayList<BlockState>() {{
add(message.getNewBlockState()); add(message.getNewBlockState());
}}, }},
new Vec3(0, 0, 0), new Vector3d(0, 0, 0),
message.getCoordinate(), message.getCoordinate())); message.getCoordinate(), message.getCoordinate()));
} }
});
ctx.get().setPacketHandled(true);
}
} }
} }

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -20,30 +20,30 @@ public class BlockBrokenMessage {
private final boolean blockHit; private final boolean blockHit;
private final BlockPos blockPos; private final BlockPos blockPos;
private final Direction sideHit; private final Direction sideHit;
private final Vec3 hitVec; private final Vector3d hitVec;
public BlockBrokenMessage() { public BlockBrokenMessage() {
this.blockHit = false; this.blockHit = false;
this.blockPos = BlockPos.ZERO; this.blockPos = BlockPos.ZERO;
this.sideHit = Direction.UP; this.sideHit = Direction.UP;
this.hitVec = new Vec3(0, 0, 0); this.hitVec = new Vector3d(0, 0, 0);
} }
public BlockBrokenMessage(BlockHitResult result) { public BlockBrokenMessage(BlockRayTraceResult result) {
this.blockHit = result.getType() == HitResult.Type.BLOCK; this.blockHit = result.getType() == RayTraceResult.Type.BLOCK;
this.blockPos = result.getBlockPos(); this.blockPos = result.getBlockPos();
this.sideHit = result.getDirection(); this.sideHit = result.getDirection();
this.hitVec = result.getLocation(); this.hitVec = result.getLocation();
} }
public BlockBrokenMessage(boolean blockHit, BlockPos blockPos, Direction sideHit, Vec3 hitVec) { public BlockBrokenMessage(boolean blockHit, BlockPos blockPos, Direction sideHit, Vector3d hitVec) {
this.blockHit = blockHit; this.blockHit = blockHit;
this.blockPos = blockPos; this.blockPos = blockPos;
this.sideHit = sideHit; this.sideHit = sideHit;
this.hitVec = hitVec; this.hitVec = hitVec;
} }
public static void encode(BlockBrokenMessage message, FriendlyByteBuf buf) { public static void encode(BlockBrokenMessage message, PacketBuffer buf) {
buf.writeBoolean(message.blockHit); buf.writeBoolean(message.blockHit);
buf.writeInt(message.blockPos.getX()); buf.writeInt(message.blockPos.getX());
buf.writeInt(message.blockPos.getY()); buf.writeInt(message.blockPos.getY());
@@ -54,11 +54,11 @@ public class BlockBrokenMessage {
buf.writeDouble(message.hitVec.z); buf.writeDouble(message.hitVec.z);
} }
public static BlockBrokenMessage decode(FriendlyByteBuf buf) { public static BlockBrokenMessage decode(PacketBuffer buf) {
boolean blockHit = buf.readBoolean(); boolean blockHit = buf.readBoolean();
BlockPos blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); BlockPos blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt());
Direction sideHit = Direction.from3DDataValue(buf.readInt()); Direction sideHit = Direction.from3DDataValue(buf.readInt());
Vec3 hitVec = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); Vector3d hitVec = new Vector3d(buf.readDouble(), buf.readDouble(), buf.readDouble());
return new BlockBrokenMessage(blockHit, blockPos, sideHit, hitVec); return new BlockBrokenMessage(blockHit, blockPos, sideHit, hitVec);
} }
@@ -74,7 +74,7 @@ public class BlockBrokenMessage {
return sideHit; return sideHit;
} }
public Vec3 getHitVec() { public Vector3d getHitVec() {
return hitVec; return hitVec;
} }

View File

@@ -1,16 +1,13 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import nl.requios.effortlessbuilding.render.BlockPreviewRenderer;
@@ -25,26 +22,26 @@ public class BlockPlacedMessage {
private final boolean blockHit; private final boolean blockHit;
private final BlockPos blockPos; private final BlockPos blockPos;
private final Direction sideHit; private final Direction sideHit;
private final Vec3 hitVec; private final Vector3d hitVec;
private final boolean placeStartPos; //prevent double placing in normal mode private final boolean placeStartPos; //prevent double placing in normal mode
public BlockPlacedMessage() { public BlockPlacedMessage() {
this.blockHit = false; this.blockHit = false;
this.blockPos = BlockPos.ZERO; this.blockPos = BlockPos.ZERO;
this.sideHit = Direction.UP; this.sideHit = Direction.UP;
this.hitVec = new Vec3(0, 0, 0); this.hitVec = new Vector3d(0, 0, 0);
this.placeStartPos = true; this.placeStartPos = true;
} }
public BlockPlacedMessage(BlockHitResult result, boolean placeStartPos) { public BlockPlacedMessage(BlockRayTraceResult result, boolean placeStartPos) {
this.blockHit = result.getType() == HitResult.Type.BLOCK; this.blockHit = result.getType() == RayTraceResult.Type.BLOCK;
this.blockPos = result.getBlockPos(); this.blockPos = result.getBlockPos();
this.sideHit = result.getDirection(); this.sideHit = result.getDirection();
this.hitVec = result.getLocation(); this.hitVec = result.getLocation();
this.placeStartPos = placeStartPos; this.placeStartPos = placeStartPos;
} }
public BlockPlacedMessage(boolean blockHit, BlockPos blockPos, Direction sideHit, Vec3 hitVec, boolean placeStartPos) { public BlockPlacedMessage(boolean blockHit, BlockPos blockPos, Direction sideHit, Vector3d hitVec, boolean placeStartPos) {
this.blockHit = blockHit; this.blockHit = blockHit;
this.blockPos = blockPos; this.blockPos = blockPos;
this.sideHit = sideHit; this.sideHit = sideHit;
@@ -52,7 +49,7 @@ public class BlockPlacedMessage {
this.placeStartPos = placeStartPos; this.placeStartPos = placeStartPos;
} }
public static void encode(BlockPlacedMessage message, FriendlyByteBuf buf) { public static void encode(BlockPlacedMessage message, PacketBuffer buf) {
buf.writeBoolean(message.blockHit); buf.writeBoolean(message.blockHit);
buf.writeInt(message.blockPos.getX()); buf.writeInt(message.blockPos.getX());
buf.writeInt(message.blockPos.getY()); buf.writeInt(message.blockPos.getY());
@@ -64,11 +61,11 @@ public class BlockPlacedMessage {
buf.writeBoolean(message.placeStartPos); buf.writeBoolean(message.placeStartPos);
} }
public static BlockPlacedMessage decode(FriendlyByteBuf buf) { public static BlockPlacedMessage decode(PacketBuffer buf) {
boolean blockHit = buf.readBoolean(); boolean blockHit = buf.readBoolean();
BlockPos blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); BlockPos blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt());
Direction sideHit = Direction.from3DDataValue(buf.readInt()); Direction sideHit = Direction.from3DDataValue(buf.readInt());
Vec3 hitVec = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); Vector3d hitVec = new Vector3d(buf.readDouble(), buf.readDouble(), buf.readDouble());
boolean placeStartPos = buf.readBoolean(); boolean placeStartPos = buf.readBoolean();
return new BlockPlacedMessage(blockHit, blockPos, sideHit, hitVec, placeStartPos); return new BlockPlacedMessage(blockHit, blockPos, sideHit, hitVec, placeStartPos);
} }
@@ -85,7 +82,7 @@ public class BlockPlacedMessage {
return sideHit; return sideHit;
} }
public Vec3 getHitVec() { public Vector3d getHitVec() {
return hitVec; return hitVec;
} }
@@ -98,7 +95,8 @@ public class BlockPlacedMessage {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) {
//Received clientside //Received clientside
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); //Nod RenderHandler to do the dissolve shader effect
BlockPreviewRenderer.onBlocksPlaced();
} else { } else {
//Received serverside //Received serverside
BuildModes.onBlockPlacedMessage(ctx.get().getSender(), message); BuildModes.onBlockPlacedMessage(ctx.get().getSender(), message);
@@ -107,12 +105,4 @@ public class BlockPlacedMessage {
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
} }
} }
@OnlyIn(Dist.CLIENT)
public static class ClientHandler {
public static void handle(BlockPlacedMessage message, Supplier<NetworkEvent.Context> ctx) {
//Nod RenderHandler to do the dissolve shader effect
BlockPreviewRenderer.onBlocksPlaced();
}
}
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
@@ -13,17 +13,17 @@ import java.util.function.Supplier;
*/ */
public class CancelModeMessage { public class CancelModeMessage {
public static void encode(CancelModeMessage message, FriendlyByteBuf buf) { public static void encode(CancelModeMessage message, PacketBuffer buf) {
} }
public static CancelModeMessage decode(FriendlyByteBuf buf) { public static CancelModeMessage decode(PacketBuffer buf) {
return new CancelModeMessage(); return new CancelModeMessage();
} }
public static class Handler { public static class Handler {
public static void handle(CancelModeMessage message, Supplier<NetworkEvent.Context> ctx) { public static void handle(CancelModeMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
BuildModes.initializeMode(player); BuildModes.initializeMode(player);
}); });

View File

@@ -1,15 +1,11 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo;
import nl.requios.effortlessbuilding.render.BlockPreviewRenderer;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -21,11 +17,11 @@ public class ClearUndoMessage {
public ClearUndoMessage() { public ClearUndoMessage() {
} }
public static void encode(ClearUndoMessage message, FriendlyByteBuf buf) { public static void encode(ClearUndoMessage message, PacketBuffer buf) {
} }
public static ClearUndoMessage decode(FriendlyByteBuf buf) { public static ClearUndoMessage decode(PacketBuffer buf) {
return new ClearUndoMessage(); return new ClearUndoMessage();
} }
@@ -34,20 +30,13 @@ public class ClearUndoMessage {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) {
//Received clientside //Received clientside
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
//Add to undo stack clientside
UndoRedo.clear(player);
} }
}); });
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
} }
} }
@OnlyIn(Dist.CLIENT)
public static class ClientHandler {
public static void handle(ClearUndoMessage message, Supplier<NetworkEvent.Context> ctx) {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
//Add to undo stack clientside
UndoRedo.clear(player);
}
}
} }

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
@@ -22,11 +22,11 @@ public class ModeActionMessage {
this.action = action; this.action = action;
} }
public static void encode(ModeActionMessage message, FriendlyByteBuf buf) { public static void encode(ModeActionMessage message, PacketBuffer buf) {
buf.writeInt(message.action.ordinal()); buf.writeInt(message.action.ordinal());
} }
public static ModeActionMessage decode(FriendlyByteBuf buf) { public static ModeActionMessage decode(PacketBuffer buf) {
ModeOptions.ActionEnum action = ModeOptions.ActionEnum.values()[buf.readInt()]; ModeOptions.ActionEnum action = ModeOptions.ActionEnum.values()[buf.readInt()];
return new ModeActionMessage(action); return new ModeActionMessage(action);
} }
@@ -34,7 +34,7 @@ public class ModeActionMessage {
public static class Handler { public static class Handler {
public static void handle(ModeActionMessage message, Supplier<NetworkEvent.Context> ctx) { public static void handle(ModeActionMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
ModeOptions.performAction(player, message.action); ModeOptions.performAction(player, message.action);
}); });

View File

@@ -1,8 +1,8 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
@@ -24,11 +24,11 @@ public class ModeSettingsMessage {
this.modeSettings = modeSettings; this.modeSettings = modeSettings;
} }
public static void encode(ModeSettingsMessage message, FriendlyByteBuf buf) { public static void encode(ModeSettingsMessage message, PacketBuffer buf) {
buf.writeInt(message.modeSettings.getBuildMode().ordinal()); buf.writeInt(message.modeSettings.getBuildMode().ordinal());
} }
public static ModeSettingsMessage decode(FriendlyByteBuf buf) { public static ModeSettingsMessage decode(PacketBuffer buf) {
BuildModes.BuildModeEnum buildMode = BuildModes.BuildModeEnum.values()[buf.readInt()]; BuildModes.BuildModeEnum buildMode = BuildModes.BuildModeEnum.values()[buf.readInt()];
return new ModeSettingsMessage(new ModeSettings(buildMode)); return new ModeSettingsMessage(new ModeSettings(buildMode));
@@ -37,7 +37,7 @@ public class ModeSettingsMessage {
public static class Handler { public static class Handler {
public static void handle(ModeSettingsMessage message, Supplier<NetworkEvent.Context> ctx) { public static void handle(ModeSettingsMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
// Sanitize // Sanitize
ModeSettingsManager.sanitize(message.modeSettings, player); ModeSettingsManager.sanitize(message.modeSettings, player);

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.Array; import nl.requios.effortlessbuilding.buildmodifier.Array;
import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.Mirror;
@@ -13,6 +13,8 @@ import nl.requios.effortlessbuilding.buildmodifier.RadialMirror;
import java.util.function.Supplier; import java.util.function.Supplier;
import static nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.ModifierSettings;
/** /**
@@ -29,7 +31,7 @@ public class ModifierSettingsMessage {
this.modifierSettings = modifierSettings; this.modifierSettings = modifierSettings;
} }
public static void encode(ModifierSettingsMessage message, FriendlyByteBuf buf) { public static void encode(ModifierSettingsMessage message, PacketBuffer buf) {
//MIRROR //MIRROR
Mirror.MirrorSettings m = message.modifierSettings.getMirrorSettings(); Mirror.MirrorSettings m = message.modifierSettings.getMirrorSettings();
buf.writeBoolean(m != null); buf.writeBoolean(m != null);
@@ -77,12 +79,12 @@ public class ModifierSettingsMessage {
} }
} }
public static ModifierSettingsMessage decode(FriendlyByteBuf buf) { public static ModifierSettingsMessage decode(PacketBuffer buf) {
//MIRROR //MIRROR
Mirror.MirrorSettings m = new Mirror.MirrorSettings(); Mirror.MirrorSettings m = new Mirror.MirrorSettings();
if (buf.readBoolean()) { if (buf.readBoolean()) {
boolean mirrorEnabled = buf.readBoolean(); boolean mirrorEnabled = buf.readBoolean();
Vec3 mirrorPosition = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); Vector3d mirrorPosition = new Vector3d(buf.readDouble(), buf.readDouble(), buf.readDouble());
boolean mirrorX = buf.readBoolean(); boolean mirrorX = buf.readBoolean();
boolean mirrorY = buf.readBoolean(); boolean mirrorY = buf.readBoolean();
boolean mirrorZ = buf.readBoolean(); boolean mirrorZ = buf.readBoolean();
@@ -110,7 +112,7 @@ public class ModifierSettingsMessage {
RadialMirror.RadialMirrorSettings r = new RadialMirror.RadialMirrorSettings(); RadialMirror.RadialMirrorSettings r = new RadialMirror.RadialMirrorSettings();
if (buf.readBoolean()) { if (buf.readBoolean()) {
boolean radialMirrorEnabled = buf.readBoolean(); boolean radialMirrorEnabled = buf.readBoolean();
Vec3 radialMirrorPosition = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); Vector3d radialMirrorPosition = new Vector3d(buf.readDouble(), buf.readDouble(), buf.readDouble());
int radialMirrorSlices = buf.readInt(); int radialMirrorSlices = buf.readInt();
boolean radialMirrorAlternate = buf.readBoolean(); boolean radialMirrorAlternate = buf.readBoolean();
int radialMirrorRadius = buf.readInt(); int radialMirrorRadius = buf.readInt();
@@ -127,7 +129,7 @@ public class ModifierSettingsMessage {
public static class Handler { public static class Handler {
public static void handle(ModifierSettingsMessage message, Supplier<NetworkEvent.Context> ctx) { public static void handle(ModifierSettingsMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
// Sanitize // Sanitize
ModifierSettingsManager.sanitize(message.modifierSettings, player); ModifierSettingsManager.sanitize(message.modifierSettings, player);

View File

@@ -1,18 +1,18 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.fml.network.simple.SimpleChannel;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
public class PacketHandler { public class PacketHandler {
private static final String PROTOCOL_VERSION = "1"; private static final String PROTOCOL_VERSION = "1";
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( public static final SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder
new ResourceLocation(EffortlessBuilding.MODID, "main"), .named(new ResourceLocation(EffortlessBuilding.MODID, "main_channel"))
() -> PROTOCOL_VERSION, .clientAcceptedVersions(PROTOCOL_VERSION::equals)
PROTOCOL_VERSION::equals, .serverAcceptedVersions(PROTOCOL_VERSION::equals)
PROTOCOL_VERSION::equals .networkProtocolVersion(() -> PROTOCOL_VERSION)
); .simpleChannel();
public static void register() { public static void register() {
int id = 0; int id = 0;

View File

@@ -1,17 +1,13 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.proxy.ClientProxy;
import nl.requios.effortlessbuilding.render.BlockPreviewRenderer;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -30,11 +26,11 @@ public class RequestLookAtMessage {
this.placeStartPos = placeStartPos; this.placeStartPos = placeStartPos;
} }
public static void encode(RequestLookAtMessage message, FriendlyByteBuf buf) { public static void encode(RequestLookAtMessage message, PacketBuffer buf) {
buf.writeBoolean(message.placeStartPos); buf.writeBoolean(message.placeStartPos);
} }
public static RequestLookAtMessage decode(FriendlyByteBuf buf) { public static RequestLookAtMessage decode(PacketBuffer buf) {
boolean placeStartPos = buf.readBoolean(); boolean placeStartPos = buf.readBoolean();
return new RequestLookAtMessage(placeStartPos); return new RequestLookAtMessage(placeStartPos);
} }
@@ -48,26 +44,19 @@ public class RequestLookAtMessage {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) {
//Received clientside //Received clientside
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(message, ctx)); //Send back your info
PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
//Prevent double placing in normal mode with placeStartPos false
//Unless QuickReplace is on, then we do need to place start pos.
if (ClientProxy.previousLookAt.getType() == RayTraceResult.Type.BLOCK) {
PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage((BlockRayTraceResult) ClientProxy.previousLookAt, message.getPlaceStartPos()));
} else {
PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage());
}
} }
}); });
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
} }
} }
@OnlyIn(Dist.CLIENT)
public static class ClientHandler {
public static void handle(RequestLookAtMessage message, Supplier<NetworkEvent.Context> ctx) {
//Send back your info
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
//Prevent double placing in normal mode with placeStartPos false
//Unless QuickReplace is on, then we do need to place start pos.
if (ClientProxy.previousLookAt.getType() == HitResult.Type.BLOCK) {
PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage((BlockHitResult) ClientProxy.previousLookAt, message.getPlaceStartPos()));
} else {
PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage());
}
}
}
} }

View File

@@ -1,16 +1,13 @@
package nl.requios.effortlessbuilding.network; package nl.requios.effortlessbuilding.network;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* Send packet to client to translate and log the containing message
*/
public class TranslatedLogMessage { public class TranslatedLogMessage {
private final String prefix; private final String prefix;
private final String translationKey; private final String translationKey;
@@ -31,14 +28,14 @@ public class TranslatedLogMessage {
this.actionBar = actionBar; this.actionBar = actionBar;
} }
public static void encode(TranslatedLogMessage message, FriendlyByteBuf buf) { public static void encode(TranslatedLogMessage message, PacketBuffer buf) {
buf.writeUtf(message.prefix); buf.writeUtf(message.prefix);
buf.writeUtf(message.translationKey); buf.writeUtf(message.translationKey);
buf.writeUtf(message.suffix); buf.writeUtf(message.suffix);
buf.writeBoolean(message.actionBar); buf.writeBoolean(message.actionBar);
} }
public static TranslatedLogMessage decode(FriendlyByteBuf buf) { public static TranslatedLogMessage decode(PacketBuffer buf) {
return new TranslatedLogMessage(buf.readUtf(), buf.readUtf(), buf.readUtf(), buf.readBoolean()); return new TranslatedLogMessage(buf.readUtf(), buf.readUtf(), buf.readUtf(), buf.readBoolean());
} }
@@ -64,7 +61,7 @@ public class TranslatedLogMessage {
if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) { if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT) {
//Received clientside //Received clientside
Player player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx); PlayerEntity player = EffortlessBuilding.proxy.getPlayerEntityFromContext(ctx);
EffortlessBuilding.logTranslate(player, message.prefix, message.translationKey, message.suffix, message.actionBar); EffortlessBuilding.logTranslate(player, message.prefix, message.translationKey, message.suffix, message.actionBar);
} }
}); });

View File

@@ -1,40 +1,41 @@
package nl.requios.effortlessbuilding.proxy; package nl.requios.effortlessbuilding.proxy;
import net.minecraft.MethodsReturnNonnullByDefault; import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.block.BlockState;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.SoundType;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.ScreenManager;
import net.minecraft.client.resources.language.I18n; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.KeyMapping; import net.minecraft.client.resources.I18n;
import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.world.entity.player.Player; import net.minecraft.client.util.InputMappings;
import net.minecraft.world.item.BlockItem; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.BlockItem;
import net.minecraft.world.InteractionHand; import net.minecraft.item.ItemStack;
import net.minecraft.sounds.SoundSource; import net.minecraft.util.Hand;
import net.minecraft.core.BlockPos; import net.minecraft.util.SoundCategory;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.level.ClipContext; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceContext;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.ChatFormatting; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.level.Level; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.client.settings.KeyConflictContext; import net.minecraftforge.client.settings.KeyConflictContext;
import net.minecraftforge.client.settings.KeyModifier; import net.minecraftforge.client.settings.KeyModifier;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DeferredWorkQueue;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
@@ -49,6 +50,7 @@ import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu;
import nl.requios.effortlessbuilding.gui.buildmodifier.ModifierSettingsGui; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifierSettingsGui;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.network.*; import nl.requios.effortlessbuilding.network.*;
import nl.requios.effortlessbuilding.render.ShaderHandler;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
@@ -58,12 +60,13 @@ import java.util.function.Supplier;
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class ClientProxy implements IProxy { public class ClientProxy implements IProxy {
public static KeyMapping[] keyBindings; public static KeyBinding[] keyBindings;
public static HitResult previousLookAt; public static RayTraceResult previousLookAt;
public static HitResult currentLookAt; public static RayTraceResult currentLookAt;
public static int ticksInGame = 0; public static int ticksInGame = 0;
private static int placeCooldown = 0; private static int placeCooldown = 0;
private static int breakCooldown = 0; private static int breakCooldown = 0;
private static boolean shadersInitialized = false;
@Override @Override
public void setup(FMLCommonSetupEvent event) { public void setup(FMLCommonSetupEvent event) {
@@ -71,11 +74,25 @@ public class ClientProxy implements IProxy {
@Override @Override
public void clientSetup(FMLClientSetupEvent event) { public void clientSetup(FMLClientSetupEvent event) {
//Keybindings are setup and registered in ModClientEventHandler // register key bindings
keyBindings = new KeyBinding[6];
MenuScreens.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new); // instantiate the key bindings
MenuScreens.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new); keyBindings[0] = new KeyBinding("key.effortlessbuilding.hud.desc", KeyConflictContext.UNIVERSAL, InputMappings.getKey(GLFW.GLFW_KEY_KP_ADD, 0), "key.effortlessbuilding.category");
MenuScreens.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new); keyBindings[1] = new KeyBinding("key.effortlessbuilding.replace.desc", KeyConflictContext.IN_GAME, InputMappings.getKey(GLFW.GLFW_KEY_KP_SUBTRACT, 0), "key.effortlessbuilding.category");
keyBindings[2] = new KeyBinding("key.effortlessbuilding.mode.desc", KeyConflictContext.IN_GAME, InputMappings.getKey(GLFW.GLFW_KEY_LEFT_ALT, 0), "key.effortlessbuilding.category");
keyBindings[3] = new KeyBinding("key.effortlessbuilding.undo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputMappings.getKey(GLFW.GLFW_KEY_Z, 0), "key.effortlessbuilding.category");
keyBindings[4] = new KeyBinding("key.effortlessbuilding.redo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, InputMappings.getKey(GLFW.GLFW_KEY_Y, 0), "key.effortlessbuilding.category");
keyBindings[5] = new KeyBinding("key.effortlessbuilding.altplacement.desc", KeyConflictContext.IN_GAME, InputMappings.getKey(GLFW.GLFW_KEY_LEFT_CONTROL, 0), "key.effortlessbuilding.category");
// register all the key bindings
for (KeyBinding keyBinding : keyBindings) {
ClientRegistry.registerKeyBinding(keyBinding);
}
ScreenManager.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new);
ScreenManager.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new);
ScreenManager.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new);
} }
@SubscribeEvent @SubscribeEvent
@@ -85,7 +102,7 @@ public class ClientProxy implements IProxy {
onMouseInput(); onMouseInput();
//Update previousLookAt //Update previousLookAt
HitResult objectMouseOver = Minecraft.getInstance().hitResult; RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult;
//Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS) //Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS)
if (objectMouseOver == null) return; if (objectMouseOver == null) return;
@@ -95,33 +112,40 @@ public class ClientProxy implements IProxy {
return; return;
} }
if (objectMouseOver.getType() == HitResult.Type.BLOCK) { if (objectMouseOver.getType() == RayTraceResult.Type.BLOCK) {
if (currentLookAt.getType() != HitResult.Type.BLOCK) { if (currentLookAt.getType() != RayTraceResult.Type.BLOCK) {
currentLookAt = objectMouseOver; currentLookAt = objectMouseOver;
previousLookAt = objectMouseOver; previousLookAt = objectMouseOver;
} else { } else {
if (((BlockHitResult) currentLookAt).getBlockPos() != ((BlockHitResult) objectMouseOver).getBlockPos()) { if (((BlockRayTraceResult) currentLookAt).getBlockPos() != ((BlockRayTraceResult) objectMouseOver).getBlockPos()) {
previousLookAt = currentLookAt; previousLookAt = currentLookAt;
currentLookAt = objectMouseOver; currentLookAt = objectMouseOver;
} }
} }
} }
} else if (event.phase == TickEvent.Phase.END) { } else if (event.phase == TickEvent.Phase.END) {
Screen gui = Minecraft.getInstance().screen; Screen gui = Minecraft.getInstance().screen;
if (gui == null || !gui.isPauseScreen()) { if (gui == null || !gui.isPauseScreen()) {
ticksInGame++; ticksInGame++;
} }
//Init shaders in the first tick. Doing it anywhere before this seems to crash the game.
if (!shadersInitialized) {
ShaderHandler.init();
shadersInitialized = true;
}
} }
} }
private static void onMouseInput() { private static void onMouseInput() {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
LocalPlayer player = mc.player; ClientPlayerEntity player = mc.player;
if (player == null) return; if (player == null) return;
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
if (mc.screen != null || if (Minecraft.getInstance().screen != null ||
buildMode == BuildModes.BuildModeEnum.NORMAL || buildMode == BuildModes.BuildModeEnum.NORMAL ||
RadialMenu.instance.isVisible()) { RadialMenu.instance.isVisible()) {
return; return;
@@ -134,16 +158,16 @@ public class ClientProxy implements IProxy {
if (placeCooldown <= 0) { if (placeCooldown <= 0) {
placeCooldown = 4; placeCooldown = 4;
ItemStack currentItemStack = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack currentItemStack = player.getItemInHand(Hand.MAIN_HAND);
if (currentItemStack.getItem() instanceof BlockItem || if (currentItemStack.getItem() instanceof BlockItem ||
(CompatHelper.isItemBlockProxy(currentItemStack) && !player.isShiftKeyDown())) { (CompatHelper.isItemBlockProxy(currentItemStack) && !player.isShiftKeyDown())) {
ItemStack itemStack = CompatHelper.getItemBlockFromStack(currentItemStack); ItemStack itemStack = CompatHelper.getItemBlockFromStack(currentItemStack);
//find position in distance //find position in distance
HitResult lookingAt = getLookingAt(player); RayTraceResult lookingAt = getLookingAt(player);
if (lookingAt != null && lookingAt.getType() == HitResult.Type.BLOCK) { if (lookingAt != null && lookingAt.getType() == RayTraceResult.Type.BLOCK) {
BlockHitResult blockLookingAt = (BlockHitResult) lookingAt; BlockRayTraceResult blockLookingAt = (BlockRayTraceResult) lookingAt;
BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage(blockLookingAt, true)); BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage(blockLookingAt, true));
PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage(blockLookingAt, true)); PacketHandler.INSTANCE.sendToServer(new BlockPlacedMessage(blockLookingAt, true));
@@ -155,9 +179,9 @@ public class ClientProxy implements IProxy {
BlockState state = ((BlockItem) itemStack.getItem()).getBlock().defaultBlockState(); BlockState state = ((BlockItem) itemStack.getItem()).getBlock().defaultBlockState();
BlockPos blockPos = blockLookingAt.getBlockPos(); BlockPos blockPos = blockLookingAt.getBlockPos();
SoundType soundType = state.getBlock().getSoundType(state, player.level, blockPos, player); SoundType soundType = state.getBlock().getSoundType(state, player.level, blockPos, player);
player.level.playSound(player, player.blockPosition(), soundType.getPlaceSound(), SoundSource.BLOCKS, player.level.playSound(player, player.blockPosition(), soundType.getPlaceSound(), SoundCategory.BLOCKS,
0.4f, soundType.getPitch()); 0.4f, soundType.getPitch());
player.swing(InteractionHand.MAIN_HAND); player.swing(Hand.MAIN_HAND);
} }
} else { } else {
BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage()); BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage());
@@ -178,9 +202,15 @@ public class ClientProxy implements IProxy {
if (breakCooldown <= 0) { if (breakCooldown <= 0) {
breakCooldown = 4; breakCooldown = 4;
HitResult lookingAt = getLookingAt(player); //Early out if cant break far, coming from own mouse event (not block broken event)
if (lookingAt != null && lookingAt.getType() == HitResult.Type.BLOCK) { //To make breaking blocks in survival possible like array
BlockHitResult blockLookingAt = (BlockHitResult) lookingAt; //TODO this causes not being able to cancel placement in survival
// moving it to after buildmodes fixes that, but introduces this bug
if (!ReachHelper.canBreakFar(player)) return;
RayTraceResult lookingAt = getLookingAt(player);
if (lookingAt != null && lookingAt.getType() == RayTraceResult.Type.BLOCK) {
BlockRayTraceResult blockLookingAt = (BlockRayTraceResult) lookingAt;
BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage(blockLookingAt)); BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage(blockLookingAt));
PacketHandler.INSTANCE.sendToServer(new BlockBrokenMessage(blockLookingAt)); PacketHandler.INSTANCE.sendToServer(new BlockBrokenMessage(blockLookingAt));
@@ -191,9 +221,9 @@ public class ClientProxy implements IProxy {
BlockPos blockPos = blockLookingAt.getBlockPos(); BlockPos blockPos = blockLookingAt.getBlockPos();
BlockState state = player.level.getBlockState(blockPos); BlockState state = player.level.getBlockState(blockPos);
SoundType soundtype = state.getBlock().getSoundType(state, player.level, blockPos, player); SoundType soundtype = state.getBlock().getSoundType(state, player.level, blockPos, player);
player.level.playSound(player, player.blockPosition(), soundtype.getBreakSound(), SoundSource.BLOCKS, player.level.playSound(player, player.blockPosition(), soundtype.getBreakSound(), SoundCategory.BLOCKS,
0.4f, soundtype.getPitch()); 0.4f, soundtype.getPitch());
player.swing(InteractionHand.MAIN_HAND); player.swing(Hand.MAIN_HAND);
} }
} else { } else {
BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage()); BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage());
@@ -212,8 +242,8 @@ public class ClientProxy implements IProxy {
} }
@SubscribeEvent(receiveCanceled = true) @SubscribeEvent(receiveCanceled = true)
public static void onKeyPress(InputEvent.Key event) { public static void onKeyPress(InputEvent.KeyInputEvent event) {
LocalPlayer player = Minecraft.getInstance().player; ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null) if (player == null)
return; return;
@@ -227,7 +257,7 @@ public class ClientProxy implements IProxy {
if (keyBindings[1].consumeClick()) { if (keyBindings[1].consumeClick()) {
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
modifierSettings.setQuickReplace(!modifierSettings.doQuickReplace()); modifierSettings.setQuickReplace(!modifierSettings.doQuickReplace());
EffortlessBuilding.log(player, "Set " + ChatFormatting.GOLD + "Quick Replace " + ChatFormatting.RESET + ( EffortlessBuilding.log(player, "Set " + TextFormatting.GOLD + "Quick Replace " + TextFormatting.RESET + (
modifierSettings.doQuickReplace() ? "on" : "off")); modifierSettings.doQuickReplace() ? "on" : "off"));
PacketHandler.INSTANCE.sendToServer(new ModifierSettingsMessage(modifierSettings)); PacketHandler.INSTANCE.sendToServer(new ModifierSettingsMessage(modifierSettings));
} }
@@ -274,12 +304,11 @@ public class ClientProxy implements IProxy {
} }
} }
} }
} }
public static void openModifierSettings() { public static void openModifierSettings() {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
LocalPlayer player = mc.player; PlayerEntity player = mc.player;
if (player == null) return; if (player == null) return;
//Disabled if max reach is 0, might be set in the config that way. //Disabled if max reach is 0, might be set in the config that way.
@@ -296,39 +325,39 @@ public class ClientProxy implements IProxy {
} }
@SubscribeEvent @SubscribeEvent
public static void onGuiOpen(ScreenEvent event) { public static void onGuiOpen(GuiOpenEvent event) {
Player player = Minecraft.getInstance().player; PlayerEntity player = Minecraft.getInstance().player;
if (player != null) { if (player != null) {
BuildModes.initializeMode(player); BuildModes.initializeMode(player);
} }
} }
public static boolean isKeybindDown(int keybindIndex) { public static boolean isKeybindDown(int keybindIndex) {
return InputConstants.isKeyDown( return InputMappings.isKeyDown(
Minecraft.getInstance().getWindow().getWindow(), Minecraft.getInstance().getWindow().getWindow(),
ClientProxy.keyBindings[2].getKey().getValue()); ClientProxy.keyBindings[2].getKey().getValue());
} }
public static HitResult getLookingAt(Player player) { public static RayTraceResult getLookingAt(PlayerEntity player) {
Level world = player.level; World world = player.level;
//base distance off of player ability (config) //base distance off of player ability (config)
float raytraceRange = ReachHelper.getPlacementReach(player); float raytraceRange = ReachHelper.getPlacementReach(player);
Vec3 look = player.getLookAngle(); Vector3d look = player.getLookAngle();
Vec3 start = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); Vector3d start = new Vector3d(player.getX(), player.getY() + player.getEyeHeight(), player.getZ());
Vec3 end = new Vec3(player.getX() + look.x * raytraceRange, player.getY() + player.getEyeHeight() + look.y * raytraceRange, player.getZ() + look.z * raytraceRange); Vector3d end = new Vector3d(player.getX() + look.x * raytraceRange, player.getY() + player.getEyeHeight() + look.y * raytraceRange, player.getZ() + look.z * raytraceRange);
// return player.rayTrace(raytraceRange, 1f, RayTraceFluidMode.NEVER); // return player.rayTrace(raytraceRange, 1f, RayTraceFluidMode.NEVER);
//TODO 1.14 check if correct //TODO 1.14 check if correct
return world.clip(new ClipContext(start, end, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player)); return world.clip(new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, player));
} }
public Player getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx) { public PlayerEntity getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx) {
return (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT ? Minecraft.getInstance().player : ctx.get().getSender()); return (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT ? Minecraft.getInstance().player : ctx.get().getSender());
} }
@Override @Override
public void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { public void logTranslate(PlayerEntity player, String prefix, String translationKey, String suffix, boolean actionBar) {
EffortlessBuilding.log(Minecraft.getInstance().player, prefix + I18n.get(translationKey) + suffix, actionBar); EffortlessBuilding.log(Minecraft.getInstance().player, prefix + I18n.get(translationKey) + suffix, actionBar);
} }
} }

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.proxy; package nl.requios.effortlessbuilding.proxy;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -12,7 +12,7 @@ public interface IProxy {
void clientSetup(final FMLClientSetupEvent event); void clientSetup(final FMLClientSetupEvent event);
Player getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx); PlayerEntity getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx);
void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar); void logTranslate(PlayerEntity player, String prefix, String translationKey, String suffix, boolean actionBar);
} }

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.proxy; package nl.requios.effortlessbuilding.proxy;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor;
import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.network.PacketHandler;
import nl.requios.effortlessbuilding.network.TranslatedLogMessage; import nl.requios.effortlessbuilding.network.TranslatedLogMessage;
@@ -22,12 +22,12 @@ public class ServerProxy implements IProxy {
public void clientSetup(FMLClientSetupEvent event) { public void clientSetup(FMLClientSetupEvent event) {
} }
public Player getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx) { public PlayerEntity getPlayerEntityFromContext(Supplier<NetworkEvent.Context> ctx) {
return ctx.get().getSender(); return ctx.get().getSender();
} }
@Override @Override
public void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { public void logTranslate(PlayerEntity player, String prefix, String translationKey, String suffix, boolean actionBar) {
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new TranslatedLogMessage(prefix, translationKey, suffix, actionBar)); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), new TranslatedLogMessage(prefix, translationKey, suffix, actionBar));
} }
} }

View File

@@ -1,23 +1,23 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.world.level.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.world.entity.player.Player; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.core.Direction; import net.minecraft.util.Direction;
import net.minecraft.sounds.SoundSource; import net.minecraft.util.SoundCategory;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.Mth; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.phys.HitResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
@@ -32,7 +32,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.Modif
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.RandomizerBagItem;
import nl.requios.effortlessbuilding.proxy.ClientProxy; import nl.requios.effortlessbuilding.proxy.ClientProxy;
import java.util.ArrayList; import java.util.ArrayList;
@@ -49,7 +49,7 @@ public class BlockPreviewRenderer {
private static BlockPos previousSecondPos; private static BlockPos previousSecondPos;
private static int soundTime = 0; private static int soundTime = 0;
public static void render(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Player player, ModifierSettings modifierSettings, ModeSettings modeSettings) { public static void render(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings) {
//Render placed blocks with dissolve effect //Render placed blocks with dissolve effect
//Use fancy shader if config allows, otherwise no dissolve //Use fancy shader if config allows, otherwise no dissolve
@@ -58,7 +58,7 @@ public class BlockPreviewRenderer {
PlacedData placed = placedDataList.get(i); PlacedData placed = placedDataList.get(i);
if (placed.coordinates != null && !placed.coordinates.isEmpty()) { if (placed.coordinates != null && !placed.coordinates.isEmpty()) {
double totalTime = Mth.clampedLerp(30, 60, placed.firstPos.distSqr(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get(); double totalTime = MathHelper.clampedLerp(30, 60, placed.firstPos.distSqr(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get();
float dissolve = (ClientProxy.ticksInGame - placed.time) / (float) totalTime; float dissolve = (ClientProxy.ticksInGame - placed.time) / (float) totalTime;
renderBlockPreviews(matrixStack, renderTypeBuffer, placed.coordinates, placed.blockStates, placed.itemStacks, dissolve, placed.firstPos, placed.secondPos, false, placed.breaking); renderBlockPreviews(matrixStack, renderTypeBuffer, placed.coordinates, placed.blockStates, placed.itemStacks, dissolve, placed.firstPos, placed.secondPos, false, placed.breaking);
} }
@@ -66,37 +66,37 @@ public class BlockPreviewRenderer {
} }
//Expire //Expire
placedDataList.removeIf(placed -> { placedDataList.removeIf(placed -> {
double totalTime = Mth.clampedLerp(30, 60, placed.firstPos.distSqr(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get(); double totalTime = MathHelper.clampedLerp(30, 60, placed.firstPos.distSqr(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get();
return placed.time + totalTime < ClientProxy.ticksInGame; return placed.time + totalTime < ClientProxy.ticksInGame;
}); });
//Render block previews //Render block previews
HitResult lookingAt = ClientProxy.getLookingAt(player); RayTraceResult lookingAt = ClientProxy.getLookingAt(player);
if (modeSettings.getBuildMode() == BuildModes.BuildModeEnum.NORMAL) if (modeSettings.getBuildMode() == BuildModes.BuildModeEnum.NORMAL)
lookingAt = Minecraft.getInstance().hitResult; lookingAt = Minecraft.getInstance().hitResult;
ItemStack mainhand = player.getMainHandItem(); ItemStack mainhand = player.getMainHandItem();
boolean noBlockInHand = !(!mainhand.isEmpty() && CompatHelper.isItemBlockProxy(mainhand)); boolean toolInHand = !(!mainhand.isEmpty() && CompatHelper.isItemBlockProxy(mainhand));
BlockPos startPos = null; BlockPos startPos = null;
Direction sideHit = null; Direction sideHit = null;
Vec3 hitVec = null; Vector3d hitVec = null;
//Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS) //Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS)
if (lookingAt != null && lookingAt.getType() == HitResult.Type.BLOCK) { if (lookingAt != null && lookingAt.getType() == RayTraceResult.Type.BLOCK) {
BlockHitResult blockLookingAt = (BlockHitResult) lookingAt; BlockRayTraceResult blockLookingAt = (BlockRayTraceResult) lookingAt;
startPos = blockLookingAt.getBlockPos(); startPos = blockLookingAt.getBlockPos();
//Check if tool (or none) in hand //Check if tool (or none) in hand
//TODO 1.13 replaceable //TODO 1.13 replaceable
boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable(); boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable();
boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, blockLookingAt.getDirection()); boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, blockLookingAt.getDirection());
if (!modifierSettings.doQuickReplace() && !noBlockInHand && !replaceable && !becomesDoubleSlab) { if (!modifierSettings.doQuickReplace() && !toolInHand && !replaceable && !becomesDoubleSlab) {
startPos = startPos.relative(blockLookingAt.getDirection()); startPos = startPos.relative(blockLookingAt.getDirection());
} }
//Get under tall grass and other replaceable blocks //Get under tall grass and other replaceable blocks
if (modifierSettings.doQuickReplace() && !noBlockInHand && replaceable) { if (modifierSettings.doQuickReplace() && !toolInHand && replaceable) {
startPos = startPos.below(); startPos = startPos.below();
} }
@@ -141,7 +141,7 @@ public class BlockPreviewRenderer {
sortOnDistanceToPlayer(newCoordinates, player); sortOnDistanceToPlayer(newCoordinates, player);
hitVec = new Vec3(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), hitVec = new Vector3d(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)),
Math.abs(hitVec.z - ((int) hitVec.z))); Math.abs(hitVec.z - ((int) hitVec.z)));
//Get blockstates //Get blockstates
@@ -168,7 +168,7 @@ public class BlockPreviewRenderer {
previousSecondPos = secondPos; previousSecondPos = secondPos;
//if so, renew randomness of randomizer bag //if so, renew randomness of randomizer bag
AbstractRandomizerBagItem.renewRandomness(); RandomizerBagItem.renewRandomness();
//and play sound (max once every tick) //and play sound (max once every tick)
if (newCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) { if (newCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) {
soundTime = ClientProxy.ticksInGame; soundTime = ClientProxy.ticksInGame;
@@ -177,7 +177,7 @@ public class BlockPreviewRenderer {
SoundType soundType = blockStates.get(0).getBlock().getSoundType(blockStates.get(0), player.level, SoundType soundType = blockStates.get(0).getBlock().getSoundType(blockStates.get(0), player.level,
newCoordinates.get(0), player); newCoordinates.get(0), player);
player.level.playSound(player, player.blockPosition(), breaking ? soundType.getBreakSound() : soundType.getPlaceSound(), player.level.playSound(player, player.blockPosition(), breaking ? soundType.getBreakSound() : soundType.getPlaceSound(),
SoundSource.BLOCKS, 0.3f, 0.8f); SoundCategory.BLOCKS, 0.3f, 0.8f);
} }
} }
} }
@@ -187,13 +187,13 @@ public class BlockPreviewRenderer {
int blockCount; int blockCount;
//Use fancy shader if config allows, otherwise outlines //Use fancy shader if config allows, otherwise outlines
if (BuildConfig.visuals.useShaders.get() && newCoordinates.size() < BuildConfig.visuals.shaderThreshold.get()) { if (BuildConfig.visuals.useShaders.get() && newCoordinates.size() < BuildConfig.visuals.shaderTreshold.get()) {
blockCount = renderBlockPreviews(matrixStack, renderTypeBuffer, newCoordinates, blockStates, itemStacks, 0f, firstPos, secondPos, !breaking, breaking); blockCount = renderBlockPreviews(matrixStack, renderTypeBuffer, newCoordinates, blockStates, itemStacks, 0f, firstPos, secondPos, !breaking, breaking);
} else { } else {
VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginLines(renderTypeBuffer);
Vec3 color = new Vec3(1f, 1f, 1f); Vector3d color = new Vector3d(1f, 1f, 1f);
if (breaking) color = new Vec3(1f, 0f, 0f); if (breaking) color = new Vector3d(1f, 0f, 0f);
for (int i = newCoordinates.size() - 1; i >= 0; i--) { for (int i = newCoordinates.size() - 1; i >= 0; i--) {
VoxelShape collisionShape = blockStates.get(i).getCollisionShape(player.level, newCoordinates.get(i)); VoxelShape collisionShape = blockStates.get(i).getCollisionShape(player.level, newCoordinates.get(i));
@@ -236,26 +236,25 @@ public class BlockPreviewRenderer {
} }
//Draw outlines if no block in hand IVertexBuilder buffer = RenderHandler.beginLines(renderTypeBuffer);
//Draw outlines if tool in hand
//Find proper raytrace: either normal range or increased range depending on canBreakFar //Find proper raytrace: either normal range or increased range depending on canBreakFar
VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); RayTraceResult objectMouseOver = Minecraft.getInstance().hitResult;
HitResult objectMouseOver = Minecraft.getInstance().hitResult; RayTraceResult breakingRaytrace = ReachHelper.canBreakFar(player) ? lookingAt : objectMouseOver;
HitResult breakingRaytrace = ReachHelper.canBreakFar(player) ? lookingAt : objectMouseOver; if (toolInHand && breakingRaytrace != null && breakingRaytrace.getType() == RayTraceResult.Type.BLOCK) {
BlockRayTraceResult blockBreakingRaytrace = (BlockRayTraceResult) breakingRaytrace;
if (player.isCreative() && noBlockInHand && breakingRaytrace != null && breakingRaytrace.getType() == HitResult.Type.BLOCK) {
BlockHitResult blockBreakingRaytrace = (BlockHitResult) breakingRaytrace;
List<BlockPos> breakCoordinates = BuildModifiers.findCoordinates(player, blockBreakingRaytrace.getBlockPos()); List<BlockPos> breakCoordinates = BuildModifiers.findCoordinates(player, blockBreakingRaytrace.getBlockPos());
//Only render first outline if further than normal reach //Only render first outline if further than normal reach
boolean excludeFirst = objectMouseOver != null && objectMouseOver.getType() == HitResult.Type.BLOCK; boolean excludeFirst = objectMouseOver != null && objectMouseOver.getType() == RayTraceResult.Type.BLOCK;
for (int i = excludeFirst ? 1 : 0; i < breakCoordinates.size(); i++) { for (int i = excludeFirst ? 1 : 0; i < breakCoordinates.size(); i++) {
BlockPos coordinate = breakCoordinates.get(i); BlockPos coordinate = breakCoordinates.get(i);
BlockState blockState = player.level.getBlockState(coordinate); BlockState blockState = player.level.getBlockState(coordinate);
if (!blockState.isAir()) { if (!blockState.getBlock().isAir(blockState, player.level, coordinate)) {
if (SurvivalHelper.canBreak(player.level, player, coordinate) || i == 0) { if (SurvivalHelper.canBreak(player.level, player, coordinate) || i == 0) {
VoxelShape collisionShape = blockState.getCollisionShape(player.level, coordinate); VoxelShape collisionShape = blockState.getCollisionShape(player.level, coordinate);
RenderHandler.renderBlockOutline(matrixStack, buffer, coordinate, collisionShape, new Vec3(0f, 0f, 0f)); RenderHandler.renderBlockOutline(matrixStack, buffer, coordinate, collisionShape, new Vector3d(0f, 0f, 0f));
} }
} }
} }
@@ -271,12 +270,12 @@ public class BlockPreviewRenderer {
BuildConfig.visuals.alwaysShowBlockPreview.get(); BuildConfig.visuals.alwaysShowBlockPreview.get();
} }
protected static int renderBlockPreviews(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, List<BlockPos> coordinates, List<BlockState> blockStates, protected static int renderBlockPreviews(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, List<BlockPos> coordinates, List<BlockState> blockStates,
List<ItemStack> itemStacks, float dissolve, BlockPos firstPos, List<ItemStack> itemStacks, float dissolve, BlockPos firstPos,
BlockPos secondPos, boolean checkCanPlace, boolean red) { BlockPos secondPos, boolean checkCanPlace, boolean red) {
Player player = Minecraft.getInstance().player; PlayerEntity player = Minecraft.getInstance().player;
ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer();
int blocksValid = 0; int blocksValid = 0;
if (coordinates.isEmpty()) return blocksValid; if (coordinates.isEmpty()) return blocksValid;
@@ -306,7 +305,7 @@ public class BlockPreviewRenderer {
public static void onBlocksPlaced(List<BlockPos> coordinates, List<ItemStack> itemStacks, List<BlockState> blockStates, public static void onBlocksPlaced(List<BlockPos> coordinates, List<ItemStack> itemStacks, List<BlockState> blockStates,
BlockPos firstPos, BlockPos secondPos) { BlockPos firstPos, BlockPos secondPos) {
LocalPlayer player = Minecraft.getInstance().player; ClientPlayerEntity player = Minecraft.getInstance().player;
ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
@@ -315,7 +314,7 @@ public class BlockPreviewRenderer {
//Save current coordinates, blockstates and itemstacks //Save current coordinates, blockstates and itemstacks
if (!coordinates.isEmpty() && blockStates.size() == coordinates.size() && if (!coordinates.isEmpty() && blockStates.size() == coordinates.size() &&
coordinates.size() > 1 && coordinates.size() < BuildConfig.visuals.shaderThreshold.get()) { coordinates.size() > 1 && coordinates.size() < BuildConfig.visuals.shaderTreshold.get()) {
placedDataList.add(new PlacedData(ClientProxy.ticksInGame, coordinates, blockStates, placedDataList.add(new PlacedData(ClientProxy.ticksInGame, coordinates, blockStates,
itemStacks, firstPos, secondPos, false)); itemStacks, firstPos, secondPos, false));
@@ -330,7 +329,7 @@ public class BlockPreviewRenderer {
public static void onBlocksBroken(List<BlockPos> coordinates, List<ItemStack> itemStacks, List<BlockState> blockStates, public static void onBlocksBroken(List<BlockPos> coordinates, List<ItemStack> itemStacks, List<BlockState> blockStates,
BlockPos firstPos, BlockPos secondPos) { BlockPos firstPos, BlockPos secondPos) {
LocalPlayer player = Minecraft.getInstance().player; ClientPlayerEntity player = Minecraft.getInstance().player;
ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
@@ -339,7 +338,7 @@ public class BlockPreviewRenderer {
//Save current coordinates, blockstates and itemstacks //Save current coordinates, blockstates and itemstacks
if (!coordinates.isEmpty() && blockStates.size() == coordinates.size() && if (!coordinates.isEmpty() && blockStates.size() == coordinates.size() &&
coordinates.size() > 1 && coordinates.size() < BuildConfig.visuals.shaderThreshold.get()) { coordinates.size() > 1 && coordinates.size() < BuildConfig.visuals.shaderTreshold.get()) {
sortOnDistanceToPlayer(coordinates, player); sortOnDistanceToPlayer(coordinates, player);
@@ -350,12 +349,12 @@ public class BlockPreviewRenderer {
} }
private static void sortOnDistanceToPlayer(List<BlockPos> coordinates, Player player) { private static void sortOnDistanceToPlayer(List<BlockPos> coordinates, PlayerEntity player) {
Collections.sort(coordinates, (lhs, rhs) -> { Collections.sort(coordinates, (lhs, rhs) -> {
// -1 - less than, 1 - greater than, 0 - equal // -1 - less than, 1 - greater than, 0 - equal
double lhsDistanceToPlayer = Vec3.atLowerCornerOf(lhs).subtract(player.getEyePosition(1f)).lengthSqr(); double lhsDistanceToPlayer = Vector3d.atLowerCornerOf(lhs).subtract(player.getEyePosition(1f)).lengthSqr();
double rhsDistanceToPlayer = Vec3.atLowerCornerOf(rhs).subtract(player.getEyePosition(1f)).lengthSqr(); double rhsDistanceToPlayer = Vector3d.atLowerCornerOf(rhs).subtract(player.getEyePosition(1f)).lengthSqr();
return (int) Math.signum(lhsDistanceToPlayer - rhsDistanceToPlayer); return (int) Math.signum(lhsDistanceToPlayer - rhsDistanceToPlayer);
}); });

View File

@@ -1,127 +1,167 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.shaders.Uniform;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.client.Minecraft;
import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.renderer.RenderState;
import net.minecraft.client.renderer.RenderStateShard;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.core.BlockPos; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.resources.ResourceLocation; import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.BlockPos;
import nl.requios.effortlessbuilding.EffortlessBuilding; import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import org.lwjgl.opengl.*;
import java.util.OptionalDouble; import java.util.OptionalDouble;
import java.util.function.Consumer;
public class BuildRenderTypes extends RenderType { public class BuildRenderTypes extends RenderType {
public static ResourceLocation shaderMaskTextureLocation = new ResourceLocation(EffortlessBuilding.MODID, "textures/shader_mask.png");
public static final RenderType LINES; public static final RenderType LINES;
public static final RenderType PLANES; public static final RenderType PLANES;
public static ShaderInstance dissolveShaderInstance; private static final int primaryTextureUnit = 0;
private static final ShaderStateShard RENDERTYPE_DISSOLVE_SHADER = new ShaderStateShard(() -> dissolveShaderInstance); private static final int secondaryTextureUnit = 2;
//Between 0 and 7, but dont override vanilla textures
//Also update dissolve.fsh SamplerX
private static final int maskTextureIndex = 2;
static { static {
final LineStateShard LINE = new LineStateShard(OptionalDouble.of(2.0)); final LineState LINE = new LineState(OptionalDouble.of(2.0));
final int INITIAL_BUFFER_SIZE = 128; final int INITIAL_BUFFER_SIZE = 128;
RenderType.CompositeState renderState; RenderType.State renderState;
//LINES //LINES
renderState = CompositeState.builder() renderState = State.builder()
.setLineState(LINE) .setLineState(LINE)
.setShaderState(RenderStateShard.RENDERTYPE_LINES_SHADER)
.setLayeringState(VIEW_OFFSET_Z_LAYERING) .setLayeringState(VIEW_OFFSET_Z_LAYERING)
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setTextureState(RenderStateShard.NO_TEXTURE) .setTextureState(NO_TEXTURE)
.setDepthTestState(RenderStateShard.NO_DEPTH_TEST) .setDepthTestState(NO_DEPTH_TEST)
.setLightmapState(RenderStateShard.NO_LIGHTMAP) .setLightmapState(NO_LIGHTMAP)
.setWriteMaskState(COLOR_DEPTH_WRITE) .setWriteMaskState(COLOR_DEPTH_WRITE)
.setCullState(RenderStateShard.NO_CULL) .setCullState(NO_CULL)
.createCompositeState(false); .createCompositeState(false);
LINES = RenderType.create("eb_lines", LINES = RenderType.create("eb_lines",
DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.LINES, INITIAL_BUFFER_SIZE, false, false, renderState); DefaultVertexFormats.POSITION_COLOR, GL11.GL_LINES, INITIAL_BUFFER_SIZE, false, false, renderState);
//PLANES //PLANES
renderState = CompositeState.builder() renderState = State.builder()
.setLineState(LINE) .setLineState(LINE)
.setShaderState(RenderStateShard.RENDERTYPE_LINES_SHADER)
.setLayeringState(VIEW_OFFSET_Z_LAYERING) .setLayeringState(VIEW_OFFSET_Z_LAYERING)
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setTextureState(RenderStateShard.NO_TEXTURE) .setTextureState(NO_TEXTURE)
.setDepthTestState(RenderStateShard.NO_DEPTH_TEST) .setDepthTestState(NO_DEPTH_TEST)
.setLightmapState(RenderStateShard.NO_LIGHTMAP) .setLightmapState(NO_LIGHTMAP)
.setWriteMaskState(COLOR_WRITE) .setWriteMaskState(COLOR_WRITE)
.setCullState(RenderStateShard.NO_CULL) .setCullState(NO_CULL)
.createCompositeState(false); .createCompositeState(false);
PLANES = RenderType.create("eb_planes", PLANES = RenderType.create("eb_planes",
DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, false, false, renderState); DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, false, false, renderState);
} }
// Dummy constructor needed to make java happy // Dummy constructor needed to make java happy
public BuildRenderTypes(String p_173178_, VertexFormat p_173179_, VertexFormat.Mode p_173180_, int p_173181_, boolean p_173182_, boolean p_173183_, Runnable p_173184_, Runnable p_173185_) { public BuildRenderTypes(String p_i225992_1_, VertexFormat p_i225992_2_, int p_i225992_3_, int p_i225992_4_, boolean p_i225992_5_, boolean p_i225992_6_, Runnable p_i225992_7_, Runnable p_i225992_8_) {
super(p_173178_, p_173179_, p_173180_, p_173181_, p_173182_, p_173183_, p_173184_, p_173185_); super(p_i225992_1_, p_i225992_2_, p_i225992_3_, p_i225992_4_, p_i225992_5_, p_i225992_6_, p_i225992_7_, p_i225992_8_);
} }
public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos, BlockPos secondPos, boolean red) { public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos,
BlockPos secondPos, boolean red) {
// RenderSystem.pushLightingAttributes();
// RenderSystem.pushTextureAttributes();
// RenderSystem.enableCull();
// RenderSystem.enableTexture();
// Minecraft.getInstance().textureManager.bindTexture(ShaderHandler.shaderMaskTextureLocation);
//
// RenderSystem.enableBlend();
// RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// RenderSystem.blendColor(1f, 1f, 1f, 0.8f);
//end
// ShaderHandler.releaseShader();
//highjacking texturing state (which does nothing by default) to do my own things
String stateName = "eb_texturing_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red; String stateName = "eb_texturing_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red;
TexturingStateShard MY_TEXTURING = new TexturingStateShard(stateName, () -> { TexturingState MY_TEXTURING = new TexturingState(stateName, () -> {
setShaderParameters(dissolveShaderInstance, dissolve, Vec3.atLowerCornerOf(blockPos), Vec3.atLowerCornerOf(firstPos), Vec3.atLowerCornerOf(secondPos), blockPos == secondPos, red); // RenderSystem.pushLightingAttributes();
RenderSystem.setShaderColor(1f, 1f, 1f, 0.8f); // RenderSystem.pushTextureAttributes();
}, () -> {});
RenderType.CompositeState renderState = RenderType.CompositeState.builder() ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, Vector3d.atLowerCornerOf(blockPos), Vector3d.atLowerCornerOf(firstPos), Vector3d.atLowerCornerOf(secondPos), blockPos == secondPos, red));
.setShaderState(RENDERTYPE_DISSOLVE_SHADER) RenderSystem.blendColor(1f, 1f, 1f, 0.8f);
}, ShaderHandler::releaseShader);
RenderType.State renderState = RenderType.State.builder()
.setTextureState(new TextureState(ShaderHandler.shaderMaskTextureLocation, false, false))
.setTexturingState(MY_TEXTURING) .setTexturingState(MY_TEXTURING)
.setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED)
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setLightmapState(RenderStateShard.NO_LIGHTMAP) .setDiffuseLightingState(NO_DIFFUSE_LIGHTING)
.setCullState(RenderStateShard.CULL) .setAlphaState(DEFAULT_ALPHA)
.setOutputState(RenderStateShard.TRANSLUCENT_TARGET) .setCullState(new CullState(true))
.setLightmapState(new LightmapState(false))
.setOverlayState(new OverlayState(false))
.createCompositeState(true); .createCompositeState(true);
//Unique name for every combination, otherwise it will reuse the previous one //Unique name for every combination, otherwise it will reuse the previous one
String name = "eb_block_previews_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red; String name = "eb_block_previews_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red;
return RenderType.create(name, return RenderType.create(name,
DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 2097152, true, true, renderState); DefaultVertexFormats.BLOCK, GL11.GL_QUADS, 256, true, true, renderState);
} }
private static void setShaderParameters(ShaderInstance shader, final float dissolve, final Vec3 blockpos, private static Consumer<Integer> generateShaderCallback(final float dissolve, final Vector3d blockpos,
final Vec3 firstpos, final Vec3 secondpos, final Vector3d firstpos, final Vector3d secondpos,
final boolean highlight, final boolean red) { final boolean highlight, final boolean red) {
Uniform percentileUniform = shader.getUniform("dissolve"); Minecraft mc = Minecraft.getInstance();
Uniform highlightUniform = shader.getUniform("highlight"); return (Integer shader) -> {
Uniform redUniform = shader.getUniform("red"); int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve");
Uniform blockposUniform = shader.getUniform("blockpos"); int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight");
Uniform firstposUniform = shader.getUniform("firstpos"); int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red");
Uniform secondposUniform = shader.getUniform("secondpos"); int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos");
int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos");
int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos");
int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image");
int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask");
RenderSystem.setShaderTexture(maskTextureIndex, shaderMaskTextureLocation); RenderSystem.enableTexture();
GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
if (percentileUniform != null) percentileUniform.set(dissolve); else EffortlessBuilding.log("percentileUniform is null"); //mask
if (highlightUniform != null) highlightUniform.set(highlight ? 1 : 0); else EffortlessBuilding.log("highlightUniform is null"); ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit);
if (redUniform != null) redUniform.set(red ? 1 : 0); else EffortlessBuilding.log("redUniform is null"); glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit);
mc.getTextureManager().bind(ShaderHandler.shaderMaskTextureLocation);//getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture();
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId());
//image
ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit);
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit);
mc.getTextureManager().bind(AtlasTexture.LOCATION_BLOCKS);//.getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture();
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId());
//blockpos
ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z);
ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z);
ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z);
//dissolve
ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve);
//highlight
ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0);
//red
ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0);
};
}
public static void glActiveTexture(int texture) {
if (GL.getCapabilities().GL_ARB_multitexture && !GL.getCapabilities().OpenGL13) {
ARBMultitexture.glActiveTextureARB(texture);
} else {
GL13.glActiveTexture(texture);
}
if (blockposUniform != null) blockposUniform.set((float) blockpos.x, (float) blockpos.y, (float) blockpos.z); else EffortlessBuilding.log("blockposUniform is null");
if (firstposUniform != null) firstposUniform.set((float) firstpos.x, (float) firstpos.y, (float) firstpos.z); else EffortlessBuilding.log("firstposUniform is null");
if (secondposUniform != null) secondposUniform.set((float) secondpos.x, (float) secondpos.y, (float) secondpos.z); else EffortlessBuilding.log("secondposUniform is null");
} }
private class ShaderInfo { private class ShaderInfo {
float dissolve; float dissolve;
Vec3 blockPos; Vector3d blockPos;
Vec3 firstPos; Vector3d firstPos;
Vec3 secondPos; Vector3d secondPos;
boolean red; boolean red;
public ShaderInfo(float dissolve, Vec3 blockPos, Vec3 firstPos, Vec3 secondPos, boolean red) { public ShaderInfo(float dissolve, Vector3d blockPos, Vector3d firstPos, Vector3d secondPos, boolean red) {
this.dissolve = dissolve; this.dissolve = dissolve;
this.blockPos = blockPos; this.blockPos = blockPos;
this.firstPos = firstPos; this.firstPos = firstPos;

View File

@@ -1,15 +1,15 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.world.phys.Vec3; import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.Mirror;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.RadialMirror; import nl.requios.effortlessbuilding.buildmodifier.RadialMirror;
import org.joml.Matrix4f;
import java.awt.*; import java.awt.*;
@@ -21,31 +21,31 @@ public class ModifierRenderer {
protected static final Color colorZ = new Color(52, 247, 255); protected static final Color colorZ = new Color(52, 247, 255);
protected static final Color colorRadial = new Color(52, 247, 255); protected static final Color colorRadial = new Color(52, 247, 255);
protected static final int lineAlpha = 200; protected static final int lineAlpha = 200;
protected static final int planeAlpha = 50; protected static final int planeAlpha = 75;
protected static final Vec3 epsilon = new Vec3(0.001, 0.001, 0.001); //prevents z-fighting protected static final Vector3d epsilon = new Vector3d(0.001, 0.001, 0.001); //prevents z-fighting
public static void render(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, ModifierSettingsManager.ModifierSettings modifierSettings) { public static void render(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, ModifierSettingsManager.ModifierSettings modifierSettings) {
//Mirror lines and areas //Mirror lines and areas
Mirror.MirrorSettings m = modifierSettings.getMirrorSettings(); Mirror.MirrorSettings m = modifierSettings.getMirrorSettings();
if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) { if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) {
Vec3 pos = m.position.add(epsilon); Vector3d pos = m.position.add(epsilon);
int radius = m.radius; int radius = m.radius;
if (m.mirrorX) { if (m.mirrorX) {
Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z - radius); Vector3d posA = new Vector3d(pos.x, pos.y - radius, pos.z - radius);
Vec3 posB = new Vec3(pos.x, pos.y + radius, pos.z + radius); Vector3d posB = new Vector3d(pos.x, pos.y + radius, pos.z + radius);
drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorX, m.drawLines, m.drawPlanes, true); drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorX, m.drawLines, m.drawPlanes, true);
} }
if (m.mirrorY) { if (m.mirrorY) {
Vec3 posA = new Vec3(pos.x - radius, pos.y, pos.z - radius); Vector3d posA = new Vector3d(pos.x - radius, pos.y, pos.z - radius);
Vec3 posB = new Vec3(pos.x + radius, pos.y, pos.z + radius); Vector3d posB = new Vector3d(pos.x + radius, pos.y, pos.z + radius);
drawMirrorPlaneY(matrixStack, renderTypeBuffer, posA, posB, colorY, m.drawLines, m.drawPlanes); drawMirrorPlaneY(matrixStack, renderTypeBuffer, posA, posB, colorY, m.drawLines, m.drawPlanes);
} }
if (m.mirrorZ) { if (m.mirrorZ) {
Vec3 posA = new Vec3(pos.x - radius, pos.y - radius, pos.z); Vector3d posA = new Vector3d(pos.x - radius, pos.y - radius, pos.z);
Vec3 posB = new Vec3(pos.x + radius, pos.y + radius, pos.z); Vector3d posB = new Vector3d(pos.x + radius, pos.y + radius, pos.z);
drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorZ, m.drawLines, m.drawPlanes, true); drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorZ, m.drawLines, m.drawPlanes, true);
} }
@@ -60,19 +60,19 @@ public class ModifierRenderer {
//Radial mirror lines and areas //Radial mirror lines and areas
RadialMirror.RadialMirrorSettings r = modifierSettings.getRadialMirrorSettings(); RadialMirror.RadialMirrorSettings r = modifierSettings.getRadialMirrorSettings();
if (r != null && r.enabled) { if (r != null && r.enabled) {
Vec3 pos = r.position.add(epsilon); Vector3d pos = r.position.add(epsilon);
int radius = r.radius; int radius = r.radius;
float angle = 2f * ((float) Math.PI) / r.slices; float angle = 2f * ((float) Math.PI) / r.slices;
Vec3 relStartVec = new Vec3(radius, 0, 0); Vector3d relStartVec = new Vector3d(radius, 0, 0);
if (r.slices % 4 == 2) relStartVec = relStartVec.yRot(angle / 2f); if (r.slices % 4 == 2) relStartVec = relStartVec.yRot(angle / 2f);
for (int i = 0; i < r.slices; i++) { for (int i = 0; i < r.slices; i++) {
Vec3 relNewVec = relStartVec.yRot(angle * i); Vector3d relNewVec = relStartVec.yRot(angle * i);
Vec3 newVec = pos.add(relNewVec); Vector3d newVec = pos.add(relNewVec);
Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z); Vector3d posA = new Vector3d(pos.x, pos.y - radius, pos.z);
Vec3 posB = new Vec3(newVec.x, pos.y + radius, newVec.z); Vector3d posB = new Vector3d(newVec.x, pos.y + radius, newVec.z);
drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorRadial, r.drawLines, r.drawPlanes, false); drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorRadial, r.drawLines, r.drawPlanes, false);
} }
} }
@@ -81,13 +81,13 @@ public class ModifierRenderer {
//----Mirror---- //----Mirror----
protected static void drawMirrorPlane(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes, boolean drawVerticalLines) { protected static void drawMirrorPlane(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, Vector3d posA, Vector3d posB, Color c, boolean drawLines, boolean drawPlanes, boolean drawVerticalLines) {
// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); // GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha);
Matrix4f matrixPos = matrixStack.last().pose(); Matrix4f matrixPos = matrixStack.last().pose();
if (drawPlanes) { if (drawPlanes) {
VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginPlanes(renderTypeBuffer);
buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
@@ -101,9 +101,9 @@ public class ModifierRenderer {
} }
if (drawLines) { if (drawLines) {
VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginLines(renderTypeBuffer);
Vec3 middle = posA.add(posB).scale(0.5); Vector3d middle = posA.add(posB).scale(0.5);
buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex();
buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex();
if (drawVerticalLines) { if (drawVerticalLines) {
@@ -115,13 +115,13 @@ public class ModifierRenderer {
} }
} }
protected static void drawMirrorPlaneY(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes) { protected static void drawMirrorPlaneY(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, Vector3d posA, Vector3d posB, Color c, boolean drawLines, boolean drawPlanes) {
// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); // GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha());
Matrix4f matrixPos = matrixStack.last().pose(); Matrix4f matrixPos = matrixStack.last().pose();
if (drawPlanes) { if (drawPlanes) {
VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginPlanes(renderTypeBuffer);
buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
@@ -135,9 +135,9 @@ public class ModifierRenderer {
} }
if (drawLines) { if (drawLines) {
VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginLines(renderTypeBuffer);
Vec3 middle = posA.add(posB).scale(0.5); Vector3d middle = posA.add(posB).scale(0.5);
buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex();
buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex();
buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex();
@@ -147,13 +147,13 @@ public class ModifierRenderer {
} }
} }
protected static void drawMirrorLines(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Mirror.MirrorSettings m) { protected static void drawMirrorLines(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, Mirror.MirrorSettings m) {
// GL11.glColor4d(100, 100, 100, 255); // GL11.glColor4d(100, 100, 100, 255);
VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); IVertexBuilder buffer = RenderHandler.beginLines(renderTypeBuffer);
Matrix4f matrixPos = matrixStack.last().pose(); Matrix4f matrixPos = matrixStack.last().pose();
Vec3 pos = m.position.add(epsilon); Vector3d pos = m.position.add(epsilon);
buffer.vertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex();
buffer.vertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); buffer.vertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex();

View File

@@ -1,26 +1,19 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.IVertexBuilder;
import com.mojang.blaze3d.vertex.Tesselator; import net.minecraft.block.BlockState;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.core.BlockPos; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.world.entity.player.Player; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.phys.AABB; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -28,8 +21,6 @@ import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
import static net.minecraftforge.client.event.RenderLevelStageEvent.Stage.AFTER_PARTICLES;
/*** /***
* Main render class for Effortless Building * Main render class for Effortless Building
*/ */
@@ -37,19 +28,21 @@ import static net.minecraftforge.client.event.RenderLevelStageEvent.Stage.AFTER_
public class RenderHandler { public class RenderHandler {
@SubscribeEvent @SubscribeEvent
public static void onRender(RenderLevelStageEvent event) { public static void onRender(RenderWorldLastEvent event) {
if (event.getPhase() != EventPriority.NORMAL || event.getStage() != AFTER_PARTICLES) if (event.getPhase() != EventPriority.NORMAL)
return; return;
PoseStack matrixStack = event.getPoseStack(); MatrixStack matrixStack = event.getMatrixStack();
BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); BufferBuilder bufferBuilder = Tessellator.getInstance().getBuilder();
MultiBufferSource.BufferSource renderTypeBuffer = MultiBufferSource.immediate(bufferBuilder); IRenderTypeBuffer.Impl renderTypeBuffer = IRenderTypeBuffer.immediate(bufferBuilder);
if (renderTypeBuffer == null)
return;
Player player = Minecraft.getInstance().player; PlayerEntity player = Minecraft.getInstance().player;
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); Vector3d projectedView = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(-projectedView.x, -projectedView.y, -projectedView.z); matrixStack.translate(-projectedView.x, -projectedView.y, -projectedView.z);
@@ -63,23 +56,23 @@ public class RenderHandler {
matrixStack.popPose(); matrixStack.popPose();
} }
protected static VertexConsumer beginLines(MultiBufferSource.BufferSource renderTypeBuffer) { protected static IVertexBuilder beginLines(IRenderTypeBuffer.Impl renderTypeBuffer) {
return renderTypeBuffer.getBuffer(BuildRenderTypes.LINES); return renderTypeBuffer.getBuffer(BuildRenderTypes.LINES);
} }
protected static void endLines(MultiBufferSource.BufferSource renderTypeBuffer) { protected static void endLines(IRenderTypeBuffer.Impl renderTypeBuffer) {
renderTypeBuffer.endBatch(); renderTypeBuffer.endBatch();
} }
protected static VertexConsumer beginPlanes(MultiBufferSource.BufferSource renderTypeBuffer) { protected static IVertexBuilder beginPlanes(IRenderTypeBuffer.Impl renderTypeBuffer) {
return renderTypeBuffer.getBuffer(BuildRenderTypes.PLANES); return renderTypeBuffer.getBuffer(BuildRenderTypes.PLANES);
} }
protected static void endPlanes(MultiBufferSource.BufferSource renderTypeBuffer) { protected static void endPlanes(IRenderTypeBuffer.Impl renderTypeBuffer) {
renderTypeBuffer.endBatch(); renderTypeBuffer.endBatch();
} }
protected static void renderBlockPreview(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, BlockRenderDispatcher dispatcher, protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher,
BlockPos blockPos, BlockState blockState, float dissolve, BlockPos firstPos, BlockPos secondPos, boolean red) { BlockPos blockPos, BlockState blockState, float dissolve, BlockPos firstPos, BlockPos secondPos, boolean red) {
if (blockState == null) return; if (blockState == null) return;
@@ -91,22 +84,27 @@ public class RenderHandler {
//Begin block preview rendering //Begin block preview rendering
RenderType blockPreviewRenderType = BuildRenderTypes.getBlockPreviewRenderType(dissolve, blockPos, firstPos, secondPos, red); RenderType blockPreviewRenderType = BuildRenderTypes.getBlockPreviewRenderType(dissolve, blockPos, firstPos, secondPos, red);
VertexConsumer buffer = renderTypeBuffer.getBuffer(blockPreviewRenderType); IVertexBuilder buffer = renderTypeBuffer.getBuffer(blockPreviewRenderType);
// MinecraftServer server = Minecraft.getInstance().getIntegratedServer();
// World world = DimensionManager.getWorld(server, DimensionType.OVERWORLD, false, true);
try { try {
BakedModel model = dispatcher.getBlockModel(blockState); IBakedModel model = dispatcher.getBlockModel(blockState);
dispatcher.getModelRenderer().renderModel(matrixStack.last(), buffer, blockState, model, dispatcher.getModelRenderer().renderModel(matrixStack.last(), buffer,
1f, 1f, 1f, 0, OverlayTexture.NO_OVERLAY, ModelData.EMPTY, blockPreviewRenderType); blockState, model, 1f, 1f, 1f, 0, OverlayTexture.NO_OVERLAY);
// blockRendererDispatcher.getBlockModelRenderer().renderModel(world, blockRendererDispatcher.getModelForState(blockState),
// blockState, logicPos, matrixStack, renderTypeBuffer.getBuffer(renderType), true, new Random(), blockState.getPositionRandom(logicPos), i);
} catch (NullPointerException e) { } catch (NullPointerException e) {
EffortlessBuilding.logger.warn("RenderHandler::renderBlockPreview cannot render " + blockState.getBlock().toString()); EffortlessBuilding.logger.warn("RenderHandler::renderBlockPreview cannot render " + blockState.getBlock().toString());
//Render outline as backup, escape out of the current renderstack //Render outline as backup, escape out of the current renderstack
matrixStack.popPose(); matrixStack.popPose();
renderTypeBuffer.endBatch(); renderTypeBuffer.endBatch();
VertexConsumer lineBuffer = beginLines(renderTypeBuffer); IVertexBuilder lineBuffer = beginLines(renderTypeBuffer);
renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vec3(1f, 1f, 1f)); renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vector3d(1f, 1f, 1f));
endLines(renderTypeBuffer); endLines(renderTypeBuffer);
buffer = renderTypeBuffer.getBuffer(Sheets.translucentCullBlockSheet()); //any type will do, as long as we have something on the stack buffer = renderTypeBuffer.getBuffer(Atlases.translucentCullBlockSheet()); //any type will do, as long as we have something on the stack
matrixStack.pushPose(); matrixStack.pushPose();
} }
@@ -114,25 +112,25 @@ public class RenderHandler {
matrixStack.popPose(); matrixStack.popPose();
} }
protected static void renderBlockOutline(PoseStack matrixStack, VertexConsumer buffer, BlockPos pos, Vec3 color) { protected static void renderBlockOutline(MatrixStack matrixStack, IVertexBuilder buffer, BlockPos pos, Vector3d color) {
renderBlockOutline(matrixStack, buffer, pos, pos, color); renderBlockOutline(matrixStack, buffer, pos, pos, color);
} }
//Renders outline. Pos1 has to be minimal x,y,z and pos2 maximal x,y,z //Renders outline. Pos1 has to be minimal x,y,z and pos2 maximal x,y,z
protected static void renderBlockOutline(PoseStack matrixStack, VertexConsumer buffer, BlockPos pos1, BlockPos pos2, Vec3 color) { protected static void renderBlockOutline(MatrixStack matrixStack, IVertexBuilder buffer, BlockPos pos1, BlockPos pos2, Vector3d color) {
AABB aabb = new AABB(pos1, pos2.offset(1, 1, 1)).inflate(0.0020000000949949026); AxisAlignedBB aabb = new AxisAlignedBB(pos1, pos2.offset(1, 1, 1)).inflate(0.0020000000949949026);
LevelRenderer.renderLineBox(matrixStack, buffer, aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f); WorldRenderer.renderLineBox(matrixStack, buffer, aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
// WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f); // WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
} }
//Renders outline with given bounding box //Renders outline with given bounding box
protected static void renderBlockOutline(PoseStack matrixStack, VertexConsumer buffer, BlockPos pos, VoxelShape collisionShape, Vec3 color) { protected static void renderBlockOutline(MatrixStack matrixStack, IVertexBuilder buffer, BlockPos pos, VoxelShape collisionShape, Vector3d color) {
// WorldRenderer.drawShape(collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f); // WorldRenderer.drawShape(collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f);
LevelRenderer.renderVoxelShape(matrixStack, buffer, collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f); WorldRenderer.renderVoxelShape(matrixStack, buffer, collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f);
} }
//TODO //TODO 1.14
//Sends breaking progress for all coordinates to renderglobal, so all blocks get visually broken //Sends breaking progress for all coordinates to renderglobal, so all blocks get visually broken
// @Override // @Override
// public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) { // public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {

View File

@@ -0,0 +1,201 @@
/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
* <p>
* Modified by Requios
* <p>
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
* <p>
* File Created @ [Apr 9, 2014, 11:20:26 PM (GMT)]
*/
package nl.requios.effortlessbuilding.render;
import net.minecraft.util.ResourceLocation;
import nl.requios.effortlessbuilding.BuildConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.proxy.ClientProxy;
import org.apache.logging.log4j.Level;
import org.lwjgl.opengl.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.function.Consumer;
public final class ShaderHandler {
private static final int VERT_ST = ARBVertexShader.GL_VERTEX_SHADER_ARB;
private static final int FRAG_ST = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB;
private static final int VERT = 1;
private static final int FRAG = 2;
private static final String VERT_EXTENSION = ".vert";
private static final String FRAG_EXTENSION = ".frag";
public static int rawColor;
public static int dissolve;
public static ResourceLocation shaderMaskTextureLocation = new ResourceLocation(EffortlessBuilding.MODID, "textures/shader_mask.png");
public static void init() {
if (!doUseShaders())
return;
// rawColor = createProgram("/assets/effortlessbuilding/shaders/raw_color", FRAG);
dissolve = createProgram("/assets/effortlessbuilding/shaders/dissolve", VERT + FRAG);
}
public static void useShader(int shader, Consumer<Integer> callback) {
if (!doUseShaders())
return;
ARBShaderObjects.glUseProgramObjectARB(shader);
if (shader != 0) {
int time = ARBShaderObjects.glGetUniformLocationARB(shader, "time");
ARBShaderObjects.glUniform1iARB(time, ClientProxy.ticksInGame);
if (callback != null)
callback.accept(shader);
}
}
public static void useShader(int shader) {
useShader(shader, null);
}
public static void releaseShader() {
useShader(0);
}
public static boolean doUseShaders() {
//Extracted from OpenGLHelper in 1.13 and earlier
//Can probably be simplified
GLCapabilities glcapabilities = GL.getCapabilities();
boolean openGL14 = glcapabilities.OpenGL14 || glcapabilities.GL_EXT_blend_func_separate;
boolean openGL21 = glcapabilities.OpenGL21;
boolean framebufferSupported = openGL14 && (glcapabilities.GL_ARB_framebuffer_object || glcapabilities.GL_EXT_framebuffer_object || glcapabilities.OpenGL30);
boolean shadersAvailable = openGL21 || glcapabilities.GL_ARB_vertex_shader && glcapabilities.GL_ARB_fragment_shader && glcapabilities.GL_ARB_shader_objects;
boolean shadersSupported = framebufferSupported && shadersAvailable;
return BuildConfig.visuals.useShaders.get() && shadersSupported;
}
private static int createProgram(String s, int sides) {
boolean vert = (sides & VERT) != 0;
boolean frag = (sides & FRAG) != 0;
return createProgram(vert ? s + VERT_EXTENSION : null, frag ? s + FRAG_EXTENSION : null);
}
// Most of the code taken from the LWJGL wiki
// http://lwjgl.org/wiki/index.php?title=GLSL_Shaders_with_LWJGL
private static int createProgram(String vert, String frag) {
int vertId = 0, fragId = 0, program;
if (vert != null)
vertId = createShader(vert, VERT_ST);
if (frag != null)
fragId = createShader(frag, FRAG_ST);
program = ARBShaderObjects.glCreateProgramObjectARB();
if (program == 0)
return 0;
if (vert != null)
ARBShaderObjects.glAttachObjectARB(program, vertId);
if (frag != null)
ARBShaderObjects.glAttachObjectARB(program, fragId);
ARBShaderObjects.glLinkProgramARB(program);
if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) {
EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program));
return 0;
}
ARBShaderObjects.glValidateProgramARB(program);
if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) {
EffortlessBuilding.logger.log(Level.ERROR, getLogInfo(program));
return 0;
}
return program;
}
private static int createShader(String filename, int shaderType) {
int shader = 0;
try {
shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType);
if (shader == 0)
return 0;
ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename));
ARBShaderObjects.glCompileShaderARB(shader);
if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE)
throw new RuntimeException("Error creating shader: " + getLogInfo(shader));
return shader;
} catch (Exception e) {
ARBShaderObjects.glDeleteObjectARB(shader);
e.printStackTrace();
return -1;
}
}
private static String getLogInfo(int obj) {
return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB));
}
private static String readFileAsString(String filename) throws Exception {
StringBuilder source = new StringBuilder();
InputStream in = ShaderHandler.class.getResourceAsStream(filename);
Exception exception = null;
BufferedReader reader;
if (in == null)
return "";
try {
reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
Exception innerExc = null;
try {
String line;
while ((line = reader.readLine()) != null)
source.append(line).append('\n');
} catch (Exception exc) {
exception = exc;
} finally {
try {
reader.close();
} catch (Exception exc) {
innerExc = exc;
}
}
if (innerExc != null)
throw innerExc;
} catch (Exception exc) {
exception = exc;
} finally {
try {
in.close();
} catch (Exception exc) {
if (exception == null)
exception = exc;
else exc.printStackTrace();
}
if (exception != null)
throw exception;
}
return source.toString();
}
}

View File

@@ -1,3 +1,3 @@
public net.minecraft.client.gui.components.AbstractSelectionList f_93398_ # renderHeader public net.minecraft.client.gui.widget.list.AbstractList field_230680_q_ # renderHeader
public net.minecraft.client.gui.Font m_92803_(Ljava/lang/String;FFILcom/mojang/math/Matrix4f;ZZ)I # renderString public net.minecraft.client.gui.FontRenderer func_228078_a_(Ljava/lang/String;FFILnet/minecraft/util/math/vector/Matrix4f;ZZ)I # renderString
public net.minecraft.world.inventory.MenuType m_39988_(Ljava/lang/String;Lnet/minecraft/world/inventory/MenuType$MenuSupplier;)Lnet/minecraft/world/inventory/MenuType; # register public net.minecraft.inventory.container.ContainerType func_221505_a(Ljava/lang/String;Lnet/minecraft/inventory/container/ContainerType$IFactory;)Lnet/minecraft/inventory/container/ContainerType; # register

View File

@@ -1,32 +1,47 @@
modLoader="javafml" modLoader="javafml" #mandatory
# Forge for 1.17.1 is version 37 # A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion="[41,)" loaderVersion="[34,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
license="GNU LESSER GENERAL PUBLIC LICENSE" license="GNU LESSER GENERAL PUBLIC LICENSE"
issueTrackerURL="https://bitbucket.org/Requios/effortless-building/issues?status=new&status=open" # A URL to refer people to when problems occur with this mod
showAsResourcePack=false issueTrackerURL="https://bitbucket.org/Requios/effortless-building/issues?status=new&status=open" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] [[mods]] #mandatory
modId="effortlessbuilding" # The modid of the mod
version="${file.jarVersion}" modId="effortlessbuilding" #mandatory
displayName="Effortless Building" # The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
displayURL="https://minecraft.curseforge.com/projects/effortless-building" version="${file.jarVersion}" #mandatory
logoFile="logo.png" # A display name for the mod
credits="" displayName="Effortless Building" #mandatory
authors="Requios" # A URL to query for updates for this mod. See the JSON update specification <here>
description=''' #updateJSONURL="example.com" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
displayURL="https://minecraft.curseforge.com/projects/effortless-building" #optional
# A file name (in the root of the mod JAR) containing a logo for display
logoFile="logo.png" #optional
# A text field displayed in the mod UI
credits="" #optional
# A text field displayed in the mod UI
authors="Requios" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''
Makes building easier by providing tools like mirrors, arrays, build modes and a block randomizer. For survival and creative mode. Makes building easier by providing tools like mirrors, arrays, build modes and a block randomizer. For survival and creative mode.
''' '''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.effortlessbuilding]] [[dependencies.examplemod]] #optional
modId="forge" # the modid of the dependency
mandatory=true modId="forge" #mandatory
versionRange="[41,)" # Does this dependency have to exist - if not, ordering below must be specified
mandatory=true #mandatory
# The version range of the dependency
versionRange="[34,)" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering="NONE" ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
side="BOTH" side="BOTH"
# Here's another dependency
[[dependencies.effortlessbuilding]] [[dependencies.examplemod]]
modId="minecraft" modId="minecraft"
mandatory=true mandatory=true
versionRange="[1.18.1,1.20)" versionRange="[1.16.3,1.17)"
ordering="NONE" ordering="NONE"
side="BOTH" side="BOTH"

View File

@@ -11,12 +11,12 @@
"key.effortlessbuilding.redo.desc": "Redo", "key.effortlessbuilding.redo.desc": "Redo",
"key.effortlessbuilding.altplacement.desc": "Alternative placement", "key.effortlessbuilding.altplacement.desc": "Alternative placement",
"item.effortlessbuilding.randomizer_bag": "Leather Randomizer Bag", "effortlessbuilding:randomizer_bag": "Leather Randomizer Bag",
"item.effortlessbuilding.golden_randomizer_bag": "Golden Randomizer Bag", "effortlessbuilding:golden_randomizer_bag": "Golden Randomizer Bag",
"item.effortlessbuilding.diamond_randomizer_bag": "Diamond Randomizer Bag", "effortlessbuilding:diamond_randomizer_bag": "Diamond Randomizer Bag",
"item.effortlessbuilding.reach_upgrade1": "Reach Upgrade 1", "effortlessbuilding:reach_upgrade1": "Reach Upgrade 1",
"item.effortlessbuilding.reach_upgrade2": "Reach Upgrade 2", "effortlessbuilding:reach_upgrade2": "Reach Upgrade 2",
"item.effortlessbuilding.reach_upgrade3": "Reach Upgrade 3", "effortlessbuilding:reach_upgrade3": "Reach Upgrade 3",
"effortlessbuilding.mode.normal": "Disable", "effortlessbuilding.mode.normal": "Disable",
"effortlessbuilding.mode.normal_plus": "Single", "effortlessbuilding.mode.normal_plus": "Single",

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/diamondrandomizerbag" "layer0": "effortlessbuilding:items/diamondrandomizerbag"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/goldenrandomizerbag" "layer0": "effortlessbuilding:items/goldenrandomizerbag"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/randomizerbag" "layer0": "effortlessbuilding:items/randomizerbag"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/reachupgrade1" "layer0": "effortlessbuilding:items/reachupgrade1"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/reachupgrade2" "layer0": "effortlessbuilding:items/reachupgrade2"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"parent": "item/generated", "parent": "item/generated",
"textures": { "textures": {
"layer0": "effortlessbuilding:item/reachupgrade3" "layer0": "effortlessbuilding:items/reachupgrade3"
} }
} }

View File

@@ -1,37 +0,0 @@
{
"blend": {
"func": "add",
"srcrgb": "srcalpha",
"dstrgb": "1-srcalpha"
},
"vertex": "effortlessbuilding:dissolve",
"fragment": "effortlessbuilding:dissolve",
"attributes": [
"Position",
"Color",
"UV0",
"UV2",
"Normal"
],
"samplers": [
{ "name": "Sampler0" },
{ "name": "Sampler2" }
],
"uniforms": [
{ "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] },
{ "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] },
{ "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] },
{ "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] },
{ "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] },
{ "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] },
{ "name": "dissolve", "type": "float", "count": 1, "values": [0.0] },
{ "name": "highlight", "type": "int", "count": 1, "values": [0] },
{ "name": "red", "type": "int", "count": 1, "values": [0] },
{ "name": "blockpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] },
{ "name": "firstpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] },
{ "name": "secondpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }
]
}

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