From fc20293906845f5e5bc6dba898ef1fc374dd9f2f Mon Sep 17 00:00:00 2001 From: Mrbysco Date: Tue, 15 Mar 2022 03:15:54 +0100 Subject: [PATCH 01/29] Port to 1.18.2 Convert item registering to DeferredRegister as vanilla freezes the registry which instantiating them outside of the RegistryEvent or DeferredRegister will result in an error. --- build.gradle | 6 +- gradle.properties | 8 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 269 +++++++++++------- .../constructionwand/ConstructionWand.java | 3 + .../constructionwand/basics/ConfigServer.java | 13 +- .../thetadev/constructionwand/data/Inp.java | 6 +- .../data/ItemModelGenerator.java | 4 +- .../data/RecipeGenerator.java | 12 +- .../jei/ConstructionWandJeiPlugin.java | 9 +- .../constructionwand/items/ItemBase.java | 12 - .../constructionwand/items/ModItems.java | 48 ++-- .../constructionwand/items/core/ItemCore.java | 8 +- .../items/core/ItemCoreAngel.java | 4 +- .../items/core/ItemCoreDestruction.java | 4 +- .../constructionwand/items/wand/ItemWand.java | 8 +- .../items/wand/ItemWandBasic.java | 4 +- .../items/wand/ItemWandInfinity.java | 4 +- .../constructionwand/wand/WandJob.java | 2 +- src/main/resources/META-INF/mods.toml | 6 +- src/main/resources/pack.mcmeta | 2 +- 21 files changed, 236 insertions(+), 198 deletions(-) delete mode 100644 src/main/java/thetadev/constructionwand/items/ItemBase.java diff --git a/build.gradle b/build.gradle index 5b50303..8efc256 100644 --- a/build.gradle +++ b/build.gradle @@ -145,4 +145,8 @@ publishing { url "file:///${project.projectDir}/mcmodsrepo" } } -} \ No newline at end of file +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} diff --git a/gradle.properties b/gradle.properties index 40a8f6b..dc81197 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.18.1 -forgeversion=39.0.0 +mcversion=1.18.2 +forgeversion=40.0.15 mcp_channel=official -mcp_mappings=1.18.1 +mcp_mappings=1.18.2 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ # botania=1.16.2-405 # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=jei-1.18.1:9.1.0.41 +jei_version=jei-1.18.2:9.5.0.132 version_major=2 version_minor=6 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102..41dfb87 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.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 744e882..c53aefa 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions $var, ${var}, ${var:-default}, ${var+SET}, +# ${var#prefix}, ${var%suffix}, and $( cmd ); +# * compound commands having a testable exit status, especially case; +# * various built-in commands including command, set, and ulimit. +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - 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 @@ -87,9 +121,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 @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/src/main/java/thetadev/constructionwand/ConstructionWand.java b/src/main/java/thetadev/constructionwand/ConstructionWand.java index e8e71af..c5b9f76 100644 --- a/src/main/java/thetadev/constructionwand/ConstructionWand.java +++ b/src/main/java/thetadev/constructionwand/ConstructionWand.java @@ -53,6 +53,9 @@ public class ConstructionWand FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientSetup); MinecraftForge.EVENT_BUS.register(this); + // Register Item DeferredRegister + ModItems.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); + // Config setup ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ConfigServer.SPEC); ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ConfigClient.SPEC); diff --git a/src/main/java/thetadev/constructionwand/basics/ConfigServer.java b/src/main/java/thetadev/constructionwand/basics/ConfigServer.java index 3e10b10..6fc0de9 100644 --- a/src/main/java/thetadev/constructionwand/basics/ConfigServer.java +++ b/src/main/java/thetadev/constructionwand/basics/ConfigServer.java @@ -1,8 +1,10 @@ package thetadev.constructionwand.basics; +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.RegistryObject; import thetadev.constructionwand.items.ModItems; import java.util.Arrays; @@ -27,10 +29,10 @@ public class ConfigServer public static final ForgeConfigSpec.ConfigValue> TE_LIST; private static final String[] TE_LIST_DEFAULT = {"chiselsandbits"}; - private static final HashMap wandProperties = new HashMap<>(); + private static final HashMap wandProperties = new HashMap<>(); public static WandProperties getWandProperties(Item wand) { - return wandProperties.getOrDefault(wand, WandProperties.DEFAULT); + return wandProperties.getOrDefault(wand.getRegistryName(), WandProperties.DEFAULT); } public static class WandProperties @@ -53,9 +55,10 @@ public class ConfigServer this.upgradeable = upgradeable; } - public WandProperties(ForgeConfigSpec.Builder builder, Item wand, int defDurability, int defLimit, + public WandProperties(ForgeConfigSpec.Builder builder, RegistryObject wandSupplier, int defDurability, int defLimit, int defAngel, int defDestruction, boolean defUpgradeable) { - builder.push(wand.getRegistryName().getPath()); + ResourceLocation registryName = wandSupplier.getId(); + builder.push(registryName.getPath()); if(defDurability > 0) { builder.comment("Wand durability"); @@ -72,7 +75,7 @@ public class ConfigServer upgradeable = builder.define("upgradeable", defUpgradeable); builder.pop(); - wandProperties.put(wand, this); + wandProperties.put(registryName, this); } public int getDurability() { diff --git a/src/main/java/thetadev/constructionwand/data/Inp.java b/src/main/java/thetadev/constructionwand/data/Inp.java index d85270a..69225da 100644 --- a/src/main/java/thetadev/constructionwand/data/Inp.java +++ b/src/main/java/thetadev/constructionwand/data/Inp.java @@ -1,7 +1,7 @@ package thetadev.constructionwand.data; import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; @@ -22,7 +22,7 @@ public class Inp return new Inp(in.asItem().getRegistryName().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()); + public static Inp fromTag(TagKey in) { + return new Inp(in.location().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 b224ac8..c007b70 100644 --- a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java @@ -5,6 +5,7 @@ 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.RegistryObject; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.items.ModItems; @@ -18,7 +19,8 @@ public class ItemModelGenerator extends ItemModelProvider @Override protected void registerModels() { - for(Item item : ModItems.ALL_ITEMS) { + for(RegistryObject itemObject : ModItems.ITEMS.getEntries()) { + Item item = itemObject.get(); String name = item.getRegistryName().getPath(); if(item instanceof ICustomItemModel) diff --git a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java index 4407958..aaff00c 100644 --- a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java @@ -27,13 +27,13 @@ public class RecipeGenerator extends RecipeProvider @Override protected void buildCraftingRecipes(@Nonnull Consumer consumer) { - wandRecipe(consumer, ModItems.WAND_STONE, Inp.fromTag(ItemTags.STONE_TOOL_MATERIALS)); - wandRecipe(consumer, ModItems.WAND_IRON, Inp.fromTag(Tags.Items.INGOTS_IRON)); - wandRecipe(consumer, ModItems.WAND_DIAMOND, Inp.fromTag(Tags.Items.GEMS_DIAMOND)); - wandRecipe(consumer, ModItems.WAND_INFINITY, Inp.fromTag(Tags.Items.NETHER_STARS)); + 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)); + wandRecipe(consumer, ModItems.WAND_INFINITY.get(), Inp.fromTag(Tags.Items.NETHER_STARS)); - coreRecipe(consumer, ModItems.CORE_ANGEL, Inp.fromTag(Tags.Items.FEATHERS), Inp.fromTag(Tags.Items.INGOTS_GOLD)); - coreRecipe(consumer, ModItems.CORE_DESTRUCTION, Inp.fromTag(Tags.Items.STORAGE_BLOCKS_DIAMOND), Inp.fromItem(Items.DIAMOND_PICKAXE)); + coreRecipe(consumer, ModItems.CORE_ANGEL.get(), Inp.fromTag(Tags.Items.FEATHERS), Inp.fromTag(Tags.Items.INGOTS_GOLD)); + coreRecipe(consumer, ModItems.CORE_DESTRUCTION.get(), Inp.fromTag(Tags.Items.STORAGE_BLOCKS_DIAMOND), Inp.fromItem(Items.DIAMOND_PICKAXE)); specialRecipe(consumer, RecipeWandUpgrade.SERIALIZER); } diff --git a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java index 682d758..ed0ca4d 100644 --- a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java +++ b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java @@ -11,6 +11,7 @@ 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.RegistryObject; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.ConfigClient; import thetadev.constructionwand.basics.ConfigServer; @@ -43,10 +44,11 @@ public class ConstructionWandJeiPlugin implements IModPlugin Component wandModeComponent = keyComboComponent(ConfigClient.SHIFTOPT_MODE.get(), optkeyComponent); Component wandGuiComponent = keyComboComponent(ConfigClient.SHIFTOPT_GUI.get(), optkeyComponent); - for(Item wand : ModItems.WANDS) { + for(RegistryObject wandSupplier : ModItems.WANDS) { + Item wand = wandSupplier.get(); ConfigServer.WandProperties wandProperties = ConfigServer.getWandProperties(wand); - String durabilityKey = wand == ModItems.WAND_INFINITY ? "unlimited" : "limited"; + String durabilityKey = wand == ModItems.WAND_INFINITY.get() ? "unlimited" : "limited"; Component durabilityComponent = new TranslatableComponent(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM, @@ -57,7 +59,8 @@ public class ConstructionWandJeiPlugin implements IModPlugin ); } - for(Item core : ModItems.CORES) { + for(RegistryObject coreSupplier : ModItems.CORES) { + Item core = coreSupplier.get(); 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/ItemBase.java b/src/main/java/thetadev/constructionwand/items/ItemBase.java deleted file mode 100644 index f47d0dc..0000000 --- a/src/main/java/thetadev/constructionwand/items/ItemBase.java +++ /dev/null @@ -1,12 +0,0 @@ -package thetadev.constructionwand.items; - -import net.minecraft.world.item.Item; -import thetadev.constructionwand.ConstructionWand; - -public class ItemBase extends Item -{ - public ItemBase(String name, Properties properties) { - super(properties); - setRegistryName(ConstructionWand.MODID, name); - } -} diff --git a/src/main/java/thetadev/constructionwand/items/ModItems.java b/src/main/java/thetadev/constructionwand/items/ModItems.java index 14c3255..5472748 100644 --- a/src/main/java/thetadev/constructionwand/items/ModItems.java +++ b/src/main/java/thetadev/constructionwand/items/ModItems.java @@ -12,8 +12,11 @@ import net.minecraftforge.api.distmarker.OnlyIn; 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.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; +import net.minecraftforge.registries.RegistryObject; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.WandOptions; import thetadev.constructionwand.crafting.RecipeWandUpgrade; @@ -23,38 +26,24 @@ import thetadev.constructionwand.items.wand.ItemWand; import thetadev.constructionwand.items.wand.ItemWandBasic; import thetadev.constructionwand.items.wand.ItemWandInfinity; -import java.util.Arrays; -import java.util.HashSet; - @Mod.EventBusSubscriber(modid = ConstructionWand.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ModItems { + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ConstructionWand.MODID); + // Wands - public static final Item WAND_STONE = new ItemWandBasic("stone_wand", propWand(), Tiers.STONE); - public static final Item WAND_IRON = new ItemWandBasic("iron_wand", propWand(), Tiers.IRON); - public static final Item WAND_DIAMOND = new ItemWandBasic("diamond_wand", propWand(), Tiers.DIAMOND); - public static final Item WAND_INFINITY = new ItemWandInfinity("infinity_wand", propWand()); + public static final RegistryObject WAND_STONE = ITEMS.register("stone_wand", () -> new ItemWandBasic(propWand(), Tiers.STONE)); + public static final RegistryObject WAND_IRON = ITEMS.register("iron_wand", () -> new ItemWandBasic(propWand(), Tiers.IRON)); + public static final RegistryObject WAND_DIAMOND = ITEMS.register("diamond_wand", () -> new ItemWandBasic(propWand(), Tiers.DIAMOND)); + public static final RegistryObject WAND_INFINITY = ITEMS.register("infinity_wand", () -> new ItemWandInfinity(propWand())); // Cores - public static final Item CORE_ANGEL = new ItemCoreAngel("core_angel", propUpgrade()); - public static final Item CORE_DESTRUCTION = new ItemCoreDestruction("core_destruction", propUpgrade()); + public static final RegistryObject CORE_ANGEL = ITEMS.register("core_angel", () -> new ItemCoreAngel(propUpgrade())); + public static final RegistryObject CORE_DESTRUCTION = ITEMS.register("core_destruction", () -> new ItemCoreDestruction(propUpgrade())); // Collections - public static final Item[] WANDS = {WAND_STONE, WAND_IRON, WAND_DIAMOND, WAND_INFINITY}; - public static final Item[] CORES = {CORE_ANGEL, CORE_DESTRUCTION}; - public static final HashSet ALL_ITEMS = new HashSet<>(); - - - @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) { - IForgeRegistry r = event.getRegistry(); - - r.registerAll(WANDS); - ALL_ITEMS.addAll(Arrays.asList(WANDS)); - - registerItem(r, CORE_ANGEL); - registerItem(r, CORE_DESTRUCTION); - } + public static final RegistryObject[] WANDS = new RegistryObject[] {WAND_STONE, WAND_IRON, WAND_DIAMOND, WAND_INFINITY}; + public static final RegistryObject[] CORES = new RegistryObject[] {CORE_ANGEL, CORE_DESTRUCTION}; public static Item.Properties propWand() { return new Item.Properties().tab(CreativeModeTab.TAB_TOOLS); @@ -64,11 +53,6 @@ public class ModItems return new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(1); } - private static void registerItem(IForgeRegistry reg, Item item) { - reg.register(item); - ALL_ITEMS.add(item); - } - @SubscribeEvent public static void registerRecipeSerializers(RegistryEvent.Register> event) { IForgeRegistry> r = event.getRegistry(); @@ -77,7 +61,8 @@ public class ModItems @OnlyIn(Dist.CLIENT) public static void registerModelProperties() { - for(Item item : WANDS) { + for(RegistryObject itemSupplier : WANDS) { + Item item = itemSupplier.get(); ItemProperties.register( item, ConstructionWand.loc("using_core"), (stack, world, entity, n) -> entity == null || !(stack.getItem() instanceof ItemWand) ? 0 : @@ -90,7 +75,8 @@ public class ModItems public static void registerItemColors() { ItemColors colors = Minecraft.getInstance().getItemColors(); - for(Item item : WANDS) { + for(RegistryObject itemSupplier : WANDS) { + Item item = itemSupplier.get(); colors.register((stack, layer) -> (layer == 1 && stack.getItem() instanceof ItemWand) ? new WandOptions(stack).cores.get().getColor() : -1, item); } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java index fb3b93b..6b3362c 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java @@ -3,6 +3,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; import net.minecraft.world.level.Level; @@ -10,15 +11,14 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.api.IWandCore; -import thetadev.constructionwand.items.ItemBase; import javax.annotation.Nonnull; import java.util.List; -public abstract class ItemCore extends ItemBase implements IWandCore +public abstract class ItemCore extends Item implements IWandCore { - public ItemCore(String name, Properties properties) { - super(name, properties); + public ItemCore(Properties properties) { + super(properties); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java b/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java index fc7a05a..5062761 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java @@ -5,8 +5,8 @@ import thetadev.constructionwand.wand.action.ActionAngel; public class ItemCoreAngel extends ItemCore { - public ItemCoreAngel(String name, Properties properties) { - super(name, properties); + public ItemCoreAngel(Properties properties) { + super(properties); } @Override diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java index e243f06..bb2b5d3 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java @@ -5,8 +5,8 @@ import thetadev.constructionwand.wand.action.ActionDestruction; public class ItemCoreDestruction extends ItemCore { - public ItemCoreDestruction(String name, Properties properties) { - super(name, properties); + public ItemCoreDestruction(Properties properties) { + super(properties); } @Override diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java index 5e19cc7..4fa3529 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java @@ -9,6 +9,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; @@ -25,17 +26,16 @@ import thetadev.constructionwand.basics.option.IOption; import thetadev.constructionwand.basics.option.WandOptions; import thetadev.constructionwand.data.ICustomItemModel; import thetadev.constructionwand.data.ItemModelGenerator; -import thetadev.constructionwand.items.ItemBase; import thetadev.constructionwand.wand.WandJob; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; -public abstract class ItemWand extends ItemBase implements ICustomItemModel +public abstract class ItemWand extends Item implements ICustomItemModel { - public ItemWand(String name, Properties properties) { - super(name, properties); + public ItemWand(Properties properties) { + super(properties); } @Nonnull diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWandBasic.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWandBasic.java index 518954b..3db9d28 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWandBasic.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWandBasic.java @@ -10,8 +10,8 @@ public class ItemWandBasic extends ItemWand { private final Tier tier; - public ItemWandBasic(String name, Properties properties, Tier tier) { - super(name, properties.durability(tier.getUses())); + public ItemWandBasic(Properties properties, Tier tier) { + super(properties.durability(tier.getUses())); this.tier = tier; } diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWandInfinity.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWandInfinity.java index 8907001..16bcc8a 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWandInfinity.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWandInfinity.java @@ -3,7 +3,7 @@ package thetadev.constructionwand.items.wand; public class ItemWandInfinity extends ItemWand { - public ItemWandInfinity(String name, Properties properties) { - super(name, properties.stacksTo(1).fireResistant()); + public ItemWandInfinity(Properties properties) { + super(properties.stacksTo(1).fireResistant()); } } diff --git a/src/main/java/thetadev/constructionwand/wand/WandJob.java b/src/main/java/thetadev/constructionwand/wand/WandJob.java index 313b6c8..b35f6f6 100644 --- a/src/main/java/thetadev/constructionwand/wand/WandJob.java +++ b/src/main/java/thetadev/constructionwand/wand/WandJob.java @@ -74,7 +74,7 @@ public class WandJob public void getSnapshots() { int limit; // Infinity wand gets enhanced limit in creative mode - if(player.isCreative() && wandItem == ModItems.WAND_INFINITY) limit = ConfigServer.LIMIT_CREATIVE.get(); + if(player.isCreative() && wandItem == ModItems.WAND_INFINITY.get()) limit = ConfigServer.LIMIT_CREATIVE.get(); else limit = Math.min(wandItem.remainingDurability(wand), wandAction.getLimit(wand)); if(rayTraceResult.getType() == HitResult.Type.BLOCK) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 880dce7..03554c7 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[38,)" +loaderVersion = "[40,)" 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 = "[38,)" +versionRange = "[40,)" ordering = "NONE" side="BOTH" [[dependencies.constructionwand]] modId="minecraft" mandatory = true -versionRange = "[1.18, 1.19)" +versionRange = "[1.18.2, 1.19)" ordering = "NONE" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 665308b..59ca9fc 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "ConstructionWand resources", - "pack_format": 8 + "pack_format": 9 } } From 5f0cc62dbc2c17c6c70f8fed4ca84c517a485119 Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Sat, 26 Mar 2022 00:17:52 +0100 Subject: [PATCH 02/29] remove superfluous inventory checks --- src/main/java/thetadev/constructionwand/basics/WandUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/thetadev/constructionwand/basics/WandUtil.java b/src/main/java/thetadev/constructionwand/basics/WandUtil.java index 418ec5c..aa98cbe 100644 --- a/src/main/java/thetadev/constructionwand/basics/WandUtil.java +++ b/src/main/java/thetadev/constructionwand/basics/WandUtil.java @@ -160,7 +160,7 @@ public class WandUtil List inventory = WandUtil.getFullInv(player); for(ItemStack stack : inventory) { - if(stack == null) continue; + if(stack == null || stack.isEmpty()) continue; if(WandUtil.stackEquals(stack, item)) { total += stack.getCount(); From 83d880cb2e57e28c2bde16d9ed8db40df643a491 Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Sat, 26 Mar 2022 00:18:18 +0100 Subject: [PATCH 03/29] update Botania integration for MC1.18.2 --- build.gradle | 2 -- gradle.properties | 4 +-- .../containers/ContainerRegistrar.java | 6 ++--- .../containers/handlers/HandlerBotania.java | 27 +++++++++++-------- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 8efc256..c950cbd 100644 --- a/build.gradle +++ b/build.gradle @@ -104,14 +104,12 @@ dependencies { compileOnly fg.deobf("mezz.jei:${jei_version}:api") runtimeOnly fg.deobf("mezz.jei:${jei_version}") - /* compileOnly fg.deobf([ group: "vazkii.botania", name: "Botania", version: "${project.botania}", classifier: "api" ]) - */ } jar { diff --git a/gradle.properties b/gradle.properties index dc81197..e3ca157 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,9 +10,9 @@ mcp_channel=official mcp_mappings=1.18.2 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ -# botania=1.16.2-405 +botania=1.18.2-430-SNAPSHOT # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ jei_version=jei-1.18.2:9.5.0.132 version_major=2 -version_minor=6 \ No newline at end of file +version_minor=7 \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/containers/ContainerRegistrar.java b/src/main/java/thetadev/constructionwand/containers/ContainerRegistrar.java index 4c3b8e6..e9e87f6 100644 --- a/src/main/java/thetadev/constructionwand/containers/ContainerRegistrar.java +++ b/src/main/java/thetadev/constructionwand/containers/ContainerRegistrar.java @@ -1,6 +1,8 @@ package thetadev.constructionwand.containers; +import net.minecraftforge.fml.ModList; import thetadev.constructionwand.ConstructionWand; +import thetadev.constructionwand.containers.handlers.HandlerBotania; import thetadev.constructionwand.containers.handlers.HandlerBundle; import thetadev.constructionwand.containers.handlers.HandlerCapability; import thetadev.constructionwand.containers.handlers.HandlerShulkerbox; @@ -12,13 +14,9 @@ public class ContainerRegistrar ConstructionWand.instance.containerManager.register(new HandlerShulkerbox()); ConstructionWand.instance.containerManager.register(new HandlerBundle()); - /* - TODO: Reenable this when Botania gets ported to 1.17 - if(ModList.get().isLoaded("botania")) { ConstructionWand.instance.containerManager.register(new HandlerBotania()); ConstructionWand.LOGGER.info("Botania integration added"); } - */ } } diff --git a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java index 2d41e4b..8ffb651 100644 --- a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java +++ b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java @@ -1,25 +1,28 @@ -/* -TODO: Reenable this when Botania gets ported to 1.17 - package thetadev.constructionwand.containers.handlers; -import net.minecraft.world.level.block.Block; import net.minecraft.world.entity.player.Player; 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.IBlockProvider; +import java.util.Optional; + public class HandlerBotania implements IContainerHandler { @Override public boolean matches(Player player, ItemStack itemStack, ItemStack inventoryStack) { - return inventoryStack != null && inventoryStack.getCount() == 1 && inventoryStack.getItem() instanceof IBlockProvider; + return inventoryStack != null && inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).isPresent(); } @Override public int countItems(Player player, ItemStack itemStack, ItemStack inventoryStack) { - IBlockProvider prov = (IBlockProvider) inventoryStack.getItem(); - int provCount = prov.getBlockCount(player, itemStack, inventoryStack, Block.byItem(itemStack.getItem())); + Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); + if(provOptional.isEmpty()) return 0; + + IBlockProvider prov = provOptional.get(); + int provCount = prov.getBlockCount(player, inventoryStack, Block.byItem(itemStack.getItem())); if(provCount == -1) return Integer.MAX_VALUE; return provCount; @@ -27,10 +30,12 @@ public class HandlerBotania implements IContainerHandler @Override public int useItems(Player player, ItemStack itemStack, ItemStack inventoryStack, int count) { - IBlockProvider prov = (IBlockProvider) inventoryStack.getItem(); - if(prov.provideBlock(player, itemStack, inventoryStack, Block.byItem(itemStack.getItem()), true)) + Optional provOptional = inventoryStack.getCapability(BotaniaForgeCapabilities.BLOCK_PROVIDER).resolve(); + if(provOptional.isEmpty()) return 0; + + IBlockProvider prov = provOptional.get(); + if(prov.provideBlock(player, inventoryStack, Block.byItem(itemStack.getItem()), true)) return 0; return count; } -} -*/ \ No newline at end of file +} \ No newline at end of file From 058cabe3273c55e3710785656276031db6332712 Mon Sep 17 00:00:00 2001 From: gjeodnd12165 <61226524+gjeodnd12165@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:17:01 +0900 Subject: [PATCH 04/29] Create ko_kr.json --- .../assets/constructionwand/lang/ko_kr.json | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/resources/assets/constructionwand/lang/ko_kr.json diff --git a/src/main/resources/assets/constructionwand/lang/ko_kr.json b/src/main/resources/assets/constructionwand/lang/ko_kr.json new file mode 100644 index 0000000..47df0b2 --- /dev/null +++ b/src/main/resources/assets/constructionwand/lang/ko_kr.json @@ -0,0 +1,70 @@ +{ + "item.constructionwand.stone_wand": "돌 완드", + "item.constructionwand.iron_wand": "철 완드", + "item.constructionwand.diamond_wand": "다이아몬드 완드", + "item.constructionwand.infinity_wand": "무한의 완드", + "item.constructionwand.core_angel": "천사 완드 코어", + "item.constructionwand.core_destruction": "파괴 완드 코어", + + "constructionwand.tooltip.blocks": "최대. %d 블록", + "constructionwand.tooltip.shift": "[SHIFT]를 누르세요.", + "constructionwand.tooltip.cores": "완드 코어:", + "constructionwand.tooltip.core_tip": "조합창에서 코어와 완드를 합치세요.", + + "constructionwand.option.cores": "", + "constructionwand.option.cores.constructionwand:default": "생성 코어", + "constructionwand.option.cores.constructionwand:default.desc": "당신 쪽으로 건물을 확장합니다.", + "constructionwand.option.cores.constructionwand:core_angel": "§6천사 코어", + "constructionwand.option.cores.constructionwand:core_angel.desc": "블록 뒤와 공중에 배치합니다.", + "constructionwand.option.cores.constructionwand:core_destruction": "§c파괴 코어", + "constructionwand.option.cores.constructionwand:core_destruction.desc": "당신 쪽의 블록을 파괴합니다.", + + "constructionwand.option.lock": "제한: ", + "constructionwand.option.lock.horizontal": "§a오른쪽/왼쪽", + "constructionwand.option.lock.horizontal.desc": "원래 블록의 앞에 수평한 열을 만듭니다.", + "constructionwand.option.lock.vertical": "§a위/아래", + "constructionwand.option.lock.vertical.desc": "원래 블록의 앞에 수직한 열을 만듭니다.", + "constructionwand.option.lock.northsouth": "§6북쪽/남쪽", + "constructionwand.option.lock.northsouth.desc": "원래 블록의 위에 북/남 방향으로 행을 만듭니다.", + "constructionwand.option.lock.eastwest": "§6동쪽/서쪽", + "constructionwand.option.lock.eastwest.desc": "원래 블록의 위에 동/서 방향으로 행을 만듭니다.", + "constructionwand.option.lock.nolock": "§c없음", + "constructionwand.option.lock.nolock.desc": "원래 블록의 어느 방향으로도 확장합니다.", + + "constructionwand.option.direction": "방향: ", + "constructionwand.option.direction.target": "§6대상", + "constructionwand.option.direction.target.desc": "대상 블록과 같은 방향으로 블록을 배치합니다.", + "constructionwand.option.direction.player": "§a플레이어", + "constructionwand.option.direction.player.desc": "플레이어를 향해 블록을 배치합니다.", + + "constructionwand.option.replace": "재배치: ", + "constructionwand.option.replace.yes": "§a예", + "constructionwand.option.replace.yes.desc": "유체, 눈, 키 큰 잔디와 같은 특정 블록을 교체합니다.", + "constructionwand.option.replace.no": "§c아니오", + "constructionwand.option.replace.no.desc": "블록을 재배치하지 않습니다.", + + "constructionwand.option.match": "비교: ", + "constructionwand.option.match.exact": "§a정확", + "constructionwand.option.match.exact.desc": "완전히 같은 블록만 확장합니다.", + "constructionwand.option.match.similar": "§6유사", + "constructionwand.option.match.similar.desc": "비슷한 블록(흙/잔디)을 똑같이 취급합니다.", + "constructionwand.option.match.any": "§c아무거나", + "constructionwand.option.match.any.desc": "아무 블록이나 확장합니다.", + + "constructionwand.option.random": "무작위: ", + "constructionwand.option.random.yes": "§a예", + "constructionwand.option.random.yes.desc": "핫바에 있는 블록 중 무작위적으로 배치합니다.", + "constructionwand.option.random.no": "§c아니오", + "constructionwand.option.random.no.desc": "배치할 블록을 무작위적으로 하지 않습니다.", + + "constructionwand.description.wand": "%1$s는 당신 쪽으로 최대 %2$d 블록까지 배치할 수 있고, %3$s 지속됩니다.\n\n%5$s을(를) 누르고 스크롤 하여 배치 제한을 바꾸세요 (수평, 수직, 북쪽/남쪽, 동쪽/서쪽, 제한 없음).\n\n%6$s§9+우클릭§0으로 옵션 스크린을 여세요.\n\n§5§n실행 취소§0§r\n블록을 보면서 §9웅크리기+§0%4$s를 누르고 있으면 마지막으로 배치했던 블록들이 녹색 테두리로 표시됩니다. 그 중 아무거나 §9S웅크리기+§0%4$s§9+우클릭§0 하면 그 작업을 실행 취소하고, 모든 아이템을 돌려줍니다. 파괴 코어를 사용했다면, 블록들을 복원합니다.\n\n§5§n컨테이너§0§r\n셜커 상자, 꾸러미, 그리고 다른 모드의 컨테이너들은 완드에 건설 블록을 제공할 수 있습니다.\n\n§5§n보조손 우선도§0§r\n보조 손에 블록을 가지고 있으면 보고 있는 블록을 배치하는 대신에 보조 손의 블록을 배치할 것입니다.", + "constructionwand.description.durability.limited": "%d 블록 만큼", + "constructionwand.description.durability.unlimited": "영원히", + "constructionwand.description.key.sneak": "웅크리기", + "constructionwand.description.key.sneak_opt": "웅크리기+%s", + "constructionwand.description.core": "§5§n설치§0§r\n새 코어를 완드와 함께 조합창에 넣어 설치하세요. 코어 간에 전환하려면 %s 키를 누른 상태에서 완드로 빈 공간을 좌클릭하거나 옵션 화면을 사용하십시오.", + "constructionwand.description.core_angel": "엔젤 코어는 마주보고 있는 블록(또는 블록 행)의 반대쪽에 블록을 배치합니다. 최대 거리는 완드의 티어에 따라 다릅니다. 빈 공간을 우클릭하면 공중에 블록을 배치할 수 있습니다. 그렇게 하려면 보조 손에 배치하려는 블록이 있어야 합니다.", + "constructionwand.description.core_destruction": "파괴 코어는 당신 쪽의 (타일 엔티티가 없는)블록을 파괴합니다. 최대 블록 수는 완드의 티어에 따라 다릅니다. 파괴된 블록은 공허로 사라지며 실수를 했다면 실행 취소 기능을 사용할 수 있습니다.", + + "stat.constructionwand.use_wand": "완드로 배치한 블록 수" + } From 3a1316ce0f2e357573cf2ded0cfef1e3d8f43aef Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 13:43:38 +0200 Subject: [PATCH 05/29] ported to Minecraft 1.19 --- .gitignore | 2 +- build.gradle | 31 +++++++++- gradle.properties | 8 +-- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 10 +-- settings.gradle | 6 ++ .../constructionwand/ConstructionWand.java | 1 - .../constructionwand/basics/CommonEvents.java | 2 +- .../constructionwand/basics/ConfigServer.java | 57 +++++++++--------- .../constructionwand/basics/WandUtil.java | 5 +- .../basics/pool/RandomPool.java | 7 ++- .../constructionwand/client/ClientEvents.java | 8 +-- .../client/RenderBlockPreview.java | 6 +- .../constructionwand/client/ScreenWand.java | 23 ++++--- .../thetadev/constructionwand/data/Inp.java | 3 +- .../data/ItemModelGenerator.java | 3 +- .../constructionwand/data/ModData.java | 6 +- .../jei/ConstructionWandJeiPlugin.java | 33 ++++++---- .../constructionwand/items/ModItems.java | 27 +++------ .../constructionwand/items/core/ItemCore.java | 17 ++++-- .../items/core/ItemCoreAngel.java | 7 +++ .../items/core/ItemCoreDestruction.java | 7 +++ .../constructionwand/items/wand/ItemWand.java | 31 +++++----- src/main/resources/META-INF/mods.toml | 6 +- src/main/resources/pack.mcmeta | 4 +- 26 files changed, 190 insertions(+), 122 deletions(-) create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index faba627..8f98ab8 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ build # other eclipse -run +/run* # Files from Forge MDK forge*changelog.txt diff --git a/build.gradle b/build.gradle index c950cbd..018b104 100644 --- a/build.gradle +++ b/build.gradle @@ -16,8 +16,10 @@ 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 @@ -31,6 +33,9 @@ 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 @@ -47,6 +52,8 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + // property 'forge.enabledGameTestNamespaces', modid + mods { constructionwand { source sourceSets.main @@ -54,6 +61,25 @@ 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 @@ -101,8 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly fg.deobf("mezz.jei:${jei_version}:api") - runtimeOnly fg.deobf("mezz.jei:${jei_version}") + compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" + // runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index e3ca157..ee1507b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.18.2 -forgeversion=40.0.15 +mcversion=1.19 +forgeversion=41.1.0 mcp_channel=official -mcp_mappings=1.18.2 +mcp_mappings=1.19 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.18.2-430-SNAPSHOT # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=jei-1.18.2:9.5.0.132 +jei_version=11.1.1.239 version_major=2 version_minor=7 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 8958 zcmY+KWl$VIlZIh&f(Hri?gR<$?iyT!TL`X;1^2~W7YVSq1qtqM!JWlDxLm%}UESUM zndj}Uny%^UnjhVhFb!8V3s(a#fIy>`VW15{5nuy;_V&a5O#0S&!a4dSkUMz_VHu3S zGA@p9Q$T|Sj}tYGWdjH;Mpp8m&yu&YURcrt{K;R|kM~(*{v%QwrBJIUF+K1kX5ZmF zty3i{d`y0;DgE+de>vN@yYqFPe1Ud{!&G*Q?iUc^V=|H%4~2|N zW+DM)W!`b&V2mQ0Y4u_)uB=P@-2`v|Wm{>CxER1P^ z>c}ZPZ)xxdOCDu59{X^~2id7+6l6x)U}C4Em?H~F`uOxS1?}xMxTV|5@}PlN%Cg$( zwY6c}r60=z5ZA1L zTMe;84rLtYvcm?M(H~ZqU;6F7Evo{P7!LGcdwO|qf1w+)MsnvK5^c@Uzj<{ zUoej1>95tuSvDJ|5K6k%&UF*uE6kBn47QJw^yE&#G;u^Z9oYWrK(+oL97hBsUMc_^ z;-lmxebwlB`Er_kXp2$`&o+rPJAN<`WX3ws2K{q@qUp}XTfV{t%KrsZ5vM!Q#4{V& zq>iO$MCiLq#%wXj%`W$_%FRg_WR*quv65TdHhdpV&jlq<=K^K`&!Kl5mA6p4n~p3u zWE{20^hYpn1M}}VmSHBXl1*-)2MP=0_k)EPr#>EoZukiXFDz?Di1I>2@Z^P$pvaF+ zN+qUy63jek2m59;YG)`r^F3-O)0RDIXPhf)XOOdkmu`3SMMSW(g+`Ajt{=h1dt~ks ztrhhP|L4G%5x79N#kwAHh5N){@{fzE7n&%dnisCm65Za<8r_hKvfx4Bg*`%-*-Mvn zFvn~)VP@}1sAyD+B{{8l{EjD10Av&Mz9^Xff*t`lU=q=S#(|>ls520;n3<}X#pyh& z*{CJf7$*&~!9jMnw_D~ikUKJ2+UnXmN6qak{xx%W;BKuXt7@ky!LPI1qk?gDwG@@o zkY+BkIie>{{q==5)kXw(*t#I?__Kwi>`=+s?Gq6X+vtSsaAO&Tf+Bl$vKnzc&%BHM z=loWOQq~n}>l=EL(5&6((ESsQC3^@4jlO5Od{qN#sWV)vqXw}aA>*uvwZopNN(|-T zRTF%5Y_k1R$;(d-)n;hWex{;7b6KgdAVE@&0pd(*qDzBO#YZV%kh%pYt1`hnQ(Fa& zYiDrOTDqk5M7hzp9kI2h!PxNnuJ&xl*zF8sx6!67bA49R1bmUF5bpK&&{eI0U~cH}PM z3aW1$lRb|ItkG5~_eBNu$|I|vYIdAA9a!pVq<+UTx*M}fG`23zxXp&E=FfnY- zEzKj;Cu_s4v>leO7M2-mE(UzKHL4c$c`3dS*19OpLV^4NI*hWWnJQ9lvzP4c;c?do zqrcsKT*i~eIHl0D3r4N{)+RsB6XhrC^;sp2cf_Eq#6*CV;t8v=V!ISe>>9kPgh}NI z=1UZutslxcT$Ad;_P^;Oouoa(cs!Ctpvi>%aQ+Zp=1d|h{W9Wmf7JWxa(~<#tSZ?C%wu4_5F!fc!<@PIBeJ)Nr^$bB6!_Gic_7}c3J{QI~Gg5g5jTp9}V6KYgrgaX>pJt}7$!wOht&KO|+z{Iw@YL|@~D zMww}+lG}rm2^peNx>58ME||ZQxFQeVSX8iogHLq_vXb`>RnoEKaTWBF-$JD#Q4BMv zt2(2Qb*x-?ur1Y(NsW8AdtX0#rDB?O(Vs4_xA(u-o!-tBG03OI!pQD+2UytbL5>lG z*(F)KacHqMa4?dxa(Vcrw>IIAeB$3cx#;;5r2X;HE8|}eYdAgCw#tpXNy7C3w1q`9 zGxZ6;@1G%8shz9e+!K2MO*{_RjO}Jo6eL3{TSZ>nY7)Qs`Dhi5><@oh0r)gT7H-?3 zLDsd^@m%JvrS8sta5`QiZNs^*GT}Hiy^zjK2^Ni%`Z|ma)D2 zuyumbvw$M8$haCTI~6M%d4+P)uX%u{Sfg4Al+F7c6;O-*)DKI7E8izSOKB#FcV{M+ zEvY0FBkq!$J0EW$Cxl}3{JwV^ki-T?q6C30Y5e&p@8Rd?$ST-Ghn*-`tB{k54W<>F z5I)TFpUC!E9298=sk>m#FI4sUDy_!8?51FqqW!9LN1(zuDnB3$!pEUjL>N>RNgAG~-9Xm|1lqHseW(%v&6K(DZ3Pano(1-Qe?3%J&>0`~w^Q-p&@ zg@HjvhJk?*hpF7$9P|gkzz`zBz_5Z!C4_-%fCcAgiSilzFQef!@amHDrW!YZS@?7C zs2Y9~>yqO+rkih?kXztzvnB^6W=f52*iyuZPv$c42$WK7>PHb z6%MYIr5D32KPdwL1hJf{_#jn?`k(taW?mwmZVvrr=y~fNcV$`}v(8};o9AjOJumS4 z`889O91^pkF+|@$d9wVoZ3;^j;^sUs&Ubo_qD&MTL%O z&*SE0ujG~zm;?x)8TLC&ft))nyI zcg44@*Q{cYT+qGrA=In_X{NNCD+B0w#;@g)jvBU;_8od6U>;7HIo@F*=g8CQUo(u^ z3r4FJ7#<@)MXO&5+DgKE&^>^`r!loe7CWE*1k0*0wLFzSOV8jvlX~WOQ?$1v zk$Or}!;ix0g78^6W;+<=J>z@CBs!<<)HvF(Ls-&`matpesJ5kkjC)6nGB@b{ii6-Uoho$BT%iJgugTOeZ$5Xo4D7Pd< zC*LJh5V@2#5%aBZCgzlQi3@<_!VfiL07ywc)ZbwKPfcR|ElQoS(8x|a7#IR}7#Io= zwg4$8S{egr-NffD)Fg&X9bJSoM25pF&%hf>(T&9bI}=#dPQyNYz;ZZ7EZ=u1n701SWKkZ9n(-qU ztN`sdWL1uxQ1mKS@x11;O|@^AD9!NeoPx}?EKIr!2>1Qq4gjfGU)tr6?Z5l7JAS3j zZeq{vG{rb%DFE4%$szK}d2UzB{4>L?Tv+NAlE*&Nq6g+XauaSI+N2Y8PJLw+aNg1p zbxr|hI8wcMP&&+(Cu|%+Jq|r>+BHk@{AvfBXKiVldN)@}TBS0LdIpnANCVE26WL-} zV}HJ^?m&$Rkq;Zf*i-hoasnpJVyTH__dbGWrB_R55d*>pTyl6(?$EO@>RCmTX1Hzr zT2)rOng?D4FfZ_C49hjMV*UonG2DlG$^+k=Y%|?Dqae4}JOU=8=fgY4Uh!pa9eEqf zFX&WLPu!jArN*^(>|H>dj~g`ONZhaaD%h_HHrHkk%d~TR_RrX{&eM#P@3x=S^%_6h zh=A)A{id16$zEFq@-D7La;kTuE!oopx^9{uA3y<}9 z^bQ@U<&pJV6kq7LRF47&!UAvgkBx=)KS_X!NY28^gQr27P=gKh0+E>$aCx&^vj2uc}ycsfSEP zedhTgUwPx%?;+dESs!g1z}5q9EC+fol}tAH9#fhZQ?q1GjyIaR@}lGCSpM-014T~l zEwriqt~ftwz=@2tn$xP&-rJt?nn5sy8sJ5Roy;pavj@O+tm}d_qmAlvhG(&k>(arz z;e|SiTr+0<&6(-An0*4{7akwUk~Yf4M!!YKj^swp9WOa%al`%R>V7mi z+5+UodFAaPdi4(8_FO&O!Ymb#@yxkuVMrog(7gkj$G@FLA#ENMxG)4f<}S%Fn?Up$+C%{02AgMKa^ z4SFGWp6U>{Q6VRJV}yjxXT*e`1XaX}(dW1F&RNhpTzvCtzuu;LMhMfJ2LBEy?{^GHG!OF!! zDvs64TG)?MX&9NCE#H3(M0K>O>`ca0WT2YR>PTe&tn?~0FV!MRtdb@v?MAUG&Ef7v zW%7>H(;Mm)RJkt18GXv!&np z?RUxOrCfs;m{fBz5MVlq59idhov21di5>WXWD-594L-X5;|@kyWi@N+(jLuh=o+5l zGGTi~)nflP_G}Yg5Pi%pl88U4+^*ihDoMP&zA*^xJE_X*Ah!jODrijCqQ^{=&hD7& z^)qv3;cu?olaT3pc{)Kcy9jA2E8I)#Kn8qO>70SQ5P8YSCN=_+_&)qg)OYBg|-k^d3*@jRAeB?;yd-O1A0wJ z?K*RDm|wE<(PBz~+C%2CTtzCTUohxP2*1kE8Of~{KRAvMrO_}NN&@P7SUO{;zx0iK z@or9R8ydYOFZf(cHASCAatL%;62IL27~SmASr(7F&NMr+#gNw@z1VM z_ALFwo3)SoANEwRerBdRV`>y`t72#aF2ConmWQp(Xy|msN9$yxhZ1jAQ67lq{vbC5 zujj|MlGo`6Bfn0TfKgi(k=gq0`K~W+X(@GzYlPI4g0M;owH3yG14rhK>lG8lS{`!K z+Nc@glT-DGz?Ym?v#Hq|_mEdPAlHH5jZuh*6glq!+>Lk$S%ED2@+ea6CE@&1-9a?s znglt|fmIK}fg<9@XgHe4*q!aO<-;Xj$T?IzB-{&2`#eA6rdtCi80mpP&vw(Uytxu$#YzNI_cB>LS zmim>ys;ir;*Dzbr22ZDxO2s;671&J0U<9(n1yj)J zHFNz=ufPcQVEG+ePjB<5C;=H0{>Mi*xD>hQq8`Vi7TjJ$V04$`h3EZGL|}a07oQdR z?{cR(z+d>arn^AUug&voOzzi$ZqaS)blz-z3zr;10x;oP2)|Cyb^WtN2*wNn`YX!Y z+$Pji<7|!XyMCEw4so}xXLU)p)BA~2fl>y2Tt}o9*BPm?AXA8UE8a;>rOgyCwZBFa zyl42y`bc3}+hiZL_|L_LY29vVerM+BVE@YxK>TGm@dHi@Uw*7AIq?QA9?THL603J% zIBJ4y3n8OFzsOI;NH%DZ!MDwMl<#$)d9eVVeqVl(5ZX$PPbt*p_(_9VSXhaUPa9Qu z7)q4vqYKX7ieVSjOmVEbLj4VYtnDpe*0Y&+>0dS^bJ<8s*eHq3tjRAw^+Mu4W^-E= z4;&namG4G;3pVDyPkUw#0kWEO1;HI6M51(1<0|*pa(I!sj}F^)avrE`ShVMKBz}nE zzKgOPMSEp6M>hJzyTHHcjV%W*;Tdb}1xJjCP#=iQuBk_Eho6yCRVp&e!}4IBJ&?ksVc&u#g3+G$oNlJ?mWfADjeBS-Ph3`DKk-~Z70XugH8sq2eba@4 zIC1H_J$`9b$K`J)sGX3d!&>OmC@@rx1TL~NinQOYy72Q_+^&Mg>Ku(fTgaXdr$p_V z#gav1o{k~c>#)u3r@~6v^o)Lf=C{rAlL@!s457pq)pO;Cojx7U{urO4cvXP|E>+dV zmr2?!-5)tk-&*ap^D^2x7NG6nOop2zNFQ9v8-EZ{WCz-h36C)<^|f{V#R_WE^@(T0+d-at5hXX{U?zak*ac-XnyINo+yBD~~3O1I=a z99|CI>502&s-Qi5bv>^2#cQ%ut<4d7KgQ^kE|=%6#VlGiY8$rdJUH{sra;P~cyb_i zeX(kS%w0C?mjhJl9TZp8RS;N~y3(EXEz13oPhOSE4WaTljGkVXWd~|#)vsG6_76I)Kb z8ro?;{j^lxNsaxE-cfP;g(e;mhh3)&ba}li?woV2#7ByioiD>s%L_D;?#;C#z;a(N z-_WY<=SH42m9bFQ>Nb z@4K$@4l8pD7AKxCR>t0%`Qoy9=hA?<<^Vcj8;-E+oBe3ReW1`el8np8E$k{LgFQ}2 z2t8a`wOXFdJ9!5$&mEfD1CnJ)TB+RJih88-Zos9@HZ# zL#{qfbF0ARTXkR@G{lwlOH~nnL)1jcyu!qv2`57S&%oKz0}r{~l9U_UHaJ5!8#nrs z?2FrL`mxnzu&{bweD&62)ilz*?pYIvt`T!XFVVA78})p1YEy7 z8fK#s?b~Yo$n7&_a?EBdXH-_W)Z44?!;DFx6pZ?~RArtBI*Qm4~6nX6Z_T*i$bQPE;Qz?DAPstpGSqr-AJ zo%m9cA`oDDm?&dTaoh_>@F>a?!y4qt_;NGN9Z<%SS;fX-cSu|>+Pba22`CRb#|HZa z;{)yHE>M-pc1C0mrnT~80!u&dvVTYFV8xTQ#g;6{c<9d!FDqU%TK5T6h*w*p980D~ zUyCb`y3{-?(mJFP)0*-Nt;mI$-gc4VQumh|rs&j_^R{sgTPF`1Xja2YWstsKFuQ(d zmZMxV$p$|qQUXchu&8%J(9|)B?`~rIx&)LqDS>ob5%gTeTP#Sbny#y*rnJ&?(l=!( zoV~}LJ1DPLnF8oyM(2ScrQ0{Q4m4-BWnS4wilgCW-~~;}pw=&<+HggRD_3c@3RQIr z9+-%!%}u_{`YS=&>h%kPO3ce}>y!d-zqiniNR-b5r97u;+K6HA2tS>Z#cV{+eFI`* zd8RMGAUtX1KWfPV;q<-5JAykS+2sY$2~UX+4461a(%{P#{rwFPu0xpIuYlbgD{C7C z=U{FUarVTYX6ZUq3wE@G^QT4H2Re;n$Fz9cJ>hABl)9T8pozqbA1)H-%1=WKm^QMu zjnUZ&Pu>q+X&6Co*y#@pxc-4waKMInEPGmE_>3@Ym3S*dedSradmc5mlJn`i0vMW6 zhBnGQD^Z;&S0lnS0curqDO@({J7kTtRE+Ra?nl^HP9<)W&C>~`!258f$XDbyQOQXG zP8hhySnarOpgu8xv8@WlXnm(Uk~)_3$Sg0vTbU3 z{W!5B(L3{Yy3K5PN<@jEarAtja`}@KYva&zFRF*s+_%jIXh$T(S=an8?=Ry3H*NRqWgsM`&!#|@kf1>=4q%bFw7^Rhz!z5I zyI^zU8_R1WN9`88Z=n>pIZQ`Ixr~_9G%Q}@A7rd#*%y7G zXl^Id=^ZL?Rx}}gWXCqzj9C6;x(~mAH|$JteXa1MH<6UQig@!Hf~t}B%tP0I|H&;y zO6N0}svOa1a^PyP9N5?4W6VF%=Bj{qHUgc8@siw4bafT=UPFSoQqKgyUX>sXTBZ=x zOh^Ad!{kOM9v{%5y}`-8u*T&C7Vq6mD%GR}UeU(*epO&qgC-CkD;%=l)ZuinSzHM` z{@`j&_vC6dDe{Yb9k@1zeV_K6!l(@=6ucoI=R^cH=6{i71%4W3$J-?<8Qn#$-DMtA z6Qqi)t?4ifrt%3jSA#6ji#{f(($KBL-iQh-xrC||3U3lq`9>r)>X%oLvtimuHW-)} zy}>9~|M>w4eES`g7;iBM%Se5-OP%1U6gNWp3AZqT8C6OlFFfQ$|7LL;tBV)(qlp4K zruar^K8FnJN3@_}B;G`a~H`t|3+6d>q3#`ctTkE-D^1#d9NalQ04lH*qUW2!V zhk7#z8OwHhSl8w14;KctfO8ubZJ4$dEdpXE78wABz=n5*=q9ex3S}`e7x~~V-jmHOhtX2*n+pBslo3uosdE7xABK=V#-t{1Hd~?i z{i~%Bw6NYF+F$aK$M`r#xe=NxhA5=p%i7!$);sd>Q}#`G?Q~fygrMXmZw?0#5#17W}6Tj+&kFexG{!mYl5FoA99}3G9l;3lVQ^ z48^~gsVppE*x91WheqI(A%F0Z#$#1UJP1R12Mj9r)y(A?a+iquX+d8WD4WAQJ_!oq z9rTISr7bPd(GTP57xm$}C}&kjMivi;zi^Y9g3&X0A;ovdJ?{%_wHgt%%9P&N4H z^XzV(uNA4 zAP`hgP6BEN5`YXh|DF~6Pud?~gWfhUKoPX4>z|}0aocC&K+AoV%|SX*N!wGq3|y< zg4lP(04XIPmt6}$N!dTk+pZv>u;MTB{L4hp9uXk7>aS!6jqM2lVr%{)H3$O127TSZ z0x9hi0k-P?nWFdQ0K`pykqUIT&jD~B0tHP{ffS(}fZ(aW$oBWTSfHO!A^><6vA?qar%tzN-5NQO zL&|F{nGiQyzNJ+bM$Y`n=Lx^3wTG^o2bGB@cwr1eb+6c-1tN=U+Db;bc~eJ!hwM{SbI=#g?$!PjDB+) zPgU_2EIxocr*EOJG52-~!gml&|D|C2OQ3Y(zAhL}iae4-Ut0F*!z!VEdfw8#`LAi# zhJ_EM*~;S|FMV6y%-SduHjPOI3cFM(GpH|HES<}*=vqY+64%dJYc|k?n6Br7)D#~# zEqO(xepfaf2F{>{E2`xb=AO%A<7RtUq6kU_Iu0m?@0K(+<}u3gVw5fy=Y4CC*{IE3 zLP3YBJ7x+U(os5=&NT%gKi23bbaZ`@;%ln)wp4GpDUT$J8NtFDHJzIe_-t}{!HAsh zJ4<^WovY};)9IKAskSebdQiXv$y5}THuJZ}ouoElIZRui=6lrupV|_Jz=9^&;@HwL;J#@23k?A;k`0Bgf;ioO>W`IQ+4? z7A)eKoY4%+g%=w;=Vm8}H>@U*=*AWNtPqgWRqib#5RTGA@Q=43FrQn3J`GkTUV5yp0U`EOTqjfp+-9;0F8!dMEwwcK%(6`8sDD^aR04 zd6O5vh|Xk?&3dy4f|1QK&Ulf{h6Iq;d-&*ti#Ck>wZFG;GHwc?b;X~eBITx49>2d8 z4HcK&1&DvEGT6kXdzAm4oO8%c}8OBt~8H956_;YP-ss*uMf==a+%w~F>Qkm7r)IAuxuoX}h92$gHqbFUun#8m zWHdy`Zrm#=Pa98x8cO0vd@Tgkr*lm0{dky+Gocr0P8y%HGEI#c3qLqIRc`Oq_C%*; zG+QTr(#Q|yHKv6R@!DmLlwJQ3FAB)Yor-I4zyDyqM4yp5n2TrQH>gRt*Zw0+WI-Sj`EgmYHh=t9! zF6lz^xpqGGpo6!5`sc0a^FVhy_Uxq|@~(1@IIzV)nTpY9sY`CV!?8e&bB8=M&sYEb z2i}fvKdhp9Hs68Y-!QJ<=wE(iQ5+49tqt;Rh|jhYrI5VW-mIz|UY{h8E=rC5sh#DU z?wGgk-Tn!I?+Zer7pHlF_Z^!Kd1qkS3&lv#%s6-<5Y%jQL${cge5=G5Ab?D&|9$Y~ zf%rJC2+=2vg;y0-SJb3<@3%}BO$T$C66q$L_H33a`VUbgW~N(4B=v5(<=My|#|J7q z*Ox4wL4kbJd_~EjLTABSu4U7Jk#`y(6O*U6(k6XxM}CtGZB(H@3~kh*zaGRXM}Iwp zQ%xFk2>@wiZrVCV_G4G~v;NebCQ%T7{SDyPpSv&dT@Cn)Mx@IK*IdNrj{*4pkV4wv z)y0J538h>cpB7iPSzA~x24T`{dzNkpvGIqvt1Dvdq@o-`B=$hkczX8$yFMhsWNK-X zxr$kR$tMD0@W)Vxe1^t9qVmsg&K^F@u84)(n2dttIEAZFN6VD$&tskpG%SI7whGL3 z)DeRiwe&?8m7U{G`oW8!SCi*dM>oYL%UKQnKxV_0RXAEBQg1kStExGEUVwLJ0orGGwb7uv+kPDl7_E2*iD|J*=8A@;XCvwq0aw5oJYN*Yh&o=l} z2z8YKb-fIAH5spql4eXqp*)o2*b>#1@DSt?zZi{GPj0gH&Nm+EI<3^z0w%YTEV4xw zI6$+=Faa|Y4o5i0zm5lOg|&tmnJ806DBovU@Ll6XsA;NRrTK~t*AAJIAS=v-UZ%Pr z$oddI@NRir&erzCwq|)ciJemr-E061j{0Vc@Ys7K(mW|JYj*$+i1Q8XlIK8T?TYS(AXu$`2U zQ@fHxc=AVHl_}cRZQ)w0anMEoqRKKIvS^`<-aMf*FM`NsG&Uowneo+Ji$7DUDYc7*Hjg;-&aHM%3 zXO6cz$$G};Uqh+iY7Wpme>PHG4cu(q;xyskNLs$^uRRMfEg?8Cj~aE-ajM%CXkx0F z>C?g3tIA#9sBQOpe`J+04{q7^TqhFk^F1jFtk4JDRO*`d-fx`GYHb=&(JiaM1b?Y^ zO3Kj3sj76ieol|N$;>j@t#tKj=@*gP+mv}KwlTcPYgR$+)2(gk)2JNE=jSauPq!$< z<|?Sb%W)wS)b>b6i{8!x!^!xIdU3{CJFVnTcw0j{M%DUCF=_>eYYEUWnA-|B(+KYL z_W_`JI&&u^@t0})@DH^1LDuT0s3dMpCHIbYBgOT4Zh_4yHbSqRbtIKndeT4Q*Jg91 z@>rO!^t-G~*AIW;FQ$3J=b;oGg8?CTa~qNCb>&cgp@e;?0AqA&paz~(%PYO+QBo4( zp?}ZdSMWx0iJm7HVNk9A#^9Osa#GPJ!_pYEW}($8>&2}fbr@&ygZ?${A7_9?X$(&5 z#~-hxdPQwCNEpf=^+WH-3`2LxrrBMTa}~qJC9S;VzhG!On^JLyW6WkF{8aAE$sM+( zxr8xLW(KIjI`Rm(24r3OJBk<3GF=G!uSP0-G&AY32mLm8q=#Xom&Pqv=1C{d3>1^ zAjsmV@XZ%BKq^eUfBpa8KvO8ob|F3hAjJv*yo2Bhl0)KUus{qA9m8jf)KnOGGTa6~4>3@J_VzkL|vYPl*uL+Ot*Q7W!f5rJw5+AsjP_IfL+-S*2p| zB7!FhjvkUTxQkGWGSg{X;h~dK>gAJivW?88Nu!3o>ySDaABn$rAYt086#27fbjPQS zhq>55ASvm*60qRdVOY9=bU^+{Pi#!OaZwENN;zy5?EztOHK-Q5;rCuiFl}BSc1YaQ zC-S{=KsGDz@Ji9O5W;XxE0xI|@3o6(2~i4b8Ii9VT;^G$*dRw(V?=br)D&q^XkeBX z+gl~+R@rVD-Hwv@7RHV?Bip5KMI)aV^&snt?H<$Nt=OPx#VxF&BGi?2A2+lNOYywNUGMeGL;|(=UjGDtLG0sN&LpGx;|U;xa13s z;W_|SPk^G}!M9_^pO zA3bt3-tca%^42sHeDtfcC0S3w3H1ny!Bxpa=*k?XRPpx9Bb-gx1J9Yvx)4J(8cG+q z(iCPZ9dsf3#QVyZgD_MW#G#qgV)olu$59&3(PzQfw@%4uZ~<5J=ABvdY43(Qnp{;G zHg3>@T#>DbTuhFl3)fb3TFqdh)V2aq7!;&JOHseTWukvA7}(iGUq;v-{2J0iHSNHq z;+)h!p6Ok^+Sp8-jgL($n6Qu47xyE`cFO5SdZR6;R!FET`tm#0D37z339Suxjpv+s z*=%2-N$N?X&0?x_uut3erF@aBGj;9$k9?3FlbDO{RQa1_qtxrh4!4#fjp4x~akvdTp@ zos?^Q&XE;3N93s4rHQGPrV7+au1$$aB6$hLy*Yz_kN$~dweb9PcB!eYVQTGjFuJP> zZCEwBtb>TIgIO^qAzq@Bv-qud_ZD-2W<_at&ml-gv`tPt$@DF5`HlA zM>DmmMkpv&Zm-8)Y#0bLQf4MpD4_-7M8eu6rh(tL8dq8onHs#R9J~dGd2IaXXMC~h z91pKhnQa%Fsn29nAA1;x(%oC zhca~qQDJaMf?wFrl-Pj;e$bZMYmMF!Y3Lv&Sb?Sjn#!NVx&NDyc^$b4uYyo2OmERa zRz;yDGd@JTykzFLe|Wk-y7#3x`6$wt$zR8r48mdUvfbeL+4D|Z``~7$PrE@qc7rZe zVsIoIbCwzjLZ@_M1*bD{HaYn();Z1-q*-I{tEnTZ(}Zmk&%MXSNBX>o| z-u*RNkAyKC-Srp7c-=@5f)xMWg>o2WWl}j6j9=8+D8;T z>0*0q#;qw8%U8i;6s0fu#I*%(g*@@a2Er@@nyI}{=@W{Z-;`=wN4N~>6Xrh&z#g}l zN1g5}0-#(nHUTv_rl2{yUZ;h#t&Fd?tY!7L%ClY)>uH-Ny2ET$lW$S)IQiN79H)D^ zb&0AXYkupy0~w8)*>Sj_p9}4L?lGTq%VG|2p`nWGhnM^!g|j-|O{%9Q%swOq63|*W zw$(N_laI}`ilB+o!a-wl?er~;;3+)$_akSQ!8YO_&-e*SI7n^(QQ;X0ZE`{4f!gAl z5$d+9CKVNonM!NO_frREICIAxOv)wm>}-k?iRisM`R7;=lyo|E_YR~FpS&PS`Lg0f zl-ON<0S%Uix8J%#yZdkCz4YNhcec<|7*P(JsM#>-L>+tYg_71q9~70FAc^6KW5jql zw!crdgVLH1G_eET=|SEc977;)ezVC|{PJZfra|}@rD;0s&@61mTEBJtILllg{%{vN zfhb&lq0yChaLhnJ-Qb62MB7`>M;|_ceHKZAeeh@#8tbrK!ArP6oXIhMK;dhEJTY`@ z0Tq>MIe0`7tGv)N*F0IGYSJv0vN?Az8g+4K9S!pW2~9F4W(_U_T=jCZrzuZ3*|__T zONp_UWmyePv8C~rckc?Xji;Z5OEqg zC*Um)i;Wh4TEwqReQdVVbUKT^2>Tpi6z_^-uF*adUFug4i@JhzpWT^Sk&E>CyP2?H zWf6x}ehuTs6wvzCnTU&gYzT029Nz19(In1WC z`(1IGmi!O%2AR|BjQa4Q0~u)kM%}?xQyjWuQ16^Gp++;`vr7!k--UZWM*~7Zl|ceO@I3`OpaRhD;YoCuo5IC0uHx>9 z478hu@H|e0Zlo)Zj@01#;8BDs@991xe~^9uG2}UXLM(m7fa}AMwX*tjioBeV&Q8Gx zSq$6wZFkRBK`cMI>R(@W@+lo2t)L+4q-negWRLWZBz*|%=W4v62JrmzNuOtA*x)QE z5L%=OH#@KMdB%Jp^r?0tE}5-*6oP`-lO7Sf)0)n*e<{HA=&qhLR)oD8-+V}Z4=md) z+k9lKf64DB2hAT)UaCP~di?-V3~JBH7itYyk~L6hrnxM%?RKntqd`=!b|e7eFnAcu z3*V;g{xr7TSTm$}DY%~SMpl>m{Sj!We+WfxSEor?YeiAxYUy25pn(?T()E>ByP^c@ zipwvWrhIK((R((VU+;@LmOnDu)ZXB3YArzzin!Z^0;PyJWnlfflo|q8(QY;o1*5CO z##hnkO{uynTMdk`~DOC#1 zdiYxQoy}=@7(ke#A8$YZZVtk4wo$8x28&I;cY3Ro-|kW=*yiiHgCLZeAr)UtVx>Tu z|LvL0hq|1-jC0I4x#>&QZCfrVB=zT!nR|~Uz`9%~2 znl{uZ{VEszW`Fad^q_HB!K9*|U-stK%?~;g?&&+12A}Rq$z($Bzuk^2X(Y=hF?-dQ ztc3DsQKI;qhWIV`99Q#R3xnU0AvY!i*BECj-z9l74|%O=V@nlv|qqC^r^-~C?E zGW%c|uYgnfJ(gjsTm_cIqcv*mYM{+i+&@F@+69ZQOK&u#v4oxUSQJ=tvqQ3W=*m;| z>SkBi8LYb-qRY7Sthh*0%3XAC%$z1rhOJzuX=PkTOa=DlocZUpE#KxVNH5)_4n=T( zGi3YrH7e~sPNYVBd~Grcq#CF~rN{p9Zza-Ntnwfma@TB)=3g36*0lSZg#ixEjFe%+ zX=&LDZ5zqculZ`=RYc^ln(~;nN|Qh6gN=!6f9-N2h+3NWbIxYud&;4SX*tWf5slk4 z{q@@l71UAZgj~*6edXb57fBUxvAS7s(RI=X868JM0+^DCn2yC>;v%S;qPOjB>YVsz(Zx9a>>BK&M zIQK>7_n)4ud0X5YM}^i*keH{ehLsiy9@NvOpsFeQjdI6anLGvVbBw_*fU1TzdVS$i z*4j7z!I5RF#rSz|8ibi$;qE{4`aqWYik7QB5U&F5C*;TO_x+gtzPGpzNt!7~nsBT7)Ckc(K~%uv&{{6A`mmBJVAk-{s~52Vu|HbCH7_W1~ZCX^RflOakGg=jo2Z z<*s;5-J+2@^LRDZ-7EV&Pq+FTErw@pfFqvx^i%E7Fx#^n(E`m2(c>K-O5`M`Yek9el zzTGs5qD6*G;y#~xu3>qWuO?-amKYtvRA}I9z#UspEeM;wOERYeot_n_EUMJf$4_u?E!6X~?q)tPoZb^_;8Y_Ox2h1m<+Le-fsRd|T8db<8#$bqez zua^Z|>h%zdnuU^ww$#-dZ9NTM`FN+!IlLkz*FqWb!x^Z|C{KyGjZ+>G;;7Mb@LY|H zc+Gp`L((Dw7pnDlHNm&;SfHedhx*kad$I^uGz{`0BYelq0yEUHpNKSkvj$|dpvY3{7*YGyhXA^LP0&wOw9oNoC=QoVx1<2Dne8qqZL zm>nFh5DX(-RnQwvHCZQwn^#Z=E!SPVlaRJ78Bo@}!!9dRt^qZy?-*`Pt4WSmgucJv zV1yFkcjlEM^uz-;b#Q7ZCP@Lk)m}uPX={R4B=56k7WNh11BN~0T*vr@!!ow^B0hOR zQ)4)&(e%>bNNL%bm<&8H{*l_L7s0$2GUgX2Vd;=4d9Dm2v3TaL+;L>{K7h7 zV#k?xDPm(NDE31$ z<}|X)pEY6myjK+^gaIMk&Yj2~F0rSKemNqlsVm4c|N7mp_C*L01s;GNx#D-*&gk!qQr}^?_r@q!8fuXw!)fA7xkd} zb>vHvdx~H$5qqAWrow7}+8zBM65-JOt5z za=T6f7MK`XJuQog8kIEboPdhcaVJeHy)5z7EBLK5NRr()E|#K0L0N^JD@pUA^Czb` zbUZ_558y+vqAGeyHCbrvOvLD67Ph}06959VzQ_|>RrXQAqE+AQ(-AaKdxoWaF8hdt z{O3W@b^*o#-f1VuU>YMV03ELF7zkCN4Q&b#prz%3Nne0lSbRo@@ z^ihv%oIl~Qyl6Q;a#$*jOC%x0_;eis*)J7=f@Ct*)xF5 zo}u~@-I}2|$b%5L7>@+Z?4o+1r&v6ceIy+vroK&jCQ<4q&45HP2wCol4hVm3pZtjf zHz1D7oyaSKJ~T{Gx}7ONLA)D5k(%%`WswrDyzX*rn}i}}TB4^y#@mAwPzoC)`?rYv zHgx|trUN#mu*VzUV~8TnJM2Qh*ZM5B{x&y>5An`(M7=Z*Q>TdiH@j*2=moNuOtvpz z+G`@~-`%~+AgPKgke@XiRPgndh@bp*-HRsh;HTtz@-y_uhb%7ylVOTqG0#u?Vn5c5 zEp*XRo|8hcgG^$#{$O9CJ&NE;TrfRpSnLmes&MO{m=N%zc`}gb!eQ7odl$oy1%PI} z#AIxx%oRVy&{O~9xnK4$EY>(eQj}!HKIV$Fz*H=-=Kn)N0D6u`(;iO|VraI4fu_W` z;b5{7;Lyx4za}DU#+U7}=H0dAS#YJJ&g2!P@Htu-AL&w=-)*%P9h2{wR|@?Ff9~)b z^+e_3Hetq7W%ls{!?<6&Y$Z;NNB41pvrv)|MET6AZXFXJeFqbFW5@i5WGzl?bP+~? z*&_puH;wKv2)9T_d+P`bLvJFqX#j&xa*-;0nGBbQf0DC>o~=J_Wmtf*2SZQr?{i~X z9-IbRH8{iy?<0v9Ir1?$66+igy|yDQ5J~A9sFX@Pe<*kCY8+MwH?I z`P}zfQ6l^AO8ehZ=l^ZR;R%uu4;BK*=?W9t|0{+-at(MQZ(CtG=EJFNaFMlKCMXu30(gJUqj5+ z`GM|!keqcj;FKTa_qq;{*dHRXAq157hlB@kL#8%yAm2AgfU|*rDKX@FLlp=HL8ddv zAWLCHe@DcDeB2}fl7#=0+#<05c3=VqM*O3bkr@9X4nO|)q0hU;Gye{L8ZN*NH8Id@mP-u;Fmb8YuorjLrW&ndip8CN%_qp982r w1WEnz9^$&s1hkp_3#lPJQ~!HI7WYYjA7>z!`?f%npAh2%rB@vD|Lau$2O)#1n*aa+ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41dfb87..aa991fc 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-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefa..1b6c787 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # 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. +# * 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: # diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..3703f36 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,6 @@ +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 c5b9f76..8974122 100644 --- a/src/main/java/thetadev/constructionwand/ConstructionWand.java +++ b/src/main/java/thetadev/constructionwand/ConstructionWand.java @@ -87,7 +87,6 @@ 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 77a9071..579b7dd 100644 --- a/src/main/java/thetadev/constructionwand/basics/CommonEvents.java +++ b/src/main/java/thetadev/constructionwand/basics/CommonEvents.java @@ -11,7 +11,7 @@ public class CommonEvents { @SubscribeEvent public static void logOut(PlayerEvent.PlayerLoggedOutEvent e) { - Player player = e.getPlayer(); + Player player = e.getEntity(); 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 6fc0de9..97d7fca 100644 --- a/src/main/java/thetadev/constructionwand/basics/ConfigServer.java +++ b/src/main/java/thetadev/constructionwand/basics/ConfigServer.java @@ -4,6 +4,7 @@ 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; @@ -13,7 +14,7 @@ import java.util.List; public class ConfigServer { - private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); + public static final ForgeConfigSpec SPEC; public static final ForgeConfigSpec.IntValue LIMIT_CREATIVE; public static final ForgeConfigSpec.IntValue MAX_RANGE; @@ -32,7 +33,7 @@ public class ConfigServer private static final HashMap wandProperties = new HashMap<>(); public static WandProperties getWandProperties(Item wand) { - return wandProperties.getOrDefault(wand.getRegistryName(), WandProperties.DEFAULT); + return wandProperties.getOrDefault(ForgeRegistries.ITEMS.getKey(wand), WandProperties.DEFAULT); } public static class WandProperties @@ -100,39 +101,41 @@ public class ConfigServer } static { - BUILDER.comment("This is the Server config for ConstructionWand.", + final var builder = new ForgeConfigSpec.Builder(); + + 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(); - } + 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(); + SPEC = builder.build(); + } } diff --git a/src/main/java/thetadev/constructionwand/basics/WandUtil.java b/src/main/java/thetadev/constructionwand/basics/WandUtil.java index aa98cbe..b0fb1e9 100644 --- a/src/main/java/thetadev/constructionwand/basics/WandUtil.java +++ b/src/main/java/thetadev/constructionwand/basics/WandUtil.java @@ -20,7 +20,8 @@ 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.world.BlockEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.registries.ForgeRegistries; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.containers.ContainerManager; import thetadev.constructionwand.items.wand.ItemWand; @@ -91,7 +92,7 @@ public class WandUtil public static boolean isTEAllowed(BlockState state) { if(!state.hasBlockEntity()) return true; - ResourceLocation name = state.getBlock().getRegistryName(); + ResourceLocation name = ForgeRegistries.BLOCKS.getKey(state.getBlock()); 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 8e80d9d..b830526 100644 --- a/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java +++ b/src/main/java/thetadev/constructionwand/basics/pool/RandomPool.java @@ -1,17 +1,18 @@ 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 Random rng; + private final RandomSource rng; private final HashMap elements; private HashSet pool; - public RandomPool(Random rng) { + public RandomPool(RandomSource 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 a92bca2..873f2e5 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.KeyInputEvent event) { + public void KeyEvent(InputEvent.Key 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.MouseScrollEvent event) { + public void MouseScrollEvent(InputEvent.MouseScrollingEvent 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.getPlayer(); + Player player = event.getEntity(); 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.getPlayer(); + Player player = event.getEntity(); 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 b8dec20..39cb2c1 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.DrawSelectionEvent; +import net.minecraftforge.client.event.RenderHighlightEvent; 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(DrawSelectionEvent.HighlightBlock event) { + public void renderBlockHighlight(RenderHighlightEvent.Block event) { if(event.getTarget().getType() != HitResult.Type.BLOCK) return; BlockHitResult rtr = event.getTarget(); @@ -55,7 +55,7 @@ public class RenderBlockPreview MultiBufferSource buffer = event.getMultiBufferSource(); VertexConsumer lineBuilder = buffer.getBuffer(RenderType.LINES); - double partialTicks = event.getPartialTicks(); + double partialTicks = event.getPartialTick(); 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; diff --git a/src/main/java/thetadev/constructionwand/client/ScreenWand.java b/src/main/java/thetadev/constructionwand/client/ScreenWand.java index d665e83..6b5dd3e 100644 --- a/src/main/java/thetadev/constructionwand/client/ScreenWand.java +++ b/src/main/java/thetadev/constructionwand/client/ScreenWand.java @@ -5,8 +5,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; 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.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.LiteralContents; +import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.item.ItemStack; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.IOption; @@ -31,7 +32,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(new TextComponent("ScreenWand")); + super(MutableComponent.create(new LiteralContents("ScreenWand"))); this.wand = wand; wandOptions = new WandOptions(wand); } @@ -55,16 +56,18 @@ public class ScreenWand extends Screen @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (Minecraft.getInstance().options.keyInventory.matches(keyCode, scanCode)) { + if(Minecraft.getInstance().options.keyInventory.matches(keyCode, scanCode)) { this.onClose(); return true; - } else { + } + else { return super.keyPressed(keyCode, scanCode, modifiers); } } private void createButton(int cx, int cy, IOption option) { - 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 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); } @@ -77,7 +80,8 @@ public class ScreenWand extends Screen private void drawTooltip(PoseStack matrixStack, int mouseX, int mouseY, IOption option) { if(isMouseOver(mouseX, mouseY)) { - renderTooltip(matrixStack, new TranslatableComponent(option.getDescTranslation()), mouseX, mouseY); + renderTooltip(matrixStack, MutableComponent.create( + new TranslatableContents(option.getDescTranslation())), mouseX, mouseY); } } @@ -90,6 +94,9 @@ public class ScreenWand extends Screen } private Component getButtonLabel(IOption option) { - return new TranslatableComponent(option.getKeyTranslation()).append(new TranslatableComponent(option.getValueTranslation())); + return MutableComponent.create( + new TranslatableContents(option.getKeyTranslation(), + new TranslatableContents(option.getValueTranslation())) + ); } } diff --git a/src/main/java/thetadev/constructionwand/data/Inp.java b/src/main/java/thetadev/constructionwand/data/Inp.java index 69225da..29cfdbc 100644 --- a/src/main/java/thetadev/constructionwand/data/Inp.java +++ b/src/main/java/thetadev/constructionwand/data/Inp.java @@ -5,6 +5,7 @@ import net.minecraft.tags.TagKey; 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 { @@ -19,7 +20,7 @@ public class Inp } public static Inp fromItem(ItemLike in) { - return new Inp(in.asItem().getRegistryName().getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); + return new Inp(ForgeRegistries.ITEMS.getKey(in.asItem()).getPath(), Ingredient.of(in), ItemPredicate.Builder.item().of(in).build()); } public static Inp fromTag(TagKey in) { diff --git a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java index c007b70..771fec2 100644 --- a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java @@ -5,6 +5,7 @@ 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; @@ -21,7 +22,7 @@ public class ItemModelGenerator extends ItemModelProvider protected void registerModels() { for(RegistryObject itemObject : ModItems.ITEMS.getEntries()) { Item item = itemObject.get(); - String name = item.getRegistryName().getPath(); + String name = ForgeRegistries.ITEMS.getKey(item).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 e389e41..c35f123 100644 --- a/src/main/java/thetadev/constructionwand/data/ModData.java +++ b/src/main/java/thetadev/constructionwand/data/ModData.java @@ -2,9 +2,9 @@ package thetadev.constructionwand.data; import net.minecraft.data.DataGenerator; 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 @@ -15,11 +15,11 @@ public class ModData ExistingFileHelper fileHelper = event.getExistingFileHelper(); if(event.includeServer()) { - generator.addProvider(new RecipeGenerator(generator)); + generator.addProvider(true, new RecipeGenerator(generator)); } if(event.includeClient()) { - generator.addProvider(new ItemModelGenerator(generator, fileHelper)); + generator.addProvider(true, new ItemModelGenerator(generator, fileHelper)); } } } diff --git a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java index ed0ca4d..d52ab77 100644 --- a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java +++ b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java @@ -7,11 +7,14 @@ 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.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.TranslatableContents; 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; @@ -34,12 +37,12 @@ public class ConstructionWandJeiPlugin implements IModPlugin private Component keyComboComponent(boolean shiftOpt, Component optkeyComponent) { String key = shiftOpt ? "sneak_opt" : "sneak"; - return new TranslatableComponent(baseKey + "key." + key, optkeyComponent).withStyle(ChatFormatting.BLUE); + return MutableComponent.create(new TranslatableContents(baseKey + "key." + key, optkeyComponent)).withStyle(ChatFormatting.BLUE); } @Override - public void registerRecipes(IRecipeRegistration registration) { - Component optkeyComponent = new TranslatableComponent(InputConstants.getKey(ConfigClient.OPT_KEY.get(), -1).getName()) + public void registerRecipes(@NotNull IRecipeRegistration registration) { + Component optkeyComponent = MutableComponent.create(new TranslatableContents(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); @@ -49,21 +52,25 @@ public class ConstructionWandJeiPlugin implements IModPlugin ConfigServer.WandProperties wandProperties = ConfigServer.getWandProperties(wand); String durabilityKey = wand == ModItems.WAND_INFINITY.get() ? "unlimited" : "limited"; - Component durabilityComponent = new TranslatableComponent(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); + Component durabilityComponent = MutableComponent.create(new TranslatableContents(baseKey + "durability." + durabilityKey, wandProperties.getDurability())); - registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM, - new TranslatableComponent(baseKey + "wand", - new TranslatableComponent(baseKeyItem + wand.getRegistryName().getPath()), - wandProperties.getLimit(), durabilityComponent, - optkeyComponent, wandModeComponent, wandGuiComponent) + registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM_STACK, + MutableComponent.create( + new TranslatableContents(baseKey + "wand", + new TranslatableContents(baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath()), + wandProperties.getLimit(), durabilityComponent, + optkeyComponent, wandModeComponent, wandGuiComponent) + ) ); } for(RegistryObject coreSupplier : ModItems.CORES) { Item core = coreSupplier.get(); - registration.addIngredientInfo(new ItemStack(core), VanillaTypes.ITEM, - new TranslatableComponent(baseKey + core.getRegistryName().getPath()), - new TranslatableComponent(baseKey + "core", wandModeComponent) + registration.addIngredientInfo(new ItemStack(core), VanillaTypes.ITEM_STACK, + MutableComponent.create( + new TranslatableContents(baseKey + ForgeRegistries.ITEMS.getKey(core).getPath(), + new TranslatableContents(baseKey + "core", wandModeComponent) + )) ); } } diff --git a/src/main/java/thetadev/constructionwand/items/ModItems.java b/src/main/java/thetadev/constructionwand/items/ModItems.java index 5472748..eb31a12 100644 --- a/src/main/java/thetadev/constructionwand/items/ModItems.java +++ b/src/main/java/thetadev/constructionwand/items/ModItems.java @@ -1,21 +1,17 @@ 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.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.event.RegistryEvent; +import net.minecraftforge.client.event.RegisterColorHandlersEvent; 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.IForgeRegistry; -import net.minecraftforge.registries.IForgeRegistryEntry; +import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.registries.RegistryObject; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.WandOptions; @@ -54,9 +50,10 @@ public class ModItems } @SubscribeEvent - public static void registerRecipeSerializers(RegistryEvent.Register> event) { - IForgeRegistry> r = event.getRegistry(); - register(r, "wand_upgrade", RecipeWandUpgrade.SERIALIZER); + public static void registerRecipeSerializers(RegisterEvent event) { + event.register(ForgeRegistries.Keys.RECIPE_SERIALIZERS, registry -> { + registry.register("wand_upgrade", RecipeWandUpgrade.SERIALIZER); + }); } @OnlyIn(Dist.CLIENT) @@ -71,18 +68,12 @@ public class ModItems } } - @OnlyIn(Dist.CLIENT) - public static void registerItemColors() { - ItemColors colors = Minecraft.getInstance().getItemColors(); - + @SubscribeEvent + public static void registerItemColors(RegisterColorHandlersEvent.Item event) { for(RegistryObject itemSupplier : WANDS) { Item item = itemSupplier.get(); - colors.register((stack, layer) -> (layer == 1 && stack.getItem() instanceof ItemWand) ? + event.register((stack, layer) -> (layer == 1 && stack.getItem() instanceof ItemWand) ? new WandOptions(stack).cores.get().getColor() : -1, item); } } - - 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 6b3362c..475fa4b 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java @@ -2,7 +2,8 @@ package thetadev.constructionwand.items.core; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -23,9 +24,15 @@ 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(new TranslatableComponent(ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc") - .withStyle(ChatFormatting.GRAY)); - lines.add(new TranslatableComponent(ConstructionWand.MODID + ".tooltip.core_tip") - .withStyle(ChatFormatting.AQUA)); + lines.add( + MutableComponent.create(new TranslatableContents( + ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc" + )).withStyle(ChatFormatting.GRAY) + ); + lines.add( + MutableComponent.create(new TranslatableContents( + 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 5062761..07a472e 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreAngel.java @@ -1,5 +1,7 @@ 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; @@ -18,4 +20,9 @@ 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 bb2b5d3..3cad557 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java @@ -1,5 +1,7 @@ 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; @@ -18,4 +20,9 @@ public class ItemCoreDestruction extends ItemCore public IWandAction getWandAction() { return new ActionDestruction(); } + + @Override + public ResourceLocation getRegistryName() { + return ConstructionWand.loc("core_angel"); + } } diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java index 4fa3529..ce696ee 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java @@ -3,8 +3,9 @@ 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.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.LiteralContents; +import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -107,35 +108,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(new TranslatableComponent(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) - .append(new TranslatableComponent(opt.getValueTranslation()).withStyle(ChatFormatting.GRAY)) + lines.add(MutableComponent.create(new TranslatableContents(opt.getKeyTranslation())).withStyle(ChatFormatting.AQUA) + .append(MutableComponent.create(new TranslatableContents(opt.getValueTranslation())).withStyle(ChatFormatting.GRAY)) ); } if(!options.cores.getUpgrades().isEmpty()) { - lines.add(new TextComponent("")); - lines.add(new TranslatableComponent(langTooltip + "cores").withStyle(ChatFormatting.GRAY)); + lines.add(MutableComponent.create(new LiteralContents(""))); + lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "cores")).withStyle(ChatFormatting.GRAY)); for(IWandCore core : options.cores.getUpgrades()) { - lines.add(new TranslatableComponent(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString())); + lines.add(MutableComponent.create(new TranslatableContents(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString()))); } } } // Default tooltip: show block limit + active wand core else { IOption opt = options.allOptions[0]; - 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)); + lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "blocks", limit)).withStyle(ChatFormatting.GRAY)); + lines.add(MutableComponent.create(new TranslatableContents(opt.getKeyTranslation())).withStyle(ChatFormatting.AQUA) + .append(MutableComponent.create(new TranslatableContents(opt.getValueTranslation())).withStyle(ChatFormatting.WHITE))); + lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "shift")).withStyle(ChatFormatting.AQUA)); } } public static void optionMessage(Player player, IOption option) { player.displayClientMessage( - 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)) + MutableComponent.create(new TranslatableContents(option.getKeyTranslation())).withStyle(ChatFormatting.AQUA) + .append(MutableComponent.create(new TranslatableContents(option.getValueTranslation())).withStyle(ChatFormatting.WHITE)) + .append(MutableComponent.create(new TranslatableContents(" - ")).withStyle(ChatFormatting.GRAY)) + .append(MutableComponent.create(new TranslatableContents(option.getDescTranslation())).withStyle(ChatFormatting.WHITE)) , true); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 03554c7..57fb332 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[40,)" +loaderVersion = "[41,)" 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 = "[40,)" +versionRange = "[41,)" ordering = "NONE" side="BOTH" [[dependencies.constructionwand]] modId="minecraft" mandatory = true -versionRange = "[1.18.2, 1.19)" +versionRange = "[1.19, 1.20)" ordering = "NONE" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 59ca9fc..2b3d665 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,8 @@ { "pack": { "description": "ConstructionWand resources", - "pack_format": 9 + "pack_format": 9, + "forge:resource_pack_format": 9, + "forge:data_pack_format": 10 } } From f400310b59d008f0087f2f6b5b4dfa6ed48b8d08 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 18:40:44 +0200 Subject: [PATCH 06/29] fix text components --- .../constructionwand/client/ScreenWand.java | 13 ++------- .../jei/ConstructionWandJeiPlugin.java | 22 +++++--------- .../constructionwand/items/core/ItemCore.java | 11 ++----- .../items/core/ItemCoreDestruction.java | 2 +- .../constructionwand/items/wand/ItemWand.java | 29 +++++++++---------- 5 files changed, 27 insertions(+), 50 deletions(-) diff --git a/src/main/java/thetadev/constructionwand/client/ScreenWand.java b/src/main/java/thetadev/constructionwand/client/ScreenWand.java index 6b5dd3e..8151c03 100644 --- a/src/main/java/thetadev/constructionwand/client/ScreenWand.java +++ b/src/main/java/thetadev/constructionwand/client/ScreenWand.java @@ -5,9 +5,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.contents.LiteralContents; -import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.item.ItemStack; import thetadev.constructionwand.ConstructionWand; import thetadev.constructionwand.basics.option.IOption; @@ -32,7 +29,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(MutableComponent.create(new LiteralContents("ScreenWand"))); + super(Component.literal("ScreenWand")); this.wand = wand; wandOptions = new WandOptions(wand); } @@ -80,8 +77,7 @@ public class ScreenWand extends Screen private void drawTooltip(PoseStack matrixStack, int mouseX, int mouseY, IOption option) { if(isMouseOver(mouseX, mouseY)) { - renderTooltip(matrixStack, MutableComponent.create( - new TranslatableContents(option.getDescTranslation())), mouseX, mouseY); + renderTooltip(matrixStack, Component.translatable(option.getDescTranslation()), mouseX, mouseY); } } @@ -94,9 +90,6 @@ public class ScreenWand extends Screen } private Component getButtonLabel(IOption option) { - return MutableComponent.create( - new TranslatableContents(option.getKeyTranslation(), - new TranslatableContents(option.getValueTranslation())) - ); + return Component.translatable(option.getKeyTranslation()).append(Component.translatable(option.getValueTranslation())); } } diff --git a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java index d52ab77..db46ea1 100644 --- a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java +++ b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java @@ -7,8 +7,6 @@ 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.MutableComponent; -import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -37,12 +35,12 @@ public class ConstructionWandJeiPlugin implements IModPlugin private Component keyComboComponent(boolean shiftOpt, Component optkeyComponent) { String key = shiftOpt ? "sneak_opt" : "sneak"; - return MutableComponent.create(new TranslatableContents(baseKey + "key." + key, optkeyComponent)).withStyle(ChatFormatting.BLUE); + return Component.translatable(baseKey + "key." + key, optkeyComponent).withStyle(ChatFormatting.BLUE); } @Override public void registerRecipes(@NotNull IRecipeRegistration registration) { - Component optkeyComponent = MutableComponent.create(new TranslatableContents(InputConstants.getKey(ConfigClient.OPT_KEY.get(), -1).getName())) + Component optkeyComponent = Component.translatable(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); @@ -52,25 +50,19 @@ public class ConstructionWandJeiPlugin implements IModPlugin ConfigServer.WandProperties wandProperties = ConfigServer.getWandProperties(wand); String durabilityKey = wand == ModItems.WAND_INFINITY.get() ? "unlimited" : "limited"; - Component durabilityComponent = MutableComponent.create(new TranslatableContents(baseKey + "durability." + durabilityKey, wandProperties.getDurability())); + Component durabilityComponent = Component.translatable(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM_STACK, - MutableComponent.create( - new TranslatableContents(baseKey + "wand", - new TranslatableContents(baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath()), - wandProperties.getLimit(), durabilityComponent, - optkeyComponent, wandModeComponent, wandGuiComponent) - ) + Component.translatable(baseKey + "wand", baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath(), + wandProperties.getLimit(), durabilityComponent, optkeyComponent, wandModeComponent, wandGuiComponent) ); } for(RegistryObject coreSupplier : ModItems.CORES) { Item core = coreSupplier.get(); registration.addIngredientInfo(new ItemStack(core), VanillaTypes.ITEM_STACK, - MutableComponent.create( - new TranslatableContents(baseKey + ForgeRegistries.ITEMS.getKey(core).getPath(), - new TranslatableContents(baseKey + "core", wandModeComponent) - )) + Component.translatable(baseKey + ForgeRegistries.ITEMS.getKey(core).getPath()) + .append(Component.translatable(baseKey + "core", wandModeComponent)) ); } } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java index 475fa4b..25836c0 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCore.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCore.java @@ -2,8 +2,6 @@ package thetadev.constructionwand.items.core; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -25,14 +23,11 @@ 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( - MutableComponent.create(new TranslatableContents( - ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc" - )).withStyle(ChatFormatting.GRAY) + Component.translatable(ConstructionWand.MODID + ".option.cores." + getRegistryName().toString() + ".desc") + .withStyle(ChatFormatting.GRAY) ); lines.add( - MutableComponent.create(new TranslatableContents( - ConstructionWand.MODID + ".tooltip.core_tip" - )).withStyle(ChatFormatting.AQUA) + Component.translatable(ConstructionWand.MODID + ".tooltip.core_tip").withStyle(ChatFormatting.AQUA) ); } } diff --git a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java index 3cad557..16d1d8c 100644 --- a/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java +++ b/src/main/java/thetadev/constructionwand/items/core/ItemCoreDestruction.java @@ -23,6 +23,6 @@ public class ItemCoreDestruction extends ItemCore @Override public ResourceLocation getRegistryName() { - return ConstructionWand.loc("core_angel"); + 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 ce696ee..7071048 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java @@ -3,9 +3,6 @@ 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.MutableComponent; -import net.minecraft.network.chat.contents.LiteralContents; -import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -108,35 +105,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(MutableComponent.create(new TranslatableContents(opt.getKeyTranslation())).withStyle(ChatFormatting.AQUA) - .append(MutableComponent.create(new TranslatableContents(opt.getValueTranslation())).withStyle(ChatFormatting.GRAY)) + lines.add(Component.translatable(opt.getKeyTranslation()).withStyle(ChatFormatting.AQUA) + .append(Component.translatable(opt.getValueTranslation()).withStyle(ChatFormatting.GRAY)) ); } if(!options.cores.getUpgrades().isEmpty()) { - lines.add(MutableComponent.create(new LiteralContents(""))); - lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "cores")).withStyle(ChatFormatting.GRAY)); + lines.add(Component.literal("")); + lines.add(Component.translatable(langTooltip + "cores").withStyle(ChatFormatting.GRAY)); for(IWandCore core : options.cores.getUpgrades()) { - lines.add(MutableComponent.create(new TranslatableContents(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString()))); + lines.add(Component.translatable(options.cores.getKeyTranslation() + "." + core.getRegistryName().toString())); } } } // Default tooltip: show block limit + active wand core else { IOption opt = options.allOptions[0]; - lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "blocks", limit)).withStyle(ChatFormatting.GRAY)); - lines.add(MutableComponent.create(new TranslatableContents(opt.getKeyTranslation())).withStyle(ChatFormatting.AQUA) - .append(MutableComponent.create(new TranslatableContents(opt.getValueTranslation())).withStyle(ChatFormatting.WHITE))); - lines.add(MutableComponent.create(new TranslatableContents(langTooltip + "shift")).withStyle(ChatFormatting.AQUA)); + 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)); } } public static void optionMessage(Player player, IOption option) { player.displayClientMessage( - MutableComponent.create(new TranslatableContents(option.getKeyTranslation())).withStyle(ChatFormatting.AQUA) - .append(MutableComponent.create(new TranslatableContents(option.getValueTranslation())).withStyle(ChatFormatting.WHITE)) - .append(MutableComponent.create(new TranslatableContents(" - ")).withStyle(ChatFormatting.GRAY)) - .append(MutableComponent.create(new TranslatableContents(option.getDescTranslation())).withStyle(ChatFormatting.WHITE)) + 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)) , true); } From 06d2488c6c32e6939918ec81e7feee6b716d4761 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 19:36:51 +0200 Subject: [PATCH 07/29] fix config access before server start --- .../java/thetadev/constructionwand/ConstructionWand.java | 4 ---- .../java/thetadev/constructionwand/basics/CommonEvents.java | 6 ++++++ .../constructionwand/basics/ReplacementRegistry.java | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/thetadev/constructionwand/ConstructionWand.java b/src/main/java/thetadev/constructionwand/ConstructionWand.java index 8974122..5109695 100644 --- a/src/main/java/thetadev/constructionwand/ConstructionWand.java +++ b/src/main/java/thetadev/constructionwand/ConstructionWand.java @@ -15,7 +15,6 @@ 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; @@ -74,9 +73,6 @@ public class ConstructionWand // Container registry ContainerRegistrar.register(); - //Replacement registry - ReplacementRegistry.init(); - // Stats ModStats.register(); } diff --git a/src/main/java/thetadev/constructionwand/basics/CommonEvents.java b/src/main/java/thetadev/constructionwand/basics/CommonEvents.java index 579b7dd..8279bfe 100644 --- a/src/main/java/thetadev/constructionwand/basics/CommonEvents.java +++ b/src/main/java/thetadev/constructionwand/basics/CommonEvents.java @@ -2,6 +2,7 @@ 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; @@ -9,6 +10,11 @@ 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(); diff --git a/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java b/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java index 3677d09..ad252fb 100644 --- a/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java +++ b/src/main/java/thetadev/constructionwand/basics/ReplacementRegistry.java @@ -16,6 +16,8 @@ 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<>(); From 4b04a9300e10f7289197af4b5a8681626fb087b5 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 19:38:07 +0200 Subject: [PATCH 08/29] bump version to 2.8 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ee1507b..c960830 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,4 @@ botania=1.18.2-430-SNAPSHOT jei_version=11.1.1.239 version_major=2 -version_minor=7 \ No newline at end of file +version_minor=8 \ No newline at end of file From 24eca43bb3824574660feb1b6d5f901df593d9b2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:15:07 +0200 Subject: [PATCH 09/29] update minecraft to 1.19.1 --- gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index c960830..8df594a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19 -forgeversion=41.1.0 +mcversion=1.19.1 +forgeversion=42.0.9 mcp_channel=official -mcp_mappings=1.19 +mcp_mappings=1.19.1 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.18.2-430-SNAPSHOT # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=11.1.1.239 +jei_version=11.2.0.244 version_major=2 version_minor=8 \ No newline at end of file From 373be90a2e87871219bbaeb4fccca3c4773998ed Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:21:07 +0200 Subject: [PATCH 10/29] update minecraft to 1.19.2 --- build.gradle | 6 +++--- gradle.properties | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 018b104..3677e2b 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" - compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" - // runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" + compileOnly "mezz.jei:jei-${jei_mcversion}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${jei_mcversion}-forge-api:${jei_version}" + // runtimeOnly "mezz.jei:jei-${jei_mcversion}-forge:${jei_version}" compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 8df594a..0b17c87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.1 -forgeversion=42.0.9 +mcversion=1.19.2 +forgeversion=43.0.2 mcp_channel=official -mcp_mappings=1.19.1 +mcp_mappings=1.19.2 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.18.2-430-SNAPSHOT # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ +jei_mcversion=1.19.1 jei_version=11.2.0.244 version_major=2 From de61ff8fd64e6c1b9cd3506e024add41de03c3d9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:22:47 +0200 Subject: [PATCH 11/29] fix dedicated server crash --- src/main/java/thetadev/constructionwand/items/ModItems.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/thetadev/constructionwand/items/ModItems.java b/src/main/java/thetadev/constructionwand/items/ModItems.java index eb31a12..407ee63 100644 --- a/src/main/java/thetadev/constructionwand/items/ModItems.java +++ b/src/main/java/thetadev/constructionwand/items/ModItems.java @@ -68,6 +68,7 @@ public class ModItems } } + @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void registerItemColors(RegisterColorHandlersEvent.Item event) { for(RegistryObject itemSupplier : WANDS) { From 312d7597f94613b702dc16c33ab49770c541a848 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:28:52 +0200 Subject: [PATCH 12/29] Revert "update minecraft to 1.19.2" This reverts commit 373be90a2e87871219bbaeb4fccca3c4773998ed. --- build.gradle | 6 +++--- gradle.properties | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 3677e2b..018b104 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly "mezz.jei:jei-${jei_mcversion}-common-api:${jei_version}" - compileOnly "mezz.jei:jei-${jei_mcversion}-forge-api:${jei_version}" - // runtimeOnly "mezz.jei:jei-${jei_mcversion}-forge:${jei_version}" + compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" + // runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 0b17c87..8df594a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,14 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.2 -forgeversion=43.0.2 +mcversion=1.19.1 +forgeversion=42.0.9 mcp_channel=official -mcp_mappings=1.19.2 +mcp_mappings=1.19.1 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.18.2-430-SNAPSHOT # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_mcversion=1.19.1 jei_version=11.2.0.244 version_major=2 From 44f1b531ec11b961cc6417fb538e4cb4108835a8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:39:54 +0200 Subject: [PATCH 13/29] add notes --- notes/Builds.md | 13 +++++++++++++ notes/test_command.md | 7 +++++++ 2 files changed, 20 insertions(+) create mode 100644 notes/Builds.md create mode 100644 notes/test_command.md diff --git a/notes/Builds.md b/notes/Builds.md new file mode 100644 index 0000000..e59877b --- /dev/null +++ b/notes/Builds.md @@ -0,0 +1,13 @@ +# 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 new file mode 100644 index 0000000..27c6d43 --- /dev/null +++ b/notes/test_command.md @@ -0,0 +1,7 @@ +# 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: + +``` +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}]}}]} +``` From 61a95fcd1e3c51b039f9961b0acdeef4fc2dddca Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 9 Aug 2022 20:46:11 +0200 Subject: [PATCH 14/29] add explaination to notes --- notes/test_command.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/notes/test_command.md b/notes/test_command.md index 27c6d43..c31679e 100644 --- a/notes/test_command.md +++ b/notes/test_command.md @@ -1,6 +1,10 @@ # 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}]}}]} From 379285dbfecd01deb089ee638b647df0e22aafdd Mon Sep 17 00:00:00 2001 From: FITFC <101124415+FITFC@users.noreply.github.com> Date: Sat, 29 Oct 2022 17:19:59 -0500 Subject: [PATCH 15/29] added pt_br.json --- .../assets/constructionwand/lang/pt_br.json | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/resources/assets/constructionwand/lang/pt_br.json diff --git a/src/main/resources/assets/constructionwand/lang/pt_br.json b/src/main/resources/assets/constructionwand/lang/pt_br.json new file mode 100644 index 0000000..b4c06aa --- /dev/null +++ b/src/main/resources/assets/constructionwand/lang/pt_br.json @@ -0,0 +1,70 @@ +{ + "item.constructionwand.stone_wand": "Varinha de pedra", + "item.constructionwand.iron_wand": "Varinha de ferro", + "item.constructionwand.diamond_wand": "diamondWand", + "item.constructionwand.infinity_wand": "Varinha infinita", + "item.constructionwand.core_angel": "Angel Wand Core", + "item.constructionwand.core_destruction": "Destruction Wand Core", + + "constructionwand.tooltip.blocks": "Max. %d blocos", + "constructionwand.tooltip.shift": "Pressione Shift]", + "constructionwand.tooltip.cores": "Núcleos de varinhas:", + "constructionwand.tooltip.core_tip": "Combine o núcleo com sua varinha em uma grade de criação", + + "constructionwand.option.cores": "", + "constructionwand.option.cores.constructionwand:default": "Núcleo de construção", + "constructionwand.option.cores.constructionwand:default.desc": "Estender seu prédio do lado de frente para você", + "constructionwand.option.cores.constructionwand:core_angel": "§6angelCore", + "constructionwand.option.cores.constructionwand:core_angel.desc": "Coloque atrás dos quarteirões e no meio do ar", + "constructionwand.option.cores.constructionwand:core_destruction": "§cNúcleo de destruição", + "constructionwand.option.cores.constructionwand:core_destruction.desc": "Destrói blocos do lado de frente para você", + + "constructionwand.option.lock": "Restrição: ", + "constructionwand.option.lock.horizontal": "§aEsquerda direita", + "constructionwand.option.lock.horizontal.desc": "Construa uma coluna horizontal em frente ao bloco original", + "constructionwand.option.lock.vertical": "§aCima baixo", + "constructionwand.option.lock.vertical.desc": "Construa uma coluna vertical em frente ao bloco original", + "constructionwand.option.lock.northsouth": "§6Norte Sul", + "constructionwand.option.lock.northsouth.desc": "Construa uma linha na direção N/s no topo do bloco original", + "constructionwand.option.lock.eastwest": "§6Leste Oeste", + "constructionwand.option.lock.eastwest.desc": "Construa uma linha na direção E/W no topo do bloco original", + "constructionwand.option.lock.nolock": "§cNenhum", + "constructionwand.option.lock.nolock.desc": "Estender de qualquer lado do bloco original", + + "constructionwand.option.direction": "Direção: ", + "constructionwand.option.direction.target": "§6Alvo", + "constructionwand.option.direction.target.desc": "Coloque blocos com a mesma direção que o bloco de destino", + "constructionwand.option.direction.player": "§aJogadora", + "constructionwand.option.direction.player.desc": "Coloque blocos de frente para o jogador", + + "constructionwand.option.replace": "Substituição: ", + "constructionwand.option.replace.yes": "§aSim", + "constructionwand.option.replace.yes.desc": "Substitua certos blocos como fluidos, neve e capim alto", + "constructionwand.option.replace.no": "§cNão", + "constructionwand.option.replace.no.desc": "Não substitua blocos", + + "constructionwand.option.match": "Coincidindo: ", + "constructionwand.option.match.exact": "§aExata", + "constructionwand.option.match.exact.desc": "Estender apenas blocos que são exatamente iguais", + "constructionwand.option.match.similar": "§6Semelhante", + "constructionwand.option.match.similar.desc": "Tratar blocos semelhantes (tipos de sujeira/grama) igualmente", + "constructionwand.option.match.any": "§cAlguma", + "constructionwand.option.match.any.desc": "Estender qualquer bloco", + + "constructionwand.option.random": "Aleatório: ", + "constructionwand.option.random.yes": "§aSim", + "constructionwand.option.random.yes.desc": "Coloque blocos aleatórios presentes em seu hotbar", + "constructionwand.option.random.no": "§cNão", + "constructionwand.option.random.no.desc": "Não randomize blocos colocados", + + "constructionwand.description.wand": "o %1$s pode colocar até %2$d bloqueios ao lado de um prédio de frente para você e dura %3$s.\n\nCalma %5$s e role para alterar a restrição de posicionamento (horizontal, vertical, norte/sul, leste/oeste, sem fechadura).\n\nAbra a tela de opção com %6$s§9+Clique com o botão direito do mouse§0.\n\n§5§nDESFAZER§0§r\nMantendo pressionada §9Esgueirar-se+§0%4$s Enquanto olha para um bloco, mostrará os últimos blocos que você colocou com uma borda verde ao redor deles. §9Esgueirar-se+§0%4$s§9+Certa clicando§0 Qualquer um deles desfazerá a operação, oferecendo todos os itens de volta.Se você usou o núcleo de destruição, ele restaurará os blocos.\n\n§5§nRECIPIENTES§0§r\nCaixas Shulker, pacotes e muitos contêineres de outros mods podem fornecer blocos de construção para a varinha.\n\n§5§nPrioridade imediata§0§r\nTer blocos em sua mão os colocará em vez do bloco que você está olhando.", + "constructionwand.description.durability.limited": "por %d blocos", + "constructionwand.description.durability.unlimited": "para todo sempre", + "constructionwand.description.key.sneak": "Esgueirar-se", + "constructionwand.description.key.sneak_opt": "Esgueirar-se+%s", + "constructionwand.description.core": "§5§nINSTALAÇÃO§0§r\nColoque seu novo núcleo junto com sua varinha em uma grade de criação para instalá -la.Para alternar entre núcleos, mantenha pressionado %s e o clique esquerdo, esvazie o espaço com sua varinha ou use a tela de opção.", + "constructionwand.description.core_angel": "O núcleo do anjo coloca um bloco no lado oposto do bloco (ou fileira de blocos) que você está enfrentando.A distância máxima depende da camada de varinha.Clique com o botão direito do mouse em espaço vazio para colocar um bloco no ar.Para fazer isso, você precisará ter o bloco que deseja colocar em sua mão.", + "constructionwand.description.core_destruction": "O núcleo de destruição destrói blocos (sem entidades de ladrilhos) do lado de frente para você.O número máximo de blocos depende da camada de varinha.Blocos destruídos desaparecem no vazio, você pode usar o recurso de desfazer se cometer um erro.", + + "stat.constructionwand.use_wand": "Blocos colocados usando varinha" + } \ No newline at end of file From 00e621da71af678803c56ba4263d60474f777980 Mon Sep 17 00:00:00 2001 From: mango_buff <106330917+buff-mango@users.noreply.github.com> Date: Thu, 24 Nov 2022 09:53:40 +0800 Subject: [PATCH 16/29] Create zh_cn.json --- .../assets/constructionwand/lang/zh_cn.json | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/resources/assets/constructionwand/lang/zh_cn.json diff --git a/src/main/resources/assets/constructionwand/lang/zh_cn.json b/src/main/resources/assets/constructionwand/lang/zh_cn.json new file mode 100644 index 0000000..013bf8a --- /dev/null +++ b/src/main/resources/assets/constructionwand/lang/zh_cn.json @@ -0,0 +1,70 @@ +{ + "item.constructionwand.stone_wand": "石制手杖", + "item.constructionwand.iron_wand": "铁制手杖", + "item.constructionwand.diamond_wand": "钻石手杖", + "item.constructionwand.infinity_wand": "无尽手杖", + "item.constructionwand.core_angel": "天使手杖核心", + "item.constructionwand.core_destruction": "破坏手杖核心", + + "constructionwand.tooltip.blocks": "最多放置%d个方块", + "constructionwand.tooltip.shift": "按 [SHIFT]", + "constructionwand.tooltip.cores": "手杖核心:", + "constructionwand.tooltip.core_tip": "将手杖核心与手杖组合在一起", + + "constructionwand.option.cores": "", + "constructionwand.option.cores.constructionwand:default": "建筑核心", + "constructionwand.option.cores.constructionwand:default.desc": "在面向你的一侧放置方块", + "constructionwand.option.cores.constructionwand:core_angel": "§6天使核心", + "constructionwand.option.cores.constructionwand:core_angel.desc": "在面向你的方块的背面放置方块,还可以悬空放置方块", + "constructionwand.option.cores.constructionwand:core_destruction": "§c毁灭核心", + "constructionwand.option.cores.constructionwand:core_destruction.desc": "破坏面向你一侧的方块", + + "constructionwand.option.lock": "锁定: ", + "constructionwand.option.lock.horizontal": "§a左 / 右", + "constructionwand.option.lock.horizontal.desc": "在起始方块的前面延伸一行水平方块", + "constructionwand.option.lock.vertical": "§a上 / 下", + "constructionwand.option.lock.vertical.desc": "在起始方块的前面延伸一列竖直方块", + "constructionwand.option.lock.northsouth": "§6南 / 北", + "constructionwand.option.lock.northsouth.desc": "在起始方块的上面,向南 / 北方向延伸一行", + "constructionwand.option.lock.eastwest": "§6东 / 西", + "constructionwand.option.lock.eastwest.desc": "在起始方块的上面,向东 / 西方向延伸一行", + "constructionwand.option.lock.nolock": "§c无", + "constructionwand.option.lock.nolock.desc": "从原始块的任意一面延伸", + + "constructionwand.option.direction": "方向: ", + "constructionwand.option.direction.target": "§6目标", + "constructionwand.option.direction.target.desc": "放置与的方块方向与目标方块的方向相同", + "constructionwand.option.direction.player": "§a玩家", + "constructionwand.option.direction.player.desc": "放置的方块面向玩家", + + "constructionwand.option.replace": "替换: ", + "constructionwand.option.replace.yes": "§a是", + "constructionwand.option.replace.yes.desc": "替换某些方块,如液体、雪、高草丛", + "constructionwand.option.replace.no": "§c否", + "constructionwand.option.replace.no.desc": "不替换方块", + + "constructionwand.option.match": "匹配: ", + "constructionwand.option.match.exact": "§a精确", + "constructionwand.option.match.exact.desc": "仅放置完全相同的方块", + "constructionwand.option.match.similar": "§6模糊", + "constructionwand.option.match.similar.desc": "相似的方块被认为是相同的(草方块 / 泥土类型)", + "constructionwand.option.match.any": "§c任意", + "constructionwand.option.match.any.desc": "放置任何方块", + + "constructionwand.option.random": "随机: ", + "constructionwand.option.random.yes": "§a是", + "constructionwand.option.random.yes.desc": "随机放置快捷栏中的方块", + "constructionwand.option.random.no": "§c否", + "constructionwand.option.random.no.desc": "不会随机放置方块", + + "constructionwand.description.wand": "%1$s可以在建筑物面向你的一侧放置最多%2$d个方块,持续时间为%3$s。\n\n按住%5$s并滚动以更改放置限制(水平、垂直、北/南、东/西、无锁定)。\n\n在选项配置GUI上打开%6$s§9+右键单击§0。\n\n§5§nUNDO§0§r\n在查看方块时向下折叠§9Sneak+§0%4$s将显示你放置的最后一个方块,并在其周围加上绿色边框。§9潜行+§0%4$s§9+右键单击其中任何一个方块将撤消操作,并将所有以此法放置的方块重返至玩家背包。如果你使用了破坏核心,它将恢复方块。\n\n§5§n容器§0§r\n潜影盒、收纳袋和许多其它模组存在于玩家背包内的容器都可以为建筑手杖提供构建所需的方块。\n\n§5§非即时优先级§0§r\n如果玩家在使用手杖时副手栏持有所需方块将被放置,而不是只是在你的手里放着。", + "constructionwand.description.durability.limited": "需要%d方块", + "constructionwand.description.durability.unlimited": "无限", + "constructionwand.description.key.sneak": "潜行", + "constructionwand.description.key.sneak_opt": "潜行+%s", + "constructionwand.description.core": "§5§n安装§0§r\n将新的手杖核心与你的手杖一起放入工作台中进行组装。如果你想要在核心功能之间切换,请按住%s并用手杖左键单击空地或使用手杖的选项配置GUI。", + "constructionwand.description.core_angel": "天使核心可将一个方块放置在你所面对的方块(或一排方块)的对面。最大距离取决于手杖材质。在空地上手持手杖并单击鼠标右键即可在空中放置方块。要做到这一点。你需要将想要被在空中放置的方块放在你的副手栏中。", + "constructionwand.description.core_destruction": "毁灭核心会破坏面向你一侧的方块(破坏时被破坏的方块不可存在实体)。最大破坏方块数取决于手杖材质。被使用毁灭核心破坏的方块会消失。如果你只是不小心使用了毁灭核心。可以使用“撤消”功能以撤回被破坏并消失的物品返回原处。", + + "stat.constructionwand.use_wand": "使用建筑手杖所放置的方块" +} From 36de8df509a41c05306406a54be5b192ea44790c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 12 Feb 2023 17:07:04 +0100 Subject: [PATCH 17/29] update Forge, fix compatibility with 1.19 Botania API --- README.md | 20 +++++++++---------- build.gradle | 2 +- gradle.properties | 12 +++++------ .../containers/handlers/HandlerBotania.java | 10 +++++----- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index a1263e3..492de6f 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. -![](images/wands.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/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.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) +![](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) ## 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.15/images/options.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/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.15/images/placedir.png) +![](https://raw.githubusercontent.com/Theta-Dev/ConstructionWand/1.19/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.16.2/src/main/java/thetadev/constructionwand/basics/ConfigServer.java#L28) +(it is located at https://github.com/Theta-Dev/ConstructionWand/blob/1.19/src/main/java/thetadev/constructionwand/basics/ConfigServer.java#L25) and making a PR. ## Contributions and #Hacktoberfest diff --git a/build.gradle b/build.gradle index 018b104..581c846 100644 --- a/build.gradle +++ b/build.gradle @@ -129,7 +129,7 @@ dependencies { compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" - // runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" + runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 8df594a..1dbca89 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.1 -forgeversion=42.0.9 +mcversion=1.19.2 +forgeversion=43.2.4 mcp_channel=official -mcp_mappings=1.19.1 +mcp_mappings=1.19.2 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ -botania=1.18.2-430-SNAPSHOT +botania=1.19.2-437-FORGE # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=11.2.0.244 +jei_version=11.5.0.297 version_major=2 -version_minor=8 \ No newline at end of file +version_minor=9 \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerBotania.java index 8ffb651..880f57d 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.IBlockProvider; +import vazkii.botania.api.item.BlockProvider; 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; - IBlockProvider prov = provOptional.get(); + BlockProvider 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; - IBlockProvider prov = provOptional.get(); + BlockProvider prov = provOptional.get(); if(prov.provideBlock(player, inventoryStack, Block.byItem(itemStack.getItem()), true)) return 0; return count; From 91c6901706e84ac2945f0a7ace7f9309fb5a761f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 12 Feb 2023 17:15:42 +0100 Subject: [PATCH 18/29] fix: replace deprecated `CapabilityItemHandler` --- .../containers/handlers/HandlerCapability.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java b/src/main/java/thetadev/constructionwand/containers/handlers/HandlerCapability.java index d67ae0e..c4a85cc 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.items.CapabilityItemHandler; +import net.minecraftforge.common.capabilities.ForgeCapabilities; 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(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).isPresent(); + return inventoryStack != null && inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent(); } @Override public int countItems(Player player, ItemStack itemStack, ItemStack inventoryStack) { - Optional itemHandlerOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); + Optional itemHandlerOptional = inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).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(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); + Optional itemHandlerOptional = inventoryStack.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve(); if(itemHandlerOptional.isEmpty()) return 0; IItemHandler itemHandler = itemHandlerOptional.get(); From c53845ced973c1d821ce625ee5767e3c67be84e8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 12 Feb 2023 17:47:50 +0100 Subject: [PATCH 19/29] fix: wands not breaking when out of durability --- src/main/java/thetadev/constructionwand/wand/WandJob.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/thetadev/constructionwand/wand/WandJob.java b/src/main/java/thetadev/constructionwand/wand/WandJob.java index b35f6f6..b294afa 100644 --- a/src/main/java/thetadev/constructionwand/wand/WandJob.java +++ b/src/main/java/thetadev/constructionwand/wand/WandJob.java @@ -1,8 +1,8 @@ package thetadev.constructionwand.wand; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -99,7 +99,7 @@ public class WandJob // If the item cant be taken, undo the placement if(wandSupplier.takeItemStack(snapshot.getRequiredItems()) == 0) { executed.add(snapshot); - wand.hurt(1, player.getRandom(), (ServerPlayer) player); + wand.hurtAndBreak(1, player, e -> e.broadcastBreakEvent(InteractionHand.MAIN_HAND)); } else { ConstructionWand.LOGGER.info("Item could not be taken. Remove block: " + From 345e1ac30a81b648719e0ad855a5cecaf3c880ab Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 12 Feb 2023 18:37:22 +0100 Subject: [PATCH 20/29] update forge and mcp for MC 1.19.3 --- gradle.properties | 6 +++--- src/main/resources/META-INF/mods.toml | 6 +++--- src/main/resources/pack.mcmeta | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1dbca89..5132f5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,10 +4,10 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.2 -forgeversion=43.2.4 +mcversion=1.19.3 +forgeversion=44.1.16 mcp_channel=official -mcp_mappings=1.19.2 +mcp_mappings=1.19.3 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.19.2-437-FORGE diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 57fb332..490e6fc 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[41,)" +loaderVersion = "[44,)" 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 = "[41,)" +versionRange = "[44,)" ordering = "NONE" side="BOTH" [[dependencies.constructionwand]] modId="minecraft" mandatory = true -versionRange = "[1.19, 1.20)" +versionRange = "[1.19.3, 1.20)" ordering = "NONE" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 2b3d665..d2fbf90 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,8 +1,8 @@ { "pack": { "description": "ConstructionWand resources", - "pack_format": 9, - "forge:resource_pack_format": 9, + "pack_format": 12, + "forge:resource_pack_format": 12, "forge:data_pack_format": 10 } } From bbae6c943d78de954ae5e959f0c8426b597a204d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 12 Feb 2023 23:08:37 +0100 Subject: [PATCH 21/29] ported to 1.19.3 --- build.gradle | 6 ++--- gradle.properties | 1 + .../constructionwand/basics/ModStats.java | 3 ++- .../constructionwand/client/ScreenWand.java | 23 ++++++++----------- .../crafting/RecipeWandUpgrade.java | 9 ++++---- .../data/ItemModelGenerator.java | 6 ++--- .../constructionwand/data/ModData.java | 6 +++-- .../data/RecipeGenerator.java | 23 ++++++++----------- .../constructionwand/items/ModItems.java | 20 +++++++++++++--- 9 files changed, 54 insertions(+), 43 deletions(-) diff --git a/build.gradle b/build.gradle index 581c846..3677e2b 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" - compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" - runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" + compileOnly "mezz.jei:jei-${jei_mcversion}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${jei_mcversion}-forge-api:${jei_version}" + // runtimeOnly "mezz.jei:jei-${jei_mcversion}-forge:${jei_version}" compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 5132f5b..5fb5315 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,6 +13,7 @@ mcp_mappings=1.19.3 botania=1.19.2-437-FORGE # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ jei_version=11.5.0.297 +jei_mcversion=1.19.2 version_major=2 version_minor=9 \ No newline at end of file diff --git a/src/main/java/thetadev/constructionwand/basics/ModStats.java b/src/main/java/thetadev/constructionwand/basics/ModStats.java index ccfa739..84b5063 100644 --- a/src/main/java/thetadev/constructionwand/basics/ModStats.java +++ b/src/main/java/thetadev/constructionwand/basics/ModStats.java @@ -1,6 +1,7 @@ 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; @@ -16,7 +17,7 @@ public class ModStats private static void registerStat(ResourceLocation registryName) { // Compare with net.minecraft.stats.Stats#registerCustom - Registry.register(Registry.CUSTOM_STAT, registryName.getPath(), registryName); + Registry.register(BuiltInRegistries.CUSTOM_STAT, registryName.getPath(), registryName); Stats.CUSTOM.get(registryName, StatFormatter.DEFAULT); } } diff --git a/src/main/java/thetadev/constructionwand/client/ScreenWand.java b/src/main/java/thetadev/constructionwand/client/ScreenWand.java index 8151c03..d52c319 100644 --- a/src/main/java/thetadev/constructionwand/client/ScreenWand.java +++ b/src/main/java/thetadev/constructionwand/client/ScreenWand.java @@ -3,6 +3,7 @@ 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.world.item.ItemStack; @@ -13,8 +14,7 @@ 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; @@ -53,18 +53,21 @@ public class ScreenWand extends Screen @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if(Minecraft.getInstance().options.keyInventory.matches(keyCode, scanCode)) { + if (Minecraft.getInstance().options.keyInventory.matches(keyCode, scanCode)) { this.onClose(); return true; - } - else { + } else { return super.keyPressed(keyCode, scanCode, modifiers); } } private void createButton(int cx, int cy, IOption option) { - 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 button = Button.builder(getButtonLabel(option), bt -> clickButton(bt, option)) + .pos(getX(cx), getY(cy)) + .size(BUTTON_WIDTH, BUTTON_HEIGHT) + .tooltip(Tooltip.create(Component.translatable(option.getDescTranslation()))) + .build(); + button.active = option.isEnabled(); addRenderableWidget(button); } @@ -75,12 +78,6 @@ public class ScreenWand extends Screen button.setMessage(getButtonLabel(option)); } - private void drawTooltip(PoseStack matrixStack, int mouseX, int mouseY, IOption option) { - if(isMouseOver(mouseX, mouseY)) { - renderTooltip(matrixStack, Component.translatable(option.getDescTranslation()), mouseX, mouseY); - } - } - private int getX(int n) { return width / 2 - FIELD_WIDTH / 2 + n * (BUTTON_WIDTH + SPACING_WIDTH); } diff --git a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java index 7fafdaf..0cde3e2 100644 --- a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java +++ b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java @@ -3,9 +3,10 @@ package thetadev.constructionwand.crafting; 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.SimpleRecipeSerializer; +import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; import net.minecraft.world.level.Level; import thetadev.constructionwand.api.IWandUpgrade; import thetadev.constructionwand.basics.ConfigServer; @@ -16,10 +17,10 @@ import javax.annotation.Nonnull; public class RecipeWandUpgrade extends CustomRecipe { - public static final SimpleRecipeSerializer SERIALIZER = new SimpleRecipeSerializer<>(RecipeWandUpgrade::new); + public static final SimpleCraftingRecipeSerializer SERIALIZER = new SimpleCraftingRecipeSerializer<>(RecipeWandUpgrade::new); - public RecipeWandUpgrade(ResourceLocation resourceLocation) { - super(resourceLocation); + public RecipeWandUpgrade(ResourceLocation resourceLocation, CraftingBookCategory category) { + super(resourceLocation, category); } @Override diff --git a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java index 771fec2..2562634 100644 --- a/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/ItemModelGenerator.java @@ -1,6 +1,6 @@ package thetadev.constructionwand.data; -import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraftforge.client.model.generators.ItemModelProvider; @@ -14,8 +14,8 @@ import javax.annotation.Nonnull; public class ItemModelGenerator extends ItemModelProvider { - public ItemModelGenerator(DataGenerator generator, ExistingFileHelper existingFileHelper) { - super(generator, ConstructionWand.MODID, existingFileHelper); + public ItemModelGenerator(PackOutput packOutput, ExistingFileHelper existingFileHelper) { + super(packOutput, ConstructionWand.MODID, existingFileHelper); } @Override diff --git a/src/main/java/thetadev/constructionwand/data/ModData.java b/src/main/java/thetadev/constructionwand/data/ModData.java index c35f123..7b5719f 100644 --- a/src/main/java/thetadev/constructionwand/data/ModData.java +++ b/src/main/java/thetadev/constructionwand/data/ModData.java @@ -1,6 +1,7 @@ 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; @@ -12,14 +13,15 @@ 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(generator)); + generator.addProvider(true, new RecipeGenerator(packOutput)); } if(event.includeClient()) { - generator.addProvider(true, new ItemModelGenerator(generator, fileHelper)); + generator.addProvider(true, new ItemModelGenerator(packOutput, fileHelper)); } } } diff --git a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java index aaff00c..1319f4c 100644 --- a/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java +++ b/src/main/java/thetadev/constructionwand/data/RecipeGenerator.java @@ -1,14 +1,15 @@ package thetadev.constructionwand.data; -import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; 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.SimpleRecipeSerializer; +import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.Tags; import net.minecraftforge.registries.ForgeRegistries; @@ -21,12 +22,12 @@ import java.util.function.Consumer; public class RecipeGenerator extends RecipeProvider { - public RecipeGenerator(DataGenerator generatorIn) { - super(generatorIn); + public RecipeGenerator(PackOutput packOutput) { + super(packOutput); } @Override - protected void buildCraftingRecipes(@Nonnull Consumer consumer) { + protected void buildRecipes(@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)); @@ -39,7 +40,7 @@ public class RecipeGenerator extends RecipeProvider } private void wandRecipe(Consumer consumer, ItemLike wand, Inp material) { - ShapedRecipeBuilder.shaped(wand) + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, wand) .define('X', material.ingredient) .define('#', Tags.Items.RODS_WOODEN) .pattern(" X") @@ -50,7 +51,7 @@ public class RecipeGenerator extends RecipeProvider } private void coreRecipe(Consumer consumer, ItemLike core, Inp item1, Inp item2) { - ShapedRecipeBuilder.shaped(core) + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, core) .define('O', item1.ingredient) .define('X', item2.ingredient) .define('#', Tags.Items.GLASS_PANES) @@ -61,14 +62,8 @@ public class RecipeGenerator extends RecipeProvider .save(consumer); } - private void specialRecipe(Consumer consumer, SimpleRecipeSerializer serializer) { + private void specialRecipe(Consumer consumer, SimpleCraftingRecipeSerializer 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/items/ModItems.java b/src/main/java/thetadev/constructionwand/items/ModItems.java index 407ee63..26b6300 100644 --- a/src/main/java/thetadev/constructionwand/items/ModItems.java +++ b/src/main/java/thetadev/constructionwand/items/ModItems.java @@ -1,12 +1,13 @@ package thetadev.constructionwand.items; import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; import net.minecraft.world.item.Tiers; 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.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.DeferredRegister; @@ -42,11 +43,11 @@ public class ModItems public static final RegistryObject[] CORES = new RegistryObject[] {CORE_ANGEL, CORE_DESTRUCTION}; public static Item.Properties propWand() { - return new Item.Properties().tab(CreativeModeTab.TAB_TOOLS); + return new Item.Properties(); } private static Item.Properties propUpgrade() { - return new Item.Properties().tab(CreativeModeTab.TAB_MISC).stacksTo(1); + return new Item.Properties().stacksTo(1); } @SubscribeEvent @@ -77,4 +78,17 @@ public class ModItems 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); + } + } + } } From fcd2307db86a54bcca053cd307b3d5e81057612a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Feb 2023 21:31:46 +0100 Subject: [PATCH 22/29] update jei dependency --- build.gradle | 6 +++--- gradle.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 581c846..7f7cd6b 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly "mezz.jei:jei-${mcversion}-common-api:${jei_version}" - compileOnly "mezz.jei:jei-${mcversion}-forge-api:${jei_version}" - runtimeOnly "mezz.jei:jei-${mcversion}-forge:${jei_version}" + 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([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 1dbca89..29a7ed9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ mcp_mappings=1.19.2 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.19.2-437-FORGE # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_version=11.5.0.297 +jei_version=11.5.2.1007 version_major=2 version_minor=9 \ No newline at end of file From 2df42cd134bb9b492c686322b33654fd6e21dc49 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Feb 2023 21:47:40 +0100 Subject: [PATCH 23/29] fix: gui tooltip updates --- .../java/thetadev/constructionwand/client/ScreenWand.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/thetadev/constructionwand/client/ScreenWand.java b/src/main/java/thetadev/constructionwand/client/ScreenWand.java index d52c319..0a546ae 100644 --- a/src/main/java/thetadev/constructionwand/client/ScreenWand.java +++ b/src/main/java/thetadev/constructionwand/client/ScreenWand.java @@ -65,7 +65,7 @@ public class ScreenWand extends Screen { Button button = Button.builder(getButtonLabel(option), bt -> clickButton(bt, option)) .pos(getX(cx), getY(cy)) .size(BUTTON_WIDTH, BUTTON_HEIGHT) - .tooltip(Tooltip.create(Component.translatable(option.getDescTranslation()))) + .tooltip(getButtonTooltip(option)) .build(); button.active = option.isEnabled(); @@ -76,6 +76,7 @@ public class ScreenWand extends Screen { option.next(); ConstructionWand.instance.HANDLER.sendToServer(new PacketWandOption(option, false)); button.setMessage(getButtonLabel(option)); + button.setTooltip(getButtonTooltip(option)); } private int getX(int n) { @@ -89,4 +90,8 @@ 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())); + } } From f78cc3078a389064db2bef5c21c5dee8457a0fdd Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Mar 2023 01:26:20 +0100 Subject: [PATCH 24/29] fix: JEI wand info showing raw translation key --- .../integrations/jei/ConstructionWandJeiPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java index db46ea1..6886b59 100644 --- a/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java +++ b/src/main/java/thetadev/constructionwand/integrations/jei/ConstructionWandJeiPlugin.java @@ -53,7 +53,8 @@ public class ConstructionWandJeiPlugin implements IModPlugin Component durabilityComponent = Component.translatable(baseKey + "durability." + durabilityKey, wandProperties.getDurability()); registration.addIngredientInfo(new ItemStack(wand), VanillaTypes.ITEM_STACK, - Component.translatable(baseKey + "wand", baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath(), + Component.translatable(baseKey + "wand", + Component.translatable(baseKeyItem + ForgeRegistries.ITEMS.getKey(wand).getPath()), wandProperties.getLimit(), durabilityComponent, optkeyComponent, wandModeComponent, wandGuiComponent) ); } @@ -62,6 +63,7 @@ public class ConstructionWandJeiPlugin implements IModPlugin 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)) ); } From 9e3fb14b7246396d4295960f1643b8ba7284cfee Mon Sep 17 00:00:00 2001 From: Heimdallr-1 Date: Tue, 21 Mar 2023 23:36:29 +0500 Subject: [PATCH 25/29] Create ru_ru.json The necessary information such as Stone wand, iron wand or infinity wand is not displayed in the key "construction and.description.and": "%1$s --- .../assets/constructionwand/lang/ru_ru.json | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/resources/assets/constructionwand/lang/ru_ru.json diff --git a/src/main/resources/assets/constructionwand/lang/ru_ru.json b/src/main/resources/assets/constructionwand/lang/ru_ru.json new file mode 100644 index 0000000..5e7ec8c --- /dev/null +++ b/src/main/resources/assets/constructionwand/lang/ru_ru.json @@ -0,0 +1,70 @@ +{ + "item.constructionwand.stone_wand": "Каменный жезл", + "item.constructionwand.iron_wand": "Железный жезл", + "item.constructionwand.diamond_wand": "Алмазный жезл", + "item.constructionwand.infinity_wand": "Бесконечный жезл", + "item.constructionwand.core_angel": "Ангельское ядро для жезла", + "item.constructionwand.core_destruction": "Ядро разрушения для жезла", + + "constructionwand.tooltip.blocks": "Максимум %d блоков", + "constructionwand.tooltip.shift": "Нажмите [SHIFT]", + "constructionwand.tooltip.cores": "Ядер жезла:", + "constructionwand.tooltip.core_tip": "Объедините ядро со своим жезлом в сетке создания.", + + "constructionwand.option.cores": "", + "constructionwand.option.cores.constructionwand:default": "Ядро строительства", + "constructionwand.option.cores.constructionwand:default.desc": "Расширяйте свои строения на стороне, обращённой к Вам.", + "constructionwand.option.cores.constructionwand:core_angel": "§6Ангельское ядро", + "constructionwand.option.cores.constructionwand:core_angel.desc": "Размещает за блоками и в воздухе.", + "constructionwand.option.cores.constructionwand:core_destruction": "§cЯдро разрушения", + "constructionwand.option.cores.constructionwand:core_destruction.desc": "Уничтожает блоки на стороне, обращённой к Вам.", + + "constructionwand.option.lock": "Ограничение: ", + "constructionwand.option.lock.horizontal": "§aВлево/Вправо", + "constructionwand.option.lock.horizontal.desc": "Строить горизонтальную колонну перед основным блоком.", + "constructionwand.option.lock.vertical": "§aВверх/Вниз", + "constructionwand.option.lock.vertical.desc": "Строить вертикальную колонну перед основным блоком.", + "constructionwand.option.lock.northsouth": "§6Север/Юг", + "constructionwand.option.lock.northsouth.desc": "Строить ряд в С/Ю направлении непосредственно за основным блоком.", + "constructionwand.option.lock.eastwest": "§6Восток/Запад", + "constructionwand.option.lock.eastwest.desc": "Строить ряд в В/З направлении непосредственно за основным блоком.", + "constructionwand.option.lock.nolock": "§cНичего", + "constructionwand.option.lock.nolock.desc": "Расширять с любой стороны основного блока.", + + "constructionwand.option.direction": "Направление: ", + "constructionwand.option.direction.target": "§6Цель", + "constructionwand.option.direction.target.desc": "Размещать блоки с таким же направлением как целевой блок.", + "constructionwand.option.direction.player": "§aИгрок", + "constructionwand.option.direction.player.desc": "Размещать блоки, обращённые к игроку.", + + "constructionwand.option.replace": "Замена: ", + "constructionwand.option.replace.yes": "§aДа", + "constructionwand.option.replace.yes.desc": "Заменять некоторые блоки как жидкости, снег и высокорослая трава.", + "constructionwand.option.replace.no": "§cНет", + "constructionwand.option.replace.no.desc": "Не заменять блоки.", + + "constructionwand.option.match": "Совпадение: ", + "constructionwand.option.match.exact": "§aТочное", + "constructionwand.option.match.exact.desc": "Расширять только абсолютно одинаковые блоки.", + "constructionwand.option.match.similar": "§6Похожее", + "constructionwand.option.match.similar.desc": "Подносить аналогичные блоки (пример: земля/трава) поровну.", + "constructionwand.option.match.any": "§cНикакое", + "constructionwand.option.match.any.desc": "Расширять любой блок.", + + "constructionwand.option.random": "Случайно: ", + "constructionwand.option.random.yes": "§aДа", + "constructionwand.option.random.yes.desc": "Размещать случайные блоки, имеющиеся в Вашей горячей панели.", + "constructionwand.option.random.no": "§cНет", + "constructionwand.option.random.no.desc": "Не располагать блоки в случайном порядке.", + + "constructionwand.description.wand": "%1$s может размещать до %2$d блоков сбоку от строения, обращённое к Вам и его хватит на %3$s блоков.\n\nУдерживайте %5$s и прокрутите колёсиком для изменения ограничения по размещении (Горизонтально, Вертикально, Север/Юг, Восток/Запад, Без ограничивания).\n\nОткройте экран настроек при помощи %6$s§9+щелчок правой кнопкой мыши§0.\n\n§5§nОТМЕНА§0§r\nУдерживайте §9Приседание+§0%4$s пока смотрите на блоки, установленные Вами, они будут выделены зелёным контуром. §9Приседание+§0%4$s§9+щелчок правой кнопкой мыши§0 на любой из них отменит операцию, вернув Вам все предметы обратно. Если использовать Ядро разрушения, то он вернёт блоки.\n\n§5§nКОНТЕЙНЕР§0§r\nШалкеровые ящики, мешки и множество контейнеров из других модов могут предоставлять строительные блоки в жезл.\n\n§5§nПРИОРИТЕТ ЛЕВОЙ РУКИ§0§r\nЕсли у Вас в левой руке находятся блоки, то они будут размещаться вместо блока, на который Вы смотрите.", + "constructionwand.description.durability.limited": "на %d блоков", + "constructionwand.description.durability.unlimited": "вечно", + "constructionwand.description.key.sneak": "Приседание", + "constructionwand.description.key.sneak_opt": "Приседание+%s", + "constructionwand.description.core": "§5§nУСТАНОВКА§0§r\nПоложите своё новое ядро вместе со своим жезлом в сетку создания для его установки. Для того, чтобы переключаться между ядрами, удерживайте %s и нажмите левую кнопку мыши по пустому пространству с жезлом в руке или используйте экран настроек.", + "constructionwand.description.core_angel": "Ангельское ядро размещает блоки на противоположной стороне блока (или ряда блоков), обращённые к Вам. Максимальное расстояние зависит от уровня жезла. Щелчок правой кнопкой мыши по пустому воздуху разместит блок в воздухе. Чтобы это сделать, Вам нужно иметь необходимые блоки в левой руке, чтобы разместить их.", + "constructionwand.description.core_destruction": "Ядро разрушения разрушает блоки (не функциональные блоки), обращённые к Вам. Максимально количество блоков зависит от уровня жезла. Разрушенные блоки исчезают в пустоту, можно использовать функцию отмены в случае допущенной ошибки.", + + "stat.constructionwand.use_wand": "Блоки, размещённые при помощи Жезла" +} From 25ecaa5c9bf5363a51ae7cc07556512755ae470f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Mar 2023 01:38:52 +0100 Subject: [PATCH 26/29] bump version to 2.10 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6d08199..fc6f0d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,4 @@ botania=1.19.2-437-FORGE jei_version=12.2.0.16 version_major=2 -version_minor=9 \ No newline at end of file +version_minor=10 \ No newline at end of file From 9f6344e7b22256cbfef862b2abf3a6c241770014 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Mar 2023 21:54:02 +0100 Subject: [PATCH 27/29] ported to MC 1.19.4 --- build.gradle | 6 +++--- gradle.properties | 7 ++++--- .../java/thetadev/constructionwand/basics/WandUtil.java | 5 +++-- .../constructionwand/crafting/RecipeWandUpgrade.java | 3 ++- .../thetadev/constructionwand/items/wand/ItemWand.java | 2 +- src/main/java/thetadev/constructionwand/wand/WandJob.java | 3 +-- .../thetadev/constructionwand/wand/action/ActionAngel.java | 3 +-- .../thetadev/constructionwand/wand/undo/UndoHistory.java | 3 +-- src/main/resources/META-INF/mods.toml | 6 +++--- src/main/resources/pack.mcmeta | 6 +++--- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/build.gradle b/build.gradle index 7f7cd6b..3ec844d 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ 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-${jei_mcversion}-common-api:${jei_version}") + compileOnly fg.deobf("mezz.jei:jei-${jei_mcversion}-forge-api:${jei_version}") + // runtimeOnly fg.deobf("mezz.jei:jei-${jei_mcversion}-forge:${jei_version}") compileOnly fg.deobf([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index fc6f0d7..82d3b74 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,15 @@ org.gradle.daemon=false author=thetadev modid=constructionwand -mcversion=1.19.3 -forgeversion=44.1.16 +mcversion=1.19.4 +forgeversion=45.0.23 mcp_channel=official -mcp_mappings=1.19.3 +mcp_mappings=1.19.4 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.19.2-437-FORGE # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ +jei_mcversion=1.19.3 jei_version=12.2.0.16 version_major=2 diff --git a/src/main/java/thetadev/constructionwand/basics/WandUtil.java b/src/main/java/thetadev/constructionwand/basics/WandUtil.java index b0fb1e9..a0571a5 100644 --- a/src/main/java/thetadev/constructionwand/basics/WandUtil.java +++ b/src/main/java/thetadev/constructionwand/basics/WandUtil.java @@ -53,8 +53,9 @@ public class WandUtil return null; } - public static BlockPos playerPos(Player player) { - return new BlockPos(player.position()); + 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 Vec3 entityPositionVec(Entity entity) { diff --git a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java index 0cde3e2..4b0c6e4 100644 --- a/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java +++ b/src/main/java/thetadev/constructionwand/crafting/RecipeWandUpgrade.java @@ -1,5 +1,6 @@ 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; @@ -44,7 +45,7 @@ public class RecipeWandUpgrade extends CustomRecipe @Nonnull @Override - public ItemStack assemble(@Nonnull CraftingContainer inv) { + public ItemStack assemble(@Nonnull CraftingContainer inv, @Nonnull RegistryAccess registryAccess) { ItemStack wand = null; IWandUpgrade upgrade = null; diff --git a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java index 7071048..69f1b12 100644 --- a/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java +++ b/src/main/java/thetadev/constructionwand/items/wand/ItemWand.java @@ -66,7 +66,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()), WandUtil.playerPos(player)), stack); + WandUtil.fromVector(player.getLookAngle()), player.blockPosition()), stack); return job.doIt() ? InteractionResultHolder.success(stack) : InteractionResultHolder.fail(stack); } return InteractionResultHolder.fail(stack); diff --git a/src/main/java/thetadev/constructionwand/wand/WandJob.java b/src/main/java/thetadev/constructionwand/wand/WandJob.java index b294afa..6ef8e44 100644 --- a/src/main/java/thetadev/constructionwand/wand/WandJob.java +++ b/src/main/java/thetadev/constructionwand/wand/WandJob.java @@ -16,7 +16,6 @@ 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; @@ -115,7 +114,7 @@ public class WandJob // Play place sound if(!placeSnapshots.isEmpty()) { SoundType sound = placeSnapshots.get(0).getBlockState().getSoundType(); - world.playSound(null, WandUtil.playerPos(player), sound.getPlaceSound(), SoundSource.BLOCKS, sound.volume, sound.pitch); + world.playSound(null, player.blockPosition(), 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 36033ab..194e2c7 100644 --- a/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java +++ b/src/main/java/thetadev/constructionwand/wand/action/ActionAngel.java @@ -60,8 +60,7 @@ 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 = new BlockPos(placeVec); + BlockPos currentPos = WandUtil.posFromVec(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/UndoHistory.java b/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java index 9443df5..2aa9fed 100644 --- a/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java +++ b/src/main/java/thetadev/constructionwand/wand/undo/UndoHistory.java @@ -11,7 +11,6 @@ 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.*; @@ -142,7 +141,7 @@ public class UndoHistory // Play teleport sound SoundEvent sound = SoundEvents.CHORUS_FRUIT_TELEPORT; - world.playSound(null, WandUtil.playerPos(player), sound, SoundSource.PLAYERS, 1.0F, 1.0F); + world.playSound(null, player.blockPosition(), 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 490e6fc..d6e6e9f 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[44,)" +loaderVersion = "[45,)" 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 = "[44,)" +versionRange = "[45,)" ordering = "NONE" side="BOTH" [[dependencies.constructionwand]] modId="minecraft" mandatory = true -versionRange = "[1.19.3, 1.20)" +versionRange = "[1.19.4, 1.20)" ordering = "NONE" side="BOTH" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index d2fbf90..2f824a3 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,8 +1,8 @@ { "pack": { "description": "ConstructionWand resources", - "pack_format": 12, - "forge:resource_pack_format": 12, - "forge:data_pack_format": 10 + "pack_format": 13, + "forge:resource_pack_format": 13, + "forge:data_pack_format": 12 } } From 12b29cc185d582bda4298ea49cc0038a2e7c21b6 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Mar 2023 23:33:28 +0100 Subject: [PATCH 28/29] fix: 1-block previews on consecutive placements --- .../constructionwand/client/RenderBlockPreview.java | 12 ++++++++++-- .../java/thetadev/constructionwand/wand/WandJob.java | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java b/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java index 39cb2c1..8ce9ab7 100644 --- a/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java +++ b/src/main/java/thetadev/constructionwand/client/RenderBlockPreview.java @@ -22,7 +22,7 @@ import java.util.Set; public class RenderBlockPreview { - public WandJob wandJob; + private WandJob wandJob; public Set undoBlocks; @SubscribeEvent @@ -39,7 +39,11 @@ public class RenderBlockPreview if(wand == null) return; if(!(player.isCrouching() && ClientEvents.isOptKeyDown())) { - if(wandJob == null || !compareRTR(wandJob.rayTraceResult, rtr) || !(wandJob.wand.equals(wand))) { + // Use cached wandJob for previews of the same target pos/dir + // Exception: always update if blockCount < 2 to prevent 1-block previews when block updates + // from the last placement are lagging + if(wandJob == null || !compareRTR(wandJob.rayTraceResult, rtr) || !(wandJob.wand.equals(wand)) + || wandJob.blockCount() < 2) { wandJob = ItemWand.getWandJob(player, player.level, rtr, wand); } blocks = wandJob.getBlockPositions(); @@ -68,6 +72,10 @@ 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/wand/WandJob.java b/src/main/java/thetadev/constructionwand/wand/WandJob.java index 6ef8e44..958f60d 100644 --- a/src/main/java/thetadev/constructionwand/wand/WandJob.java +++ b/src/main/java/thetadev/constructionwand/wand/WandJob.java @@ -86,6 +86,10 @@ public class WandJob return placeSnapshots.stream().map(ISnapshot::getPos).collect(Collectors.toSet()); } + public int blockCount() { + return placeSnapshots.size(); + } + public boolean doIt() { ArrayList executed = new ArrayList<>(); From eebfbf27456de3098f80c8596561832d4d86e4b2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 5 Apr 2023 17:53:40 +0200 Subject: [PATCH 29/29] update JEI dependency to 1.19.4 --- build.gradle | 6 +++--- gradle.properties | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 3ec844d..7f7cd6b 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { version: "${project.mcversion}-${project.forgeversion}" ]) - compileOnly fg.deobf("mezz.jei:jei-${jei_mcversion}-common-api:${jei_version}") - compileOnly fg.deobf("mezz.jei:jei-${jei_mcversion}-forge-api:${jei_version}") - // runtimeOnly fg.deobf("mezz.jei:jei-${jei_mcversion}-forge:${jei_version}") + 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([ group: "vazkii.botania", diff --git a/gradle.properties b/gradle.properties index 82d3b74..bf09a07 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,8 +12,7 @@ mcp_mappings=1.19.4 # Source: https://maven.blamejared.com/vazkii/botania/Botania/ botania=1.19.2-437-FORGE # Source: https://dvs1.progwml6.com/files/maven/mezz/jei/ -jei_mcversion=1.19.3 -jei_version=12.2.0.16 +jei_version=13.1.0.2 version_major=2 version_minor=10 \ No newline at end of file