diff --git a/.gitignore b/.gitignore index 8f98ab8..faba627 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ build # other eclipse -/run* +run # Files from Forge MDK forge*changelog.txt diff --git a/README.md b/README.md index 492de6f..a1263e3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ With a Construction Wand you can place multiple blocks (up to 1024) at once, ext facing. If that's not enough: you can upgrade your wand with additional cores, allowing you to place a block behind the block you are facing, conjure blocks in mid air or destroy lots of blocks very fast. -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/wands.png) +![](images/wands.png) **Note:** These are the instructions for ConstructionWand version 2.0+, which introduced some new features. If you are still using version 1.x, refer to [those](https://github.com/Theta-Dev/ConstructionWand/tree/1.16.2-1.7) @@ -23,12 +23,12 @@ and last longer. These properties can be changed in the config. | Infinity | Unbreakable | 1024 | Yes | 8 | 81 | ## Crafting -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting1.png) -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting2.png) -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting3.png) -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting4.png) -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting5.png) -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/crafting6.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting1.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting2.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting3.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting4.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting5.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.16.2/images/crafting6.png) ## Keybindings @@ -69,7 +69,7 @@ you can use the undo feature if you've made a mistake. ## Options SNEAK+OPTKEY+Right clicking empty space opens the option screen of your wand. -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/options.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.15/images/options.png) **Restriction:** If restriction is enabled the wand will only place blocks in one row or column (choose between North/South, East/West on a horizontal plane and Horizontal, Vertical on a vertical plane). @@ -79,7 +79,7 @@ has no effect if the angel core is enabled. **Direction:** If set to "Player" the wand places blocks in the same direction as if they were placed by yourself. Target mode places the blocks in the same direction as their supporting block. See the picture below: -![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/images/placedir.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.15/images/placedir.png) **Replacement:** Enables/disables the replacement of replaceable blocks (Fluids, snow, tallgrass). @@ -122,7 +122,7 @@ for TileEntities in CW Version 1.7. Chisels&Bits blocks are blacklisted by defau There are probably a few other tile entities from other mods out there which may cause issues as well. If you find some of them you can tell me by creating an issue, commenting on Curse or editing the default blacklist yourself -(it is located at https://github.com/Theta-Dev/ConstructionWand/blob/1.19/src/main/java/thetadev/constructionwand/basics/ConfigServer.java#L25) +(it is located at https://github.com/Theta-Dev/ConstructionWand/blob/1.16.2/src/main/java/thetadev/constructionwand/basics/ConfigServer.java#L28) and making a PR. ## Contributions and #Hacktoberfest diff --git a/build.gradle b/build.gradle index 7f7cd6b..546e606 100644 --- a/build.gradle +++ b/build.gradle @@ -16,10 +16,8 @@ version = "${mcversion}-${version_major}.${version_minor}" group = "${author}.${modid}" archivesBaseName = "${modid}" -// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. 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 { mappings channel: project.mcp_channel, version: project.mcp_mappings @@ -33,9 +31,6 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - // property 'forge.enabledGameTestNamespaces', modid - mods { constructionwand { source sourceSets.main @@ -52,8 +47,6 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' - // property 'forge.enabledGameTestNamespaces', modid - mods { constructionwand { source sourceSets.main @@ -61,25 +54,6 @@ minecraft { } } - // 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', modid - - mods { - examplemod { - source sourceSets.main - } - } - } - data { workingDirectory project.file("run/client").canonicalPath @@ -127,9 +101,8 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly fg.deobf("mezz.jei:jei-${mcversion}-common-api:${jei_version}") - compileOnly fg.deobf("mezz.jei:jei-${mcversion}-forge-api:${jei_version}") - runtimeOnly fg.deobf("mezz.jei:jei-${mcversion}-forge:${jei_version}") + compileOnly fg.deobf("mezz.jei:${jei_version}:api") + runtimeOnly fg.deobf("mezz.jei:${jei_version}") compileOnly fg.deobf([ group: "vazkii.botania", @@ -170,8 +143,4 @@ publishing { url "file:///${project.projectDir}/mcmodsrepo" } } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bf09a07..1d83096 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.4 -forgeversion=45.0.23 +mcversion=1.18.1 +forgeversion=39.1.0 mcp_channel=official -mcp_mappings=1.19.4 +mcp_mappings=1.18.1 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ -botania=1.19.2-437-FORGE +botania=1.18.1-429 # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=13.1.0.2 +jei_version=jei-1.18.1:9.1.0.41 version_major=2 -version_minor=10 \ No newline at end of file +version_minor=11 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927..7454180 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fc..e750102 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..744e882 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/bin/sh +#!/usr/bin/env sh # -# Copyright © 2015-2021 the original authors. +# Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (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. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# +## +## Gradle start up script for UN*X +## ############################################################################## # Attempt to set APP_HOME - # Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} +APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum +MAX_FD="maximum" warn () { echo "$*" -} >&2 +} die () { echo echo "$*" echo exit 1 -} >&2 +} # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; esac 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 [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java + JAVACMD="$JAVA_HOME/jre/sh/java" else - JAVACMD=$JAVA_HOME/bin/java + JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -132,7 +98,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD=java + JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -140,95 +106,80 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi fi -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi # For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=$( cygpath --unix "$JAVACMD" ) + JAVACMD=`cygpath --unix "$JAVACMD"` - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" exec "$JAVACMD" "$@" diff --git a/notes/Builds.md b/notes/Builds.md deleted file mode 100644 index e59877b..0000000 --- a/notes/Builds.md +++ /dev/null @@ -1,13 +0,0 @@ -# Builds - -Overview of all builds of ConstructionWand and their properties. - -| Build | Java version | Supported MC versions | -|--------|--------------|-----------------------| -| 1.14.4 | 8 | 1.14.4 | -| 1.15.2 | 8 | 1.15.2 | -| 1.16.1 | 8 | 1.16.1 | -| 1.16.5 | 8 | 1.16.2 - 1.16.5 | -| 1.17.1 | 16 | 1.17.1 | -| 1.18 | 17 | 1.18 | -| 1.19 | 17 | 1.19 - 1.19.2 | diff --git a/notes/test_command.md b/notes/test_command.md deleted file mode 100644 index c31679e..0000000 --- a/notes/test_command.md +++ /dev/null @@ -1,11 +0,0 @@ -# Testing item containers -- Install the toolbelt mod (https://www.curseforge.com/minecraft/mc-mods/tool-belt) -- Place a chest on top of a command block and enter this command: -- Get a toolbeld with 2 stacks of diamond blocks in it - -The reason for this hack is that the toolbelt mod gets updated very quickly and is available for almost every -MC version supported by ConstructionWand. - -``` -data merge block ~ ~1 ~ {Items: [{Slot: 0, id: "toolbelt:belt", Count: 1, tag: {Items: [{Slot: 0, id: "minecraft:diamond_block", Count: 64}, {Slot: 1, id: "minecraft:diamond_block", Count: 64}]}}]} -``` diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 3703f36..0000000 --- a/settings.gradle +++ /dev/null @@ -1,6 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven { url = 'https://maven.minecraftforge.net/' } - } -} \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/ConstructionWand.java b/src/main/java/thetadev/constructionwand/ConstructionWand.java index 5109695..c5b9f76 100644 --- a/src/main/java/thetadev/constructionwand/ConstructionWand.java +++ b/src/main/java/thetadev/constructionwand/ConstructionWand.java @@ -15,6 +15,7 @@ import org.apache.logging.log4j.Logger; import thetadev.constructionwand.basics.ConfigClient; import thetadev.constructionwand.basics.ConfigServer; import thetadev.constructionwand.basics.ModStats; +import thetadev.constructionwand.basics.ReplacementRegistry; import thetadev.constructionwand.client.ClientEvents; import thetadev.constructionwand.client.RenderBlockPreview; import thetadev.constructionwand.containers.ContainerManager; @@ -73,6 +74,9 @@ public class ConstructionWand // Container registry ContainerRegistrar.register(); + //Replacement registry + ReplacementRegistry.init(); + // Stats ModStats.register(); } @@ -83,6 +87,7 @@ public class ConstructionWand MinecraftForge.EVENT_BUS.register(new ClientEvents()); event.enqueueWork(ModItems::registerModelProperties); + event.enqueueWork(ModItems::registerItemColors); } public static ResourceLocation loc(String name) { diff --git a/src/main/java/thetadev/constructionwand/basics/CommonEvents.java b/src/main/java/thetadev/constructionwand/basics/CommonEvents.java index 8279bfe..77a9071 100644 --- a/src/main/java/thetadev/constructionwand/basics/CommonEvents.java +++ b/src/main/java/thetadev/constructionwand/basics/CommonEvents.java @@ -2,7 +2,6 @@ package thetadev.constructionwand.basics; import net.minecraft.world.entity.player.Player; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import thetadev.constructionwand.ConstructionWand; @@ -10,14 +9,9 @@ import thetadev.constructionwand.ConstructionWand; @Mod.EventBusSubscriber(modid = ConstructionWand.MODID) public class CommonEvents { - @SubscribeEvent - public static void serverStarting(ServerStartingEvent e) { - ReplacementRegistry.init(); - } - @SubscribeEvent public static void logOut(PlayerEvent.PlayerLoggedOutEvent e) { - Player player = e.getEntity(); + Player player = e.getPlayer(); if(player.level.isClientSide) return; ConstructionWand.instance.undoHistory.removePlayer(player); } diff --git a/src/main/java/thetadev/constructionwand/basics/ConfigServer.java b/src/main/java/thetadev/constructionwand/basics/ConfigServer.java index 97d7fca..6fc0de9 100644 --- a/src/main/java/thetadev/constructionwand/basics/ConfigServer.java +++ b/src/main/java/thetadev/constructionwand/basics/ConfigServer.java @@ -4,7 +4,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.Tiers; import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import thetadev.constructionwand.items.ModItems; @@ -14,7 +13,7 @@ import java.util.List; public class ConfigServer { - public static final ForgeConfigSpec SPEC; + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); public static final ForgeConfigSpec.IntValue LIMIT_CREATIVE; public static final ForgeConfigSpec.IntValue MAX_RANGE; @@ -33,7 +32,7 @@ public class ConfigServer private static final HashMap wandProperties = new HashMap<>(); public static WandProperties getWandProperties(Item wand) { - return wandProperties.getOrDefault(ForgeRegistries.ITEMS.getKey(wand), WandProperties.DEFAULT); + return wandProperties.getOrDefault(wand.getRegistryName(), WandProperties.DEFAULT); } public static class WandProperties @@ -101,41 +100,39 @@ public class ConfigServer } static { - final var builder = new ForgeConfigSpec.Builder(); - - builder.comment("This is the Server config for ConstructionWand.", + BUILDER.comment("This is the Server config for ConstructionWand.", "If you're not familiar with Forge's new split client/server config, let me explain:", "Client config is stored in the /config folder and only contains client specific settings like graphics and keybinds.", "Mod behavior is configured in the Server config, which is world-specific and thus located", "in the /saves/myworld/serverconfig folder. If you want to change the serverconfig for all", "new worlds, copy the config files in the /defaultconfigs folder."); - new WandProperties(builder, ModItems.WAND_STONE, Tiers.STONE.getUses(), 9, 0, 0, false); - new WandProperties(builder, ModItems.WAND_IRON, Tiers.IRON.getUses(), 27, 2, 9, true); - new WandProperties(builder, ModItems.WAND_DIAMOND, Tiers.DIAMOND.getUses(), 128, 8, 25, true); - new WandProperties(builder, ModItems.WAND_INFINITY, 0, 1024, 16, 81, true); + new WandProperties(BUILDER, ModItems.WAND_STONE, Tiers.STONE.getUses(), 9, 0, 0, false); + new WandProperties(BUILDER, ModItems.WAND_IRON, Tiers.IRON.getUses(), 27, 2, 9, true); + new WandProperties(BUILDER, ModItems.WAND_DIAMOND, Tiers.DIAMOND.getUses(), 128, 8, 25, true); + new WandProperties(BUILDER, ModItems.WAND_INFINITY, 0, 1024, 16, 81, true); - builder.push("misc"); - builder.comment("Block limit for Infinity Wand used in creative mode"); - LIMIT_CREATIVE = builder.defineInRange("InfinityWandCreative", 2048, 1, Integer.MAX_VALUE); - builder.comment("Maximum placement range (0: unlimited). Affects all wands and is meant for lag prevention, not game balancing."); - MAX_RANGE = builder.defineInRange("MaxRange", 100, 0, Integer.MAX_VALUE); - builder.comment("Number of operations that can be undone"); - UNDO_HISTORY = builder.defineInRange("UndoHistory", 3, 0, Integer.MAX_VALUE); - builder.comment("Place blocks below you while falling > 10 blocks with angel core (Can be used to save you from drops/the void)"); - ANGEL_FALLING = builder.define("AngelFalling", false); - builder.comment("Blocks to treat equally when in Similar mode. Enter block IDs seperated by ;"); - SIMILAR_BLOCKS = builder.defineList("SimilarBlocks", Arrays.asList(SIMILAR_BLOCKS_DEFAULT), obj -> true); - builder.pop(); + BUILDER.push("misc"); + BUILDER.comment("Block limit for Infinity Wand used in creative mode"); + LIMIT_CREATIVE = BUILDER.defineInRange("InfinityWandCreative", 2048, 1, Integer.MAX_VALUE); + BUILDER.comment("Maximum placement range (0: unlimited). Affects all wands and is meant for lag prevention, not game balancing."); + MAX_RANGE = BUILDER.defineInRange("MaxRange", 100, 0, Integer.MAX_VALUE); + BUILDER.comment("Number of operations that can be undone"); + UNDO_HISTORY = BUILDER.defineInRange("UndoHistory", 3, 0, Integer.MAX_VALUE); + BUILDER.comment("Place blocks below you while falling > 10 blocks with angel core (Can be used to save you from drops/the void)"); + ANGEL_FALLING = BUILDER.define("AngelFalling", false); + BUILDER.comment("Blocks to treat equally when in Similar mode. Enter block IDs seperated by ;"); + SIMILAR_BLOCKS = BUILDER.defineList("SimilarBlocks", Arrays.asList(SIMILAR_BLOCKS_DEFAULT), obj -> true); + BUILDER.pop(); - builder.push("tileentity"); - builder.comment("White/Blacklist for Tile Entities. Allow/Prevent blocks with TEs from being placed by wand.", + BUILDER.push("tileentity"); + BUILDER.comment("White/Blacklist for Tile Entities. Allow/Prevent blocks with TEs from being placed by wand.", "You can either add block ids like minecraft:chest or mod ids like minecraft"); - TE_LIST = builder.defineList("TEList", Arrays.asList(TE_LIST_DEFAULT), obj -> true); - builder.comment("If set to TRUE, treat TEList as a whitelist, otherwise blacklist"); - TE_WHITELIST = builder.define("TEWhitelist", false); - builder.pop(); - - SPEC = builder.build(); + TE_LIST = BUILDER.defineList("TEList", Arrays.asList(TE_LIST_DEFAULT), obj -> true); + BUILDER.comment("If set to TRUE, treat TEList as a whitelist, otherwise blacklist"); + TE_WHITELIST = BUILDER.define("TEWhitelist", false); + BUILDER.pop(); } + + public static final ForgeConfigSpec SPEC = BUILDER.build(); } diff --git a/src/main/java/thetadev/constructionwand/basics/ModStats.java b/src/main/java/thetadev/constructionwand/basics/ModStats.java index 84b5063..ccfa739 100644 --- a/src/main/java/thetadev/constructionwand/basics/ModStats.java +++ b/src/main/java/thetadev/constructionwand/basics/ModStats.java @@ -1,7 +1,6 @@ package thetadev.constructionwand.basics; import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.stats.StatFormatter; import net.minecraft.stats.Stats; @@ -17,7 +16,7 @@ public class ModStats private static void registerStat(ResourceLocation registryName) { // Compare with net.minecraft.stats.Stats#registerCustom - Registry.register(BuiltInRegistries.CUSTOM_STAT, registryName.getPath(), registryName); + Registry.register(Registry.CUSTOM_STAT, registryName.getPath(), registryName); Stats.CUSTOM.get(registryName, StatFormatter.DEFAULT); } } diff --git a/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java b/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java index ad252fb..3677d09 100644 --- a/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java +++ b/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java @@ -16,8 +16,6 @@ public class ReplacementRegistry private static final HashSet> replacements = new HashSet<>(); public static void init() { - replacements.clear(); - for(Object key : ConfigServer.SIMILAR_BLOCKS.get()) { if(!(key instanceof String)) continue; HashSet set = new HashSet<>(); diff --git a/src/main/java/thetadev/constructionwand/basics/WandUtil.java b/src/main/java/thetadev/constructionwand/basics/WandUtil.java index a0571a5..aa98cbe 100644 --- a/src/main/java/thetadev/constructionwand/basics/WandUtil.java +++ b/src/main/java/thetadev/constructionwand/basics/WandUtil.java @@ -20,8 +20,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.event.world.BlockEvent; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.containers.ContainerManager; import thetadev.constructionwand.items.wand.ItemWand; @@ -53,9 +52,8 @@ public class WandUtil return null; } - public static BlockPos posFromVec(Vec3 vec) { - return new BlockPos( - (int) Math.round(vec.x), (int) Math.round(vec.y), (int) Math.round(vec.z)); + public static BlockPos playerPos(Player player) { + return new BlockPos(player.position()); } public static Vec3 entityPositionVec(Entity entity) { @@ -93,7 +91,7 @@ public class WandUtil public static boolean isTEAllowed(BlockState state) { if(!state.hasBlockEntity()) return true; - ResourceLocation name = ForgeRegistries.BLOCKS.getKey(state.getBlock()); + ResourceLocation name = state.getBlock().getRegistryName(); if(name == null) return false; String fullId = name.toString(); diff --git a/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java b/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java index b830526..8e80d9d 100644 --- a/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java +++ b/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java @@ -1,18 +1,17 @@ package thetadev.constructionwand.basics.pool; -import net.minecraft.util.RandomSource; - import javax.annotation.Nullable; import java.util.HashMap; import java.util.HashSet; +import java.util.Random; public class RandomPool implements IPool { - private final RandomSource rng; + private final Random rng; private final HashMap elements; private HashSet pool; - public RandomPool(RandomSource rng) { + public RandomPool(Random rng) { this.rng = rng; elements = new HashMap<>(); reset(); diff --git a/src/main/java/thetadev/constructionwand/client/ClientEvents.java b/src/main/java/thetadev/constructionwand/client/ClientEvents.java index 873f2e5..a92bca2 100644 --- a/src/main/java/thetadev/constructionwand/client/ClientEvents.java +++ b/src/main/java/thetadev/constructionwand/client/ClientEvents.java @@ -26,7 +26,7 @@ public class ClientEvents // Send state of OPT key to server @SubscribeEvent - public void KeyEvent(InputEvent.Key event) { + public void KeyEvent(InputEvent.KeyInputEvent event) { Player player = Minecraft.getInstance().player; if(player == null) return; if(WandUtil.holdingWand(player) == null) return; @@ -42,7 +42,7 @@ public class ClientEvents // Sneak+(OPT)+Scroll to change direction lock @SubscribeEvent(priority = EventPriority.HIGHEST) - public void MouseScrollEvent(InputEvent.MouseScrollingEvent event) { + public void MouseScrollEvent(InputEvent.MouseScrollEvent event) { Player player = Minecraft.getInstance().player; double scroll = event.getScrollDelta(); @@ -60,7 +60,7 @@ public class ClientEvents // Sneak+(OPT)+Left click wand to change core @SubscribeEvent public void onLeftClickEmpty(PlayerInteractEvent.LeftClickEmpty event) { - Player player = event.getEntity(); + Player player = event.getPlayer(); if(player == null || !modeKeyCombDown(player)) return; @@ -77,7 +77,7 @@ public class ClientEvents public void onRightClickItem(PlayerInteractEvent.RightClickItem event) { if(event.getSide().isServer()) return; - Player player = event.getEntity(); + Player player = event.getPlayer(); if(player == null || !guiKeyCombDown(player)) return; ItemStack wand = event.getItemStack(); diff --git a/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java b/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java index 8ce9ab7..56797eb 100644 --- a/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java +++ b/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java @@ -12,7 +12,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraftforge.client.event.RenderHighlightEvent; +import net.minecraftforge.client.event.DrawSelectionEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import thetadev.constructionwand.basics.WandUtil; import thetadev.constructionwand.items.wand.ItemWand; @@ -26,7 +26,7 @@ public class RenderBlockPreview public Set undoBlocks; @SubscribeEvent - public void renderBlockHighlight(RenderHighlightEvent.Block event) { + public void renderBlockHighlight(DrawSelectionEvent.HighlightBlock event) { if(event.getTarget().getType() != HitResult.Type.BLOCK) return; BlockHitResult rtr = event.getTarget(); @@ -59,7 +59,7 @@ public class RenderBlockPreview MultiBufferSource buffer = event.getMultiBufferSource(); VertexConsumer lineBuilder = buffer.getBuffer(RenderType.LINES); - double partialTicks = event.getPartialTick(); + double partialTicks = event.getPartialTicks(); double d0 = player.xOld + (player.getX() - player.xOld) * partialTicks; double d1 = player.yOld + player.getEyeHeight() + (player.getY() - player.yOld) * partialTicks; double d2 = player.zOld + (player.getZ() - player.zOld) * partialTicks; @@ -72,10 +72,6 @@ public class RenderBlockPreview event.setCanceled(true); } - public void reset() { - wandJob = null; - } - private static boolean compareRTR(BlockHitResult rtr1, BlockHitResult rtr2) { return rtr1.getBlockPos().equals(rtr2.getBlockPos()) && rtr1.getDirection().equals(rtr2.getDirection()); } diff --git a/src/main/java/thetadev/constructionwand/client/ScreenWand.java b/src/main/java/thetadev/constructionwand/client/ScreenWand.java index 0a546ae..d665e83 100644 --- a/src/main/java/thetadev/constructionwand/client/ScreenWand.java +++ b/src/main/java/thetadev/constructionwand/client/ScreenWand.java @@ -3,9 +3,10 @@ package thetadev.constructionwand.client; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.ItemStack; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.IOption; @@ -14,7 +15,8 @@ import thetadev.constructionwand.network.PacketWandOption; import javax.annotation.Nonnull; -public class ScreenWand extends Screen { +public class ScreenWand extends Screen +{ private final ItemStack wand; private final WandOptions wandOptions; @@ -29,7 +31,7 @@ public class ScreenWand extends Screen { private static final int FIELD_HEIGHT = N_ROWS * (BUTTON_HEIGHT + SPACING_HEIGHT) - SPACING_HEIGHT; public ScreenWand(ItemStack wand) { - super(Component.literal("ScreenWand")); + super(new TextComponent("ScreenWand")); this.wand = wand; wandOptions = new WandOptions(wand); } @@ -62,12 +64,7 @@ public class ScreenWand extends Screen { } private void createButton(int cx, int cy, IOption option) { - Button button = Button.builder(getButtonLabel(option), bt -> clickButton(bt, option)) - .pos(getX(cx), getY(cy)) - .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .tooltip(getButtonTooltip(option)) - .build(); - + Button button = new Button(getX(cx), getY(cy), BUTTON_WIDTH, BUTTON_HEIGHT, getButtonLabel(option), bt -> clickButton(bt, option), (bt, ms, x, y) -> drawTooltip(ms, x, y, option)); button.active = option.isEnabled(); addRenderableWidget(button); } @@ -76,7 +73,12 @@ public class ScreenWand extends Screen { option.next(); ConstructionWand.instance.HANDLER.sendToServer(new PacketWandOption(option, false)); button.setMessage(getButtonLabel(option)); - button.setTooltip(getButtonTooltip(option)); + } + + private void drawTooltip(PoseStack matrixStack, int mouseX, int mouseY, IOption option) { + if(isMouseOver(mouseX, mouseY)) { + renderTooltip(matrixStack, new TranslatableComponent(option.getDescTranslation()), mouseX, mouseY); + } } private int getX(int n) { @@ -88,10 +90,6 @@ public class ScreenWand extends Screen { } private Component getButtonLabel(IOption option) { - return Component.translatable(option.getKeyTranslation()).append(Component.translatable(option.getValueTranslation())); - } - - private Tooltip getButtonTooltip(IOption option) { - return Tooltip.create(Component.translatable(option.getDescTranslation())); + return new TranslatableComponent(option.getKeyTranslation()).append(new TranslatableComponent(option.getValueTranslation())); } } diff --git a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java index 880f57d..8ffb651 100644 --- a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java +++ b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java @@ -5,7 +5,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import thetadev.constructionwand.api.IContainerHandler; import vazkii.botania.api.BotaniaForgeCapabilities; -import vazkii.botania.api.item.BlockProvider; +import vazkii.botania.api.item.IBlockProvider; import java.util.Optional; @@ -18,10 +18,10 @@ public class HandlerBotania implements IContainerHandler @Override public int countItems(Player player, ItemStack itemStack, ItemStack inventoryStack) { - Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); + Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); if(provOptional.isEmpty()) return 0; - BlockProvider prov = provOptional.get(); + IBlockProvider prov = provOptional.get(); int provCount = prov.getBlockCount(player, inventoryStack, Block.byItem(itemStack.getItem())); if(provCount == -1) return Integer.MAX_VALUE; @@ -30,10 +30,10 @@ public class HandlerBotania implements IContainerHandler @Override public int useItems(Player player, ItemStack itemStack, ItemStack inventoryStack, int count) { - Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); + Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); if(provOptional.isEmpty()) return 0; - BlockProvider prov = provOptional.get(); + IBlockProvider prov = provOptional.get(); if(prov.provideBlock(player, inventoryStack, Block.byItem(itemStack.getItem()), true)) return 0; return count; diff --git a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java index c4a85cc..d67ae0e 100644 --- a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java +++ b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java @@ -2,7 +2,7 @@ package thetadev.constructionwand.containers.handlers; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import thetadev.constructionwand.api.IContainerHandler; import thetadev.constructionwand.basics.WandUtil; @@ -13,12 +13,12 @@ public class HandlerCapability implements IContainerHandler { @Override public boolean matches(Player player, ItemStack itemStack, ItemStack inventoryStack) { - return inventoryStack != null && inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent(); + return inventoryStack != null && inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).isPresent(); } @Override public int countItems(Player player, ItemStack itemStack, ItemStack inventoryStack) { - Optional itemHandlerOptional = inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve(); + Optional itemHandlerOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); if(itemHandlerOptional.isEmpty()) return 0; int total = 0; @@ -36,7 +36,7 @@ public class HandlerCapability implements IContainerHandler @Override public int useItems(Player player, ItemStack itemStack, ItemStack inventoryStack, int count) { - Optional itemHandlerOptional = inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve(); + Optional itemHandlerOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); if(itemHandlerOptional.isEmpty()) return 0; IItemHandler itemHandler = itemHandlerOptional.get(); diff --git a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java index 4b0c6e4..7fafdaf 100644 --- a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java +++ b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java @@ -1,13 +1,11 @@ package thetadev.constructionwand.crafting; -import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; import net.minecraft.world.level.Level; import thetadev.constructionwand.api.IWandUpgrade; import thetadev.constructionwand.basics.ConfigServer; @@ -18,10 +16,10 @@ import javax.annotation.Nonnull; public class RecipeWandUpgrade extends CustomRecipe { - public static final SimpleCraftingRecipeSerializer SERIALIZER = new SimpleCraftingRecipeSerializer<>(RecipeWandUpgrade::new); + public static final SimpleRecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>(RecipeWandUpgrade::new); - public RecipeWandUpgrade(ResourceLocation resourceLocation, CraftingBookCategory category) { - super(resourceLocation, category); + public RecipeWandUpgrade(ResourceLocation resourceLocation) { + super(resourceLocation); } @Override @@ -45,7 +43,7 @@ public class RecipeWandUpgrade extends CustomRecipe @Nonnull @Override - public ItemStack assemble(@Nonnull CraftingContainer inv, @Nonnull RegistryAccess registryAccess) { + public ItemStack assemble(@Nonnull CraftingContainer inv) { ItemStack wand = null; IWandUpgrade upgrade = null; diff --git a/src/main/java/thetadev/constructionwand/data/Inp.java b/src/main/java/thetadev/constructionwand/data/Inp.java index 29cfdbc..d85270a 100644 --- a/src/main/java/thetadev/constructionwand/data/Inp.java +++ b/src/main/java/thetadev/constructionwand/data/Inp.java @@ -1,11 +1,10 @@ package thetadev.constructionwand.data; import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.tags.TagKey; +import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.ForgeRegistries; public class Inp { @@ -20,10 +19,10 @@ public class Inp } public static Inp fromItem(ItemLike in) { - return new Inp(ForgeRegistries.ITEMS.getKey(in.asItem()).getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); + return new Inp(in.asItem().getRegistryName().getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); } - public static Inp fromTag(TagKey in) { - return new Inp(in.location().getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); + public static Inp fromTag(Tag.Named in) { + return new Inp(in.getName().getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); } } \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java index 2562634..c007b70 100644 --- a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java @@ -1,11 +1,10 @@ package thetadev.constructionwand.data; -import net.minecraft.data.PackOutput; +import net.minecraft.data.DataGenerator; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraftforge.client.model.generators.ItemModelProvider; import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.items.ModItems; @@ -14,15 +13,15 @@ import javax.annotation.Nonnull; public class ItemModelGenerator extends ItemModelProvider { - public ItemModelGenerator(PackOutput packOutput, ExistingFileHelper existingFileHelper) { - super(packOutput, ConstructionWand.MODID, existingFileHelper); + public ItemModelGenerator(DataGenerator generator, ExistingFileHelper existingFileHelper) { + super(generator, ConstructionWand.MODID, existingFileHelper); } @Override protected void registerModels() { for(RegistryObject itemObject : ModItems.ITEMS.getEntries()) { Item item = itemObject.get(); - String name = ForgeRegistries.ITEMS.getKey(item).getPath(); + String name = item.getRegistryName().getPath(); if(item instanceof ICustomItemModel) ((ICustomItemModel) item).generateCustomItemModel(this, name); diff --git a/src/main/java/thetadev/constructionwand/data/ModData.java b/src/main/java/thetadev/constructionwand/data/ModData.java index 7b5719f..e389e41 100644 --- a/src/main/java/thetadev/constructionwand/data/ModData.java +++ b/src/main/java/thetadev/constructionwand/data/ModData.java @@ -1,11 +1,10 @@ package thetadev.constructionwand.data; import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.forge.event.lifecycle.GatherDataEvent; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class ModData @@ -13,15 +12,14 @@ public class ModData @SubscribeEvent public static void gatherData(GatherDataEvent event) { DataGenerator generator = event.getGenerator(); - PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper fileHelper = event.getExistingFileHelper(); if(event.includeServer()) { - generator.addProvider(true, new RecipeGenerator(packOutput)); + generator.addProvider(new RecipeGenerator(generator)); } if(event.includeClient()) { - generator.addProvider(true, new ItemModelGenerator(packOutput, fileHelper)); + generator.addProvider(new ItemModelGenerator(generator, fileHelper)); } } } diff --git a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java index 1319f4c..aaff00c 100644 --- a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java @@ -1,15 +1,14 @@ package thetadev.constructionwand.data; -import net.minecraft.data.PackOutput; +import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeProvider; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.SpecialRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.Tags; import net.minecraftforge.registries.ForgeRegistries; @@ -22,12 +21,12 @@ import java.util.function.Consumer; public class RecipeGenerator extends RecipeProvider { - public RecipeGenerator(PackOutput packOutput) { - super(packOutput); + public RecipeGenerator(DataGenerator generatorIn) { + super(generatorIn); } @Override - protected void buildRecipes(@Nonnull Consumer consumer) { + protected void buildCraftingRecipes(@Nonnull Consumer consumer) { wandRecipe(consumer, ModItems.WAND_STONE.get(), Inp.fromTag(ItemTags.STONE_TOOL_MATERIALS)); wandRecipe(consumer, ModItems.WAND_IRON.get(), Inp.fromTag(Tags.Items.INGOTS_IRON)); wandRecipe(consumer, ModItems.WAND_DIAMOND.get(), Inp.fromTag(Tags.Items.GEMS_DIAMOND)); @@ -40,7 +39,7 @@ public class RecipeGenerator extends RecipeProvider } private void wandRecipe(Consumer consumer, ItemLike wand, Inp material) { - ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, wand) + ShapedRecipeBuilder.shaped(wand) .define('X', material.ingredient) .define('#', Tags.Items.RODS_WOODEN) .pattern(" X") @@ -51,7 +50,7 @@ public class RecipeGenerator extends RecipeProvider } private void coreRecipe(Consumer consumer, ItemLike core, Inp item1, Inp item2) { - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, core) + ShapedRecipeBuilder.shaped(core) .define('O', item1.ingredient) .define('X', item2.ingredient) .define('#', Tags.Items.GLASS_PANES) @@ -62,8 +61,14 @@ public class RecipeGenerator extends RecipeProvider .save(consumer); } - private void specialRecipe(Consumer consumer, SimpleCraftingRecipeSerializer serializer) { + private void specialRecipe(Consumer consumer, SimpleRecipeSerializer serializer) { ResourceLocation name = ForgeRegistries.RECIPE_SERIALIZERS.getKey(serializer); SpecialRecipeBuilder.special(serializer).save(consumer, ConstructionWand.loc("dynamic/" + name.getPath()).toString()); } + + @Nonnull + @Override + public String getName() { + return ConstructionWand.MODID + " crafting recipes"; + } } \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java index 6886b59..ed0ca4d 100644 --- a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java +++ b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java @@ -7,12 +7,11 @@ import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.registration.IRecipeRegistration; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.NotNull; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.ConfigClient; import thetadev.constructionwand.basics.ConfigServer; @@ -35,12 +34,12 @@ public class ConstructionWandJeiPlugin implements IModPlugin private Component keyComboComponent(boolean shiftOpt, Component optkeyComponent) { String key = shiftOpt ? "sneak_opt" : "sneak"; - return Component.translatable(baseKey + "key." + key, optkeyComponent).withStyle(ChatFormatting.BLUE); + return new TranslatableComponent(baseKey + "key." + key, optkeyComponent).withStyle(ChatFormatting.BLUE); } @Override - public void registerRecipes(@NotNull IRecipeRegistration registration) { - Component optkeyComponent = Component.translatable(InputConstants.getKey(ConfigClient.OPT_KEY.get(), -1).getName()) + public void registerRecipes(IRecipeRegistration registration) { + Component optkeyComponent = new TranslatableComponent(InputConstants.getKey(ConfigClient.OPT_KEY.get(), -1).getName()) .withStyle(ChatFormatting.BLUE); Component wandModeComponent = keyComboComponent(ConfigClient.SHIFTOPT_MODE.get(), optkeyComponent); Component wandGuiComponent = keyComboComponent(ConfigClient.SHIFTOPT_GUI.get(), optkeyComponent); @@ -50,21 +49,21 @@ public class ConstructionWandJeiPlugin implements IModPlugin ConfigServer.WandProperties wandProperties = ConfigServer.getWandProperties(wand); String durabilityKey = wand == ModItems.WAND_INFINITY.get() ? "unlimited" : "limited"; - Component durabilityComponent = Component.translatable(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); + Component durabilityComponent = new TranslatableComponent(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); - registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM_STACK, - Component.translatable(baseKey + "wand", - Component.translatable(baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath()), - wandProperties.getLimit(), durabilityComponent, optkeyComponent, wandModeComponent, wandGuiComponent) + registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM, + new TranslatableComponent(baseKey + "wand", + new TranslatableComponent(baseKeyItem + wand.getRegistryName().getPath()), + wandProperties.getLimit(), durabilityComponent, + optkeyComponent, wandModeComponent, wandGuiComponent) ); } for(RegistryObject coreSupplier : ModItems.CORES) { Item core = coreSupplier.get(); - registration.addIngredientInfo(new ItemStack(core), VanillaTypes.ITEM_STACK, - Component.translatable(baseKey + ForgeRegistries.ITEMS.getKey(core).getPath()) - .append("\n\n") - .append(Component.translatable(baseKey + "core", wandModeComponent)) + registration.addIngredientInfo(new ItemStack(core), VanillaTypes.ITEM, + new TranslatableComponent(baseKey + core.getRegistryName().getPath()), + new TranslatableComponent(baseKey + "core", wandModeComponent) ); } } diff --git a/src/main/java/thetadev/constructionwand/items/ModItems.java b/src/main/java/thetadev/constructionwand/items/ModItems.java index 26b6300..aabd39d 100644 --- a/src/main/java/thetadev/constructionwand/items/ModItems.java +++ b/src/main/java/thetadev/constructionwand/items/ModItems.java @@ -1,19 +1,18 @@ package thetadev.constructionwand.items; +import net.minecraft.client.Minecraft; +import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.Tiers; +import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.RegisterColorHandlersEvent; -import net.minecraftforge.event.CreativeModeTabEvent; +import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegisterEvent; -import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.registries.*; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.WandOptions; import thetadev.constructionwand.crafting.RecipeWandUpgrade; @@ -43,18 +42,17 @@ public class ModItems public static final RegistryObject[] CORES = new RegistryObject[] {CORE_ANGEL, CORE_DESTRUCTION}; public static Item.Properties propWand() { - return new Item.Properties(); + return new Item.Properties().tab(CreativeModeTab.TAB_TOOLS); } private static Item.Properties propUpgrade() { - return new Item.Properties().stacksTo(1); + return new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(1); } @SubscribeEvent - public static void registerRecipeSerializers(RegisterEvent event) { - event.register(ForgeRegistries.Keys.RECIPE_SERIALIZERS, registry -> { - registry.register("wand_upgrade", RecipeWandUpgrade.SERIALIZER); - }); + public static void registerRecipeSerializers(RegistryEvent.Register> event) { + IForgeRegistry> r = event.getRegistry(); + register(r, "wand_upgrade", RecipeWandUpgrade.SERIALIZER); } @OnlyIn(Dist.CLIENT) @@ -70,25 +68,17 @@ public class ModItems } @OnlyIn(Dist.CLIENT) - @SubscribeEvent - public static void registerItemColors(RegisterColorHandlersEvent.Item event) { + public static void registerItemColors() { + ItemColors colors = Minecraft.getInstance().getItemColors(); + for(RegistryObject itemSupplier : WANDS) { Item item = itemSupplier.get(); - event.register((stack, layer) -> (layer == 1 && stack.getItem() instanceof ItemWand) ? + colors.register((stack, layer) -> (layer == 1 && stack.getItem() instanceof ItemWand) ? new WandOptions(stack).cores.get().getColor() : -1, item); } } - @SubscribeEvent - public static void addCreative(CreativeModeTabEvent.BuildContents event) { - if (event.getTab() == CreativeModeTabs.TOOLS_AND_UTILITIES) { - for(RegistryObject itemSupplier : WANDS) { - event.accept(itemSupplier); - } - } else if (event.getTab() == CreativeModeTabs.INGREDIENTS) { - for(RegistryObject itemSupplier : CORES) { - event.accept(itemSupplier); - } - } + private static > void register(IForgeRegistry reg, String name, IForgeRegistryEntry thing) { + reg.register(thing.setRegistryName(ConstructionWand.loc(name))); } } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java index 25836c0..6b3362c 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java @@ -2,6 +2,7 @@ package thetadev.constructionwand.items.core; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -22,12 +23,9 @@ public abstract class ItemCore extends Item implements IWandCore @OnlyIn(Dist.CLIENT) public void appendHoverText(@Nonnull ItemStack itemstack, Level worldIn, @Nonnull List lines, @Nonnull TooltipFlag extraInfo) { - lines.add( - Component.translatable(ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc") - .withStyle(ChatFormatting.GRAY) - ); - lines.add( - Component.translatable(ConstructionWand.MODID + ".tooltip.core_tip").withStyle(ChatFormatting.AQUA) - ); + lines.add(new TranslatableComponent(ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc") + .withStyle(ChatFormatting.GRAY)); + lines.add(new TranslatableComponent(ConstructionWand.MODID + ".tooltip.core_tip") + .withStyle(ChatFormatting.AQUA)); } } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java b/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java index 07a472e..5062761 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java @@ -1,7 +1,5 @@ package thetadev.constructionwand.items.core; -import net.minecraft.resources.ResourceLocation; -import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.api.IWandAction; import thetadev.constructionwand.wand.action.ActionAngel; @@ -20,9 +18,4 @@ public class ItemCoreAngel extends ItemCore public IWandAction getWandAction() { return new ActionAngel(); } - - @Override - public ResourceLocation getRegistryName() { - return ConstructionWand.loc("core_angel"); - } } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java index 16d1d8c..bb2b5d3 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java @@ -1,7 +1,5 @@ package thetadev.constructionwand.items.core; -import net.minecraft.resources.ResourceLocation; -import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.api.IWandAction; import thetadev.constructionwand.wand.action.ActionDestruction; @@ -20,9 +18,4 @@ public class ItemCoreDestruction extends ItemCore public IWandAction getWandAction() { return new ActionDestruction(); } - - @Override - public ResourceLocation getRegistryName() { - return ConstructionWand.loc("core_destruction"); - } } diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java index 69f1b12..4fa3529 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java @@ -3,6 +3,8 @@ package thetadev.constructionwand.items.wand; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -66,7 +68,7 @@ public abstract class ItemWand extends Item implements ICustomItemModel // Right click: Place angel block WandJob job = getWandJob(player, world, BlockHitResult.miss(player.getLookAngle(), - WandUtil.fromVector(player.getLookAngle()), player.blockPosition()), stack); + WandUtil.fromVector(player.getLookAngle()), WandUtil.playerPos(player)), stack); return job.doIt() ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); } return InteractionResultHolder.fail(stack); @@ -105,35 +107,35 @@ public abstract class ItemWand extends Item implements ICustomItemModel if(Screen.hasShiftDown()) { for(int i = 1; i < options.allOptions.length; i++) { IOption opt = options.allOptions[i]; - lines.add(Component.translatable(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) - .append(Component.translatable(opt.getValueTranslation()).withStyle(ChatFormatting.GRAY)) + lines.add(new TranslatableComponent(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) + .append(new TranslatableComponent(opt.getValueTranslation()).withStyle(ChatFormatting.GRAY)) ); } if(!options.cores.getUpgrades().isEmpty()) { - lines.add(Component.literal("")); - lines.add(Component.translatable(langTooltip + "cores").withStyle(ChatFormatting.GRAY)); + lines.add(new TextComponent("")); + lines.add(new TranslatableComponent(langTooltip + "cores").withStyle(ChatFormatting.GRAY)); for(IWandCore core : options.cores.getUpgrades()) { - lines.add(Component.translatable(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString())); + lines.add(new TranslatableComponent(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString())); } } } // Default tooltip: show block limit + active wand core else { IOption opt = options.allOptions[0]; - lines.add(Component.translatable(langTooltip + "blocks", limit).withStyle(ChatFormatting.GRAY)); - lines.add(Component.translatable(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) - .append(Component.translatable(opt.getValueTranslation()).withStyle(ChatFormatting.WHITE))); - lines.add(Component.translatable(langTooltip + "shift").withStyle(ChatFormatting.AQUA)); + lines.add(new TranslatableComponent(langTooltip + "blocks", limit).withStyle(ChatFormatting.GRAY)); + lines.add(new TranslatableComponent(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) + .append(new TranslatableComponent(opt.getValueTranslation()).withStyle(ChatFormatting.WHITE))); + lines.add(new TranslatableComponent(langTooltip + "shift").withStyle(ChatFormatting.AQUA)); } } public static void optionMessage(Player player, IOption option) { player.displayClientMessage( - Component.translatable(option.getKeyTranslation()).withStyle(ChatFormatting.AQUA) - .append(Component.translatable(option.getValueTranslation()).withStyle(ChatFormatting.WHITE)) - .append(Component.literal(" - ").withStyle(ChatFormatting.GRAY)) - .append(Component.translatable(option.getDescTranslation()).withStyle(ChatFormatting.WHITE)) + new TranslatableComponent(option.getKeyTranslation()).withStyle(ChatFormatting.AQUA) + .append(new TranslatableComponent(option.getValueTranslation()).withStyle(ChatFormatting.WHITE)) + .append(new TextComponent(" - ").withStyle(ChatFormatting.GRAY)) + .append(new TranslatableComponent(option.getDescTranslation()).withStyle(ChatFormatting.WHITE)) , true); } diff --git a/src/main/java/thetadev/constructionwand/wand/WandJob.java b/src/main/java/thetadev/constructionwand/wand/WandJob.java index 958f60d..0eb6269 100644 --- a/src/main/java/thetadev/constructionwand/wand/WandJob.java +++ b/src/main/java/thetadev/constructionwand/wand/WandJob.java @@ -16,6 +16,7 @@ import thetadev.constructionwand.api.IWandAction; import thetadev.constructionwand.api.IWandSupplier; import thetadev.constructionwand.basics.ConfigServer; import thetadev.constructionwand.basics.ModStats; +import thetadev.constructionwand.basics.WandUtil; import thetadev.constructionwand.basics.option.WandOptions; import thetadev.constructionwand.items.ModItems; import thetadev.constructionwand.items.wand.ItemWand; @@ -118,7 +119,7 @@ public class WandJob // Play place sound if(!placeSnapshots.isEmpty()) { SoundType sound = placeSnapshots.get(0).getBlockState().getSoundType(); - world.playSound(null, player.blockPosition(), sound.getPlaceSound(), SoundSource.BLOCKS, sound.volume, sound.pitch); + world.playSound(null, WandUtil.playerPos(player), sound.getPlaceSound(), SoundSource.BLOCKS, sound.volume, sound.pitch); // Add to job history for undo ConstructionWand.instance.undoHistory.add(player, world, placeSnapshots); diff --git a/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java b/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java index 194e2c7..36033ab 100644 --- a/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java +++ b/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java @@ -60,7 +60,8 @@ public class ActionAngel implements IWandAction Vec3 playerVec = WandUtil.entityPositionVec(player); Vec3 lookVec = player.getLookAngle().multiply(2, 2, 2); Vec3 placeVec = playerVec.add(lookVec); - BlockPos currentPos = WandUtil.posFromVec(placeVec); + + BlockPos currentPos = new BlockPos(placeVec); PlaceSnapshot snapshot = supplier.getPlaceSnapshot(world, currentPos, rayTraceResult, null); if(snapshot != null) placeSnapshots.add(snapshot); diff --git a/src/main/java/thetadev/constructionwand/wand/undo/PlaceSnapshot.java b/src/main/java/thetadev/constructionwand/wand/undo/PlaceSnapshot.java index ca17038..732c2b0 100644 --- a/src/main/java/thetadev/constructionwand/wand/undo/PlaceSnapshot.java +++ b/src/main/java/thetadev/constructionwand/wand/undo/PlaceSnapshot.java @@ -6,8 +6,6 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.Property; @@ -100,7 +98,7 @@ public class PlaceSnapshot implements ISnapshot // Can block be placed? BlockState blockState = item.getBlock().getStateForPlacement(ctx); - if(blockState == null) return null; + if(blockState == null || !blockState.canSurvive(world, pos)) return null; // Forbidden Tile Entity? if(!WandUtil.isTEAllowed(blockState)) return null; @@ -108,11 +106,6 @@ public class PlaceSnapshot implements ISnapshot // No entities colliding? if(WandUtil.entitiesCollidingWithBlock(world, blockState, pos)) return null; - // Adjust blockstate to neighbors - // TODO: verify that - blockState = Block.updateFromNeighbourShapes(blockState, world, pos); - if(blockState.getBlock() == Blocks.AIR || !blockState.canSurvive(world, pos)) return null; - // Copy block properties from supporting block if(targetMode && supportingBlock != null) { // Block properties to be copied (alignment/rotation properties) diff --git a/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java b/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java index 2aa9fed..9443df5 100644 --- a/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java +++ b/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.Level; import net.minecraftforge.network.PacketDistributor; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.ConfigServer; +import thetadev.constructionwand.basics.WandUtil; import thetadev.constructionwand.network.PacketUndoBlocks; import java.util.*; @@ -141,7 +142,7 @@ public class UndoHistory // Play teleport sound SoundEvent sound = SoundEvents.CHORUS_FRUIT_TELEPORT; - world.playSound(null, player.blockPosition(), sound, SoundSource.PLAYERS, 1.0F, 1.0F); + world.playSound(null, WandUtil.playerPos(player), sound, SoundSource.PLAYERS, 1.0F, 1.0F); return true; } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index d6e6e9f..880dce7 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[45,)" +loaderVersion = "[38,)" license = "MIT License" [[mods]] modId="constructionwand" @@ -20,12 +20,12 @@ This is my first minecraft mod. May the odds be ever in your favor. [[dependencies.constructionwand]] modId="forge" mandatory = true -versionRange = "[45,)" +versionRange = "[38,)" ordering = "NONE" side="BOTH" [[dependencies.constructionwand]] modId="minecraft" mandatory = true -versionRange = "[1.19.4, 1.20)" +versionRange = "[1.18, 1.19)" ordering = "NONE" side="BOTH" diff --git a/src/main/resources/assets/constructionwand/lang/tr_tr.json b/src/main/resources/assets/constructionwand/lang/tr_tr.json new file mode 100644 index 0000000..05f5044 --- /dev/null +++ b/src/main/resources/assets/constructionwand/lang/tr_tr.json @@ -0,0 +1,70 @@ +{ + "item.constructionwand.stone_wand": "Taş Asa", + "item.constructionwand.iron_wand": "Demir Asa", + "item.constructionwand.diamond_wand": "Elmas Asa", + "item.constructionwand.infinity_wand": "Sonsuzluk Asası", + "item.constructionwand.core_angel": "Melek Asa Çekirdeği", + "item.constructionwand.core_destruction": "Yıkım Asa Çekirdeği", + + "constructionwand.tooltip.blocks": "Maks. %d blok", + "constructionwand.tooltip.shift": "[SHIFT] bas", + "constructionwand.tooltip.cores": "Asa çekirdekleri:", + "constructionwand.tooltip.core_tip": "Çekirdeği asanızla birlikte üretim ızgarasında birleştirin", + + "constructionwand.option.cores": "", + "constructionwand.option.cores.constructionwand:default": "İnşa Çekirdeği", + "constructionwand.option.cores.constructionwand:default.desc": "Yapınızın size bakan tarafını uzatır", + "constructionwand.option.cores.constructionwand:core_angel": "§6Melek Çekirdeği", + "constructionwand.option.cores.constructionwand:core_angel.desc": "Blokların arkasına ve havaya yerleştirir", + "constructionwand.option.cores.constructionwand:core_destruction": "§cYıkım Çekirdeği", + "constructionwand.option.cores.constructionwand:core_destruction.desc": "Size bakan taraftaki blokları yok eder", + + "constructionwand.option.lock": "Sınırlama: ", + "constructionwand.option.lock.horizontal": "§aSol/Sağ", + "constructionwand.option.lock.horizontal.desc": "Orijinal bloğun önüne yatay bir sütun oluşturur", + "constructionwand.option.lock.vertical": "§aYukarı/Aşağı", + "constructionwand.option.lock.vertical.desc": "Orijinal bloğun önünde dikey bir sütun oluşturur", + "constructionwand.option.lock.northsouth": "§6Kuzey/Güney", + "constructionwand.option.lock.northsouth.desc": "Orijinal bloğun üstüne K/G yönünde bir sıra oluşturun", + "constructionwand.option.lock.eastwest": "§6Doğu/Batı", + "constructionwand.option.lock.eastwest.desc": "Orijinal bloğun üstüne D/B yönünde bir sıra oluşturur", + "constructionwand.option.lock.nolock": "§cYok", + "constructionwand.option.lock.nolock.desc": "Orijinal bloğun herhangi bir tarafından uzatır", + + "constructionwand.option.direction": "Yön: ", + "constructionwand.option.direction.target": "§6Hedef", + "constructionwand.option.direction.target.desc": "Blokları hedef blokla aynı yönde yerleştirir", + "constructionwand.option.direction.player": "§aOyuncu", + "constructionwand.option.direction.player.desc": "Blokları oyuncuya bakacak şekilde yerleştirir", + + "constructionwand.option.replace": "Değiştirme: ", + "constructionwand.option.replace.yes": "§aEvet", + "constructionwand.option.replace.yes.desc": "Sıvılar, kar ve uzun otlar gibi belirli blokları değiştirir", + "constructionwand.option.replace.no": "§cHayır", + "constructionwand.option.replace.no.desc": "Blokları değiştirmez", + + "constructionwand.option.match": "Eşleşen: ", + "constructionwand.option.match.exact": "§aAynı", + "constructionwand.option.match.exact.desc": "Yalnızca tamamen aynı olan blokları uzatır", + "constructionwand.option.match.similar": "§6Benzer", + "constructionwand.option.match.similar.desc": "Benzer bloklara (toprak/çimen türleri) eşit davranır", + "constructionwand.option.match.any": "§cHerhangi", + "constructionwand.option.match.any.desc": "Herhangi bir bloğu uzatır", + + "constructionwand.option.random": "Rastgele: ", + "constructionwand.option.random.yes": "§aEvet", + "constructionwand.option.random.yes.desc": "Hotbar'ınızdan rastgele bloklar yerleştirir", + "constructionwand.option.random.no": "§cHayır", + "constructionwand.option.random.no.desc": "Yerleştirilen blokları rastgeleleştirmez", + + "constructionwand.description.wand": "%1$s, bir yapının size bakan tarafına en fazla %2$d blok yerleştirebilir ve %3$s dayanıklılığı vardır.\n\n%5$s tuşunu basılı tutun ve yerleştirme sınırlamasını değiştirmek için kaydırın (Yatay, Dikey, Kuzey/Güney, Doğu/Batı, Kilitsiz).\n\n%6$s§9+Sağ tıklama ile seçenek ekranını açın§0.\n\n§5§nGERİ ALMA§0§r\nBir bloğa bakarken §9Eğil+§0%4$s tuşunu basılı tuttuğunuzda, yerleştirdiğiniz son bloklar, çevresinde yeşil bir çerçeveyle gösterilecektir. §9Eğil+§0%4$s§9+Bunlardan herhangi birine sağ tıklama§0 işlemi geri alacak ve tüm öğeleri size geri verecektir. Yıkım çekirdeğini kullandıysanız blokları geri koyacaktır.\n\n§5§nKONTEYNERLER§0§r\nShulker kutuları, paketler ve diğer modlardan birçok konteyner, asa için yapı taşları sağlar.\n\n§5§nBOŞTAKİ EL ÖNCELİĞݧ0§r\nBoştaki elinizde blok olduğunda, baktığınız blok yerine boştaki elinizdekini yerleştirirsiniz.", + "constructionwand.description.durability.limited": "%d blok için", + "constructionwand.description.durability.unlimited": "sonsuza kadar", + "constructionwand.description.key.sneak": "Eğil", + "constructionwand.description.key.sneak_opt": "Eğil+%s", + "constructionwand.description.core": "§5§nKURULUM§0§r\nTakmak için yeni çekirdeğinizi asanızla birlikte bir üretim ızgarasına koyun. Çekirdekler arasında geçiş yapmak için %s tuşunu basılı tutun ve asanızla boş alana sol tıklayın veya seçenek ekranını kullanın", + "constructionwand.description.core_angel": "Melek çekirdeği, karşı karşıya olduğunuz bloğun (veya blok sırasının) karşı tarafına bir blok yerleştirir. Maksimum mesafe asa seviyesine bağlıdır. Havada bir blok yerleştirmek için boş alana sağ tıklayın. Bunu yapmak için, yerleştirmek istediğiniz bloğu boştaki elinize almalısınız.", + "constructionwand.description.core_destruction": "Yıkım çekirdeği, size bakan taraftaki blokları (tile entities haricinde) yok eder. Maksimum blok sayısı asa seviyesine bağlıdır. Yok edilen bloklar boşluğa kaybolur, hata yaptıysanız geri alma özelliğini kullanabilirsiniz.", + + "stat.constructionwand.use_wand": "Asa kullanılarak yerleştirilen bloklar" +} \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 2f824a3..665308b 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,8 +1,6 @@ { "pack": { "description": "ConstructionWand resources", - "pack_format": 13, - "forge:resource_pack_format": 13, - "forge:data_pack_format": 12 + "pack_format": 8 } }