From 9721537ca42b127cd36b6091d70b13ac218318c1 Mon Sep 17 00:00:00 2001 From: Micle Date: Thu, 3 Nov 2022 20:59:10 +0000 Subject: [PATCH] Initial port of 1.18.2-2.0.2 to 1.19.2. --- .gitignore | 6 + LICENSE | 2 + build.gradle | 112 ++++++++ gradle.properties | 14 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 ++++++++++++++++ gradlew.bat | 89 ++++++ settings.gradle | 1 + .../models/item/diamond_charge.json | 6 + .../models/item/diamond_totem.json | 6 + .../models/item/iron_charge.json | 6 + .../models/item/iron_totem.json | 6 + .../models/item/netherite_charge.json | 6 + .../models/item/netherite_totem.json | 6 + .../models/item/straw_charge.json | 6 + .../models/item/straw_totem.json | 6 + .../totemofreviving/diamond_charge.json | 34 +++ .../totemofreviving/diamond_totem.json | 34 +++ .../recipes/totemofreviving/iron_charge.json | 34 +++ .../recipes/totemofreviving/iron_totem.json | 34 +++ .../totemofreviving/netherite_charge.json | 34 +++ .../totemofreviving/netherite_totem.json | 34 +++ .../recipes/totemofreviving/straw_charge.json | 34 +++ .../recipes/totemofreviving/straw_totem.json | 34 +++ .../recipes/diamond_charge.json | 25 ++ .../recipes/diamond_totem.json | 22 ++ .../totemofreviving/recipes/iron_charge.json | 22 ++ .../totemofreviving/recipes/iron_totem.json | 22 ++ .../recipes/netherite_charge.json | 22 ++ .../recipes/netherite_totem.json | 25 ++ .../totemofreviving/recipes/straw_charge.json | 22 ++ .../totemofreviving/recipes/straw_totem.json | 25 ++ .../totemofreviving/TotemOfReviving.java | 54 ++++ .../totemofreviving/data/DataGenerators.java | 22 ++ .../data/ModRecipeProvider.java | 99 +++++++ .../data/client/ModItemModelProvider.java | 41 +++ .../item/charge/ChargeItem.java | 49 ++++ .../item/charge/DiamondChargeItem.java | 13 + .../item/charge/IronChargeItem.java | 9 + .../item/charge/NetheriteChargeItem.java | 13 + .../item/charge/StrawChargeItem.java | 13 + .../item/crafting/ChargeRecipe.java | 33 +++ .../item/crafting/ExtendedShapedRecipe.java | 88 ++++++ .../crafting/ExtendedShapedRecipeBuilder.java | 185 +++++++++++++ .../item/crafting/TotemRecipe.java | 33 +++ .../item/totem/DiamondTotemItem.java | 21 ++ .../item/totem/IronTotemItem.java | 20 ++ .../item/totem/NetheriteTotemItem.java | 26 ++ .../item/totem/StrawTotemItem.java | 21 ++ .../totemofreviving/item/totem/TotemItem.java | 259 ++++++++++++++++++ .../network/NetworkManager.java | 44 +++ .../network/client/ChangeTargetPacket.java | 54 ++++ .../network/client/ChargeTotemPacket.java | 44 +++ .../network/client/ReviveTargetPacket.java | 72 +++++ .../micle/totemofreviving/proxy/IProxy.java | 11 + .../micle/totemofreviving/proxy/Proxy.java | 112 ++++++++ .../micle/totemofreviving/setup/Config.java | 95 +++++++ .../micle/totemofreviving/setup/ModItems.java | 26 ++ .../totemofreviving/setup/ModKeyMappings.java | 9 + .../totemofreviving/setup/ModRecipes.java | 16 ++ .../totemofreviving/setup/Registration.java | 31 +++ src/main/resources/META-INF/mods.toml | 58 ++++ .../assets/totemofreviving/lang/en_us.json | 12 + .../textures/item/diamond_charge.png | Bin 0 -> 259 bytes .../textures/item/diamond_totem.png | Bin 0 -> 287 bytes .../textures/item/iron_charge.png | Bin 0 -> 721 bytes .../textures/item/iron_totem.png | Bin 0 -> 826 bytes .../textures/item/netherite_charge.png | Bin 0 -> 741 bytes .../textures/item/netherite_totem.png | Bin 0 -> 836 bytes .../textures/item/straw_charge.png | Bin 0 -> 753 bytes .../textures/item/straw_totem.png | Bin 0 -> 5803 bytes src/main/resources/logo.jpg | Bin 0 -> 100332 bytes src/main/resources/pack.mcmeta | 6 + 74 files changed, 2557 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/iron_charge.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/iron_totem.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/straw_charge.json create mode 100644 src/generated/resources/assets/totemofreviving/models/item/straw_totem.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_charge.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_totem.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_charge.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_totem.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_charge.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_totem.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_charge.json create mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_totem.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/diamond_charge.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/diamond_totem.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/iron_charge.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/iron_totem.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/netherite_charge.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/netherite_totem.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/straw_charge.json create mode 100644 src/generated/resources/data/totemofreviving/recipes/straw_totem.json create mode 100644 src/main/java/dev/micle/totemofreviving/TotemOfReviving.java create mode 100644 src/main/java/dev/micle/totemofreviving/data/DataGenerators.java create mode 100644 src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java create mode 100644 src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/crafting/ChargeRecipe.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipe.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipeBuilder.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/crafting/TotemRecipe.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java create mode 100644 src/main/java/dev/micle/totemofreviving/network/NetworkManager.java create mode 100644 src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java create mode 100644 src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java create mode 100644 src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java create mode 100644 src/main/java/dev/micle/totemofreviving/proxy/IProxy.java create mode 100644 src/main/java/dev/micle/totemofreviving/proxy/Proxy.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/Config.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/ModItems.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/ModRecipes.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/Registration.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/totemofreviving/lang/en_us.json create mode 100644 src/main/resources/assets/totemofreviving/textures/item/diamond_charge.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/diamond_totem.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/iron_charge.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/iron_totem.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/netherite_charge.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/netherite_totem.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/straw_charge.png create mode 100644 src/main/resources/assets/totemofreviving/textures/item/straw_totem.png create mode 100644 src/main/resources/logo.jpg create mode 100644 src/main/resources/pack.mcmeta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f83c7f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.gradle/ +/.idea/ +/build/ +/run/ +/src/test/ +/src/generated/resources/.cache/cache diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5739720 --- /dev/null +++ b/LICENSE @@ -0,0 +1,2 @@ +Copyright (c) 2022 Micle +All rights reserved. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c0b2fab --- /dev/null +++ b/build.gradle @@ -0,0 +1,112 @@ +buildscript { + repositories { + // These repositories are only for Gradle plugins, put any other repositories in the repository block further below + maven { url = 'https://maven.minecraftforge.net' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + } +} + +apply plugin: 'net.minecraftforge.gradle' + +def archiveVersion = "${project.mcVersion}-${project.buildVersion}" as Object + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +minecraft { + mappings channel: 'official', version: mcVersion + + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + runs { + client { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + mods { + totemofreviving { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + mods { + totemofreviving { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + args '--mod', 'totemofreviving', '--all', + '--existing', file('src/main/resources').toString(), + '--existing', file('src/generated/resources').toString(), + '--output', file('src/generated/resources/') + + mods { + totemofreviving { + source sourceSets.main + } + } + } + } +} + +sourceSets.main.resources { + srcDir 'src/generated/resources' +} + +repositories { + maven { + name = "Progwml6 maven" + url = "https://dvs1.progwml6.com/files/maven/" + } + maven { + name = "ModMaven" + url = "https://modmaven.dev" + } +} + +dependencies { + minecraft "net.minecraftforge:forge:${project.mcVersion}-${project.forgeVersion}" + + // JEI + if (project.hasProperty('jeiVersion')) { + // compile against JEI API but do not include it at runtime + compileOnly fg.deobf("mezz.jei:jei-${project.mcVersion}-forge-api:${project.jeiVersion}") + // at runtime, use full JEI jar + runtimeOnly fg.deobf("mezz.jei:jei-${project.mcVersion}-forge:${project.jeiVersion}") + } +} + +jar { + archiveFileName = "${project.archivesBaseName}-${archiveVersion}.jar" + manifest { + attributes([ + "Specification-Title" : project.name, + "Specification-Vendor" : project.author, + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Vendor" : project.author, + "Implementation-Version" : archiveVersion, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +jar.finalizedBy('reobfJar') \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..6360ac7 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,14 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +group = dev.micle +archivesBaseName = micles-totem-of-reviving-forge +modID = totemofreviving +name = Micle's Totem of Reviving +author = Micle + +buildVersion = 2.0.0 +mcVersion = 1.19.2 +forgeVersion = 43.1.47 + +jeiVersion = 11.+ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..aa991fc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +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 new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# 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 +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 + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +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 + +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 ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + 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 +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..fcddfba --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'TotemOfReviving-1.19' diff --git a/src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json b/src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json new file mode 100644 index 0000000..5cbfbd2 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/diamond_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json b/src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json new file mode 100644 index 0000000..295aaa1 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/diamond_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/iron_charge.json b/src/generated/resources/assets/totemofreviving/models/item/iron_charge.json new file mode 100644 index 0000000..6341d17 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/iron_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/iron_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/iron_totem.json b/src/generated/resources/assets/totemofreviving/models/item/iron_totem.json new file mode 100644 index 0000000..60d6d4f --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/iron_totem.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/iron_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json b/src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json new file mode 100644 index 0000000..cbab895 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/netherite_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json b/src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json new file mode 100644 index 0000000..cdd587e --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/netherite_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/straw_charge.json b/src/generated/resources/assets/totemofreviving/models/item/straw_charge.json new file mode 100644 index 0000000..85c72a4 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/straw_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/straw_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/straw_totem.json b/src/generated/resources/assets/totemofreviving/models/item/straw_totem.json new file mode 100644 index 0000000..f8d8ea1 --- /dev/null +++ b/src/generated/resources/assets/totemofreviving/models/item/straw_totem.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "totemofreviving:item/straw_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_charge.json new file mode 100644 index 0000000..30f7066 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_charge.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:diamond_charge" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "totemofreviving:diamond_totem" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:diamond_charge" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_totem.json new file mode 100644 index 0000000..675d846 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/diamond_totem.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:diamond_totem" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:totem_of_undying" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:diamond_totem" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_charge.json new file mode 100644 index 0000000..c8524a5 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_charge.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:iron_charge" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "totemofreviving:iron_totem" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:iron_charge" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_totem.json new file mode 100644 index 0000000..c223cc3 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/iron_totem.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:iron_totem" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:emerald" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:iron_totem" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_charge.json new file mode 100644 index 0000000..83bc10b --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_charge.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:netherite_charge" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "totemofreviving:netherite_totem" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:netherite_charge" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_totem.json new file mode 100644 index 0000000..8ecf2c3 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/netherite_totem.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:netherite_totem" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_scrap" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:netherite_totem" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_charge.json new file mode 100644 index 0000000..ba74046 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_charge.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:straw_charge" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "totemofreviving:straw_totem" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:straw_charge" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_totem.json new file mode 100644 index 0000000..989ec4a --- /dev/null +++ b/src/generated/resources/data/totemofreviving/advancements/recipes/totemofreviving/straw_totem.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "totemofreviving:straw_totem" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:wheat" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "totemofreviving:straw_totem" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/diamond_charge.json b/src/generated/resources/data/totemofreviving/recipes/diamond_charge.json new file mode 100644 index 0000000..ff747ed --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/diamond_charge.json @@ -0,0 +1,25 @@ +{ + "type": "totemofreviving:charge_recipe", + "pattern": [ + "IDI", + "PEP", + "IDI" + ], + "key": { + "E": { + "item": "minecraft:emerald" + }, + "D": { + "item": "minecraft:diamond" + }, + "I": { + "item": "minecraft:iron_ingot" + }, + "P": { + "item": "minecraft:ender_pearl" + } + }, + "result": { + "item": "totemofreviving:diamond_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/diamond_totem.json b/src/generated/resources/data/totemofreviving/recipes/diamond_totem.json new file mode 100644 index 0000000..731576c --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/diamond_totem.json @@ -0,0 +1,22 @@ +{ + "type": "totemofreviving:totem_recipe", + "pattern": [ + "EDE", + "DTD", + "EDE" + ], + "key": { + "T": { + "item": "minecraft:totem_of_undying" + }, + "D": { + "item": "minecraft:diamond" + }, + "E": { + "item": "minecraft:ender_pearl" + } + }, + "result": { + "item": "totemofreviving:diamond_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/iron_charge.json b/src/generated/resources/data/totemofreviving/recipes/iron_charge.json new file mode 100644 index 0000000..d9047ba --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/iron_charge.json @@ -0,0 +1,22 @@ +{ + "type": "totemofreviving:charge_recipe", + "pattern": [ + "NIN", + "IEI", + "NIN" + ], + "key": { + "E": { + "item": "minecraft:emerald" + }, + "I": { + "item": "minecraft:iron_ingot" + }, + "N": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "totemofreviving:iron_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/iron_totem.json b/src/generated/resources/data/totemofreviving/recipes/iron_totem.json new file mode 100644 index 0000000..8633d2c --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/iron_totem.json @@ -0,0 +1,22 @@ +{ + "type": "totemofreviving:totem_recipe", + "pattern": [ + " E ", + "IBI", + " I " + ], + "key": { + "B": { + "item": "minecraft:iron_block" + }, + "E": { + "item": "minecraft:emerald" + }, + "I": { + "item": "minecraft:iron_ingot" + } + }, + "result": { + "item": "totemofreviving:iron_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/netherite_charge.json b/src/generated/resources/data/totemofreviving/recipes/netherite_charge.json new file mode 100644 index 0000000..1b247d3 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/netherite_charge.json @@ -0,0 +1,22 @@ +{ + "type": "totemofreviving:charge_recipe", + "pattern": [ + "GNG", + "NCN", + "GNG" + ], + "key": { + "C": { + "item": "totemofreviving:diamond_charge" + }, + "N": { + "item": "minecraft:netherite_scrap" + }, + "G": { + "item": "minecraft:gold_ingot" + } + }, + "result": { + "item": "totemofreviving:netherite_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/netherite_totem.json b/src/generated/resources/data/totemofreviving/recipes/netherite_totem.json new file mode 100644 index 0000000..5cf767e --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/netherite_totem.json @@ -0,0 +1,25 @@ +{ + "type": "totemofreviving:totem_recipe", + "pattern": [ + "BNB", + "NTN", + "BGB" + ], + "key": { + "T": { + "item": "totemofreviving:diamond_totem" + }, + "N": { + "item": "minecraft:netherite_scrap" + }, + "G": { + "item": "minecraft:gold_ingot" + }, + "B": { + "item": "minecraft:nether_brick" + } + }, + "result": { + "item": "totemofreviving:netherite_totem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/straw_charge.json b/src/generated/resources/data/totemofreviving/recipes/straw_charge.json new file mode 100644 index 0000000..875e21a --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/straw_charge.json @@ -0,0 +1,22 @@ +{ + "type": "totemofreviving:charge_recipe", + "pattern": [ + "NWN", + "WEW", + "NWN" + ], + "key": { + "E": { + "item": "minecraft:emerald" + }, + "W": { + "item": "minecraft:wheat" + }, + "N": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "totemofreviving:straw_charge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/straw_totem.json b/src/generated/resources/data/totemofreviving/recipes/straw_totem.json new file mode 100644 index 0000000..3c73d16 --- /dev/null +++ b/src/generated/resources/data/totemofreviving/recipes/straw_totem.json @@ -0,0 +1,25 @@ +{ + "type": "totemofreviving:totem_recipe", + "pattern": [ + "NSN", + "NWN", + "N|N" + ], + "key": { + "W": { + "item": "minecraft:wheat" + }, + "|": { + "item": "minecraft:stick" + }, + "S": { + "item": "minecraft:string" + }, + "N": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "totemofreviving:straw_totem" + } +} \ No newline at end of file diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java new file mode 100644 index 0000000..fbfd52c --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java @@ -0,0 +1,54 @@ +package dev.micle.totemofreviving; + +import dev.micle.totemofreviving.proxy.IProxy; +import dev.micle.totemofreviving.proxy.IProxy; +import dev.micle.totemofreviving.proxy.Proxy; +import dev.micle.totemofreviving.setup.ModItems; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; + +import java.util.Optional; + +@Mod(TotemOfReviving.MOD_ID) +public final class TotemOfReviving { + public static final String MOD_ID = "totemofreviving"; + public static final CreativeModeTab ITEM_GROUP = new CreativeModeTab(MOD_ID) { + @Override + public ItemStack makeIcon() { + return new ItemStack(ModItems.STRAW_TOTEM.get()); + } + }; + + private static IProxy proxy; + + public TotemOfReviving() { + proxy = DistExecutor.safeRunForDist( + () -> Proxy.Client::new, + () -> Proxy.Server::new + ); + } + + public static ResourceLocation createResourceLocation(String name) { + if (name.contains(":")) { + throw new IllegalArgumentException("Name contains namespace"); + } + return new ResourceLocation(MOD_ID, name); + } + + public static String getVersion() { + Optional optional = ModList.get().getModContainerById(MOD_ID); + if (optional.isPresent()) { + return optional.get().getModInfo().getVersion().toString(); + } + return "0.0.0"; + } + + public static IProxy getProxy() { + return proxy; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java b/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java new file mode 100644 index 0000000..59864e3 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java @@ -0,0 +1,22 @@ +package dev.micle.totemofreviving.data; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.data.client.ModItemModelProvider; +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.forge.event.lifecycle.GatherDataEvent; + +@Mod.EventBusSubscriber(modid = TotemOfReviving.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class DataGenerators { + @SubscribeEvent + public static void gatherData(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + + generator.addProvider(new ModItemModelProvider(generator, existingFileHelper)); + + generator.addProvider(new ModRecipeProvider(generator)); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java b/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java new file mode 100644 index 0000000..e49d560 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java @@ -0,0 +1,99 @@ +package dev.micle.totemofreviving.data; + +import dev.micle.totemofreviving.item.crafting.ExtendedShapedRecipeBuilder; +import dev.micle.totemofreviving.setup.ModItems; +import dev.micle.totemofreviving.setup.ModRecipes; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.world.item.Items; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.function.Consumer; + +public class ModRecipeProvider extends RecipeProvider { + public ModRecipeProvider(DataGenerator generator) { + super(generator); + } + + @Override + @ParametersAreNonnullByDefault + protected void buildCraftingRecipes(Consumer consumer) { + ExtendedShapedRecipeBuilder.shaped(ModRecipes.TOTEM_RECIPE.get(), ModItems.STRAW_TOTEM.get()) + .define('W', Items.WHEAT) + .define('|', Items.STICK) + .define('S', Items.STRING) + .define('N', Items.IRON_NUGGET) + .pattern("NSN") + .pattern("NWN") + .pattern("N|N") + .unlockedBy("has_item", has(Items.WHEAT)) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.TOTEM_RECIPE.get(), ModItems.IRON_TOTEM.get()) + .define('B', Items.IRON_BLOCK) + .define('E', Items.EMERALD) + .define('I', Items.IRON_INGOT) + .pattern(" E ") + .pattern("IBI") + .pattern(" I ") + .unlockedBy("has_item", has(Items.EMERALD)) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.TOTEM_RECIPE.get(), ModItems.DIAMOND_TOTEM.get()) + .define('T', Items.TOTEM_OF_UNDYING) + .define('D', Items.DIAMOND) + .define('E', Items.ENDER_PEARL) + .pattern("EDE") + .pattern("DTD") + .pattern("EDE") + .unlockedBy("has_item", has(Items.TOTEM_OF_UNDYING)) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.TOTEM_RECIPE.get(), ModItems.NETHERITE_TOTEM.get()) + .define('T', ModItems.DIAMOND_TOTEM.get()) + .define('N', Items.NETHERITE_SCRAP) + .define('G', Items.GOLD_INGOT) + .define('B', Items.NETHER_BRICK) + .pattern("BNB") + .pattern("NTN") + .pattern("BGB") + .unlockedBy("has_item", has(Items.NETHERITE_SCRAP)) + .save(consumer); + + ExtendedShapedRecipeBuilder.shaped(ModRecipes.CHARGE_RECIPE.get(), ModItems.STRAW_CHARGE.get()) + .define('E', Items.EMERALD) + .define('W', Items.WHEAT) + .define('N', Items.IRON_NUGGET) + .pattern("NWN") + .pattern("WEW") + .pattern("NWN") + .unlockedBy("has_item", has(ModItems.STRAW_TOTEM.get())) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.CHARGE_RECIPE.get(), ModItems.IRON_CHARGE.get()) + .define('E', Items.EMERALD) + .define('I', Items.IRON_INGOT) + .define('N', Items.IRON_NUGGET) + .pattern("NIN") + .pattern("IEI") + .pattern("NIN") + .unlockedBy("has_item", has(ModItems.IRON_TOTEM.get())) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.CHARGE_RECIPE.get(), ModItems.DIAMOND_CHARGE.get()) + .define('E', Items.EMERALD) + .define('D', Items.DIAMOND) + .define('I', Items.IRON_INGOT) + .define('P', Items.ENDER_PEARL) + .pattern("IDI") + .pattern("PEP") + .pattern("IDI") + .unlockedBy("has_item", has(ModItems.DIAMOND_TOTEM.get())) + .save(consumer); + ExtendedShapedRecipeBuilder.shaped(ModRecipes.CHARGE_RECIPE.get(), ModItems.NETHERITE_CHARGE.get()) + .define('C', ModItems.DIAMOND_CHARGE.get()) + .define('N', Items.NETHERITE_SCRAP) + .define('G', Items.GOLD_INGOT) + .pattern("GNG") + .pattern("NCN") + .pattern("GNG") + .unlockedBy("has_item", has(ModItems.NETHERITE_TOTEM.get())) + .save(consumer); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java b/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java new file mode 100644 index 0000000..e37fa0a --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java @@ -0,0 +1,41 @@ +package dev.micle.totemofreviving.data.client; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.item.charge.DiamondChargeItem; +import dev.micle.totemofreviving.item.charge.IronChargeItem; +import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; +import dev.micle.totemofreviving.item.charge.StrawChargeItem; +import dev.micle.totemofreviving.item.totem.DiamondTotemItem; +import dev.micle.totemofreviving.item.totem.IronTotemItem; +import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; +import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import net.minecraft.data.DataGenerator; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; + +public class ModItemModelProvider extends ItemModelProvider { + public ModItemModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { + super(generator, TotemOfReviving.MOD_ID, existingFileHelper); + } + + @Override + protected void registerModels() { + ModelFile itemGenerated = getExistingFile(mcLoc("item/generated")); + + builder(itemGenerated, StrawTotemItem.getName()); + builder(itemGenerated, IronTotemItem.getName()); + builder(itemGenerated, DiamondTotemItem.getName()); + builder(itemGenerated, NetheriteTotemItem.getName()); + + builder(itemGenerated, StrawChargeItem.getName()); + builder(itemGenerated, IronChargeItem.getName()); + builder(itemGenerated, DiamondChargeItem.getName()); + builder(itemGenerated, NetheriteChargeItem.getName()); + } + + private ItemModelBuilder builder(ModelFile itemGenerated, String name) { + return getBuilder(name).parent(itemGenerated).texture("layer0", "item/" + name); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java new file mode 100644 index 0000000..f6910a5 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java @@ -0,0 +1,49 @@ +package dev.micle.totemofreviving.item.charge; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.setup.Config; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; + +public class ChargeItem extends Item { + public ChargeItem() { + this(Rarity.COMMON); + } + + public ChargeItem(Rarity rarity) { + super(new Properties().tab(TotemOfReviving.ITEM_GROUP).stacksTo(64).rarity(rarity)); + } + + @Override + @OnlyIn(Dist.CLIENT) + @ParametersAreNonnullByDefault + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { + if (isEnabled(stack)) { + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Used for charging its corresponding totem.")); + } else { + tooltip.add(new TextComponent(ChatFormatting.RED + "Totem is disabled!")); + } + super.appendHoverText(stack, world, tooltip, tooltipFlag); + } + + public static boolean isEnabled(ItemStack stack) { + Item item = stack.getItem(); + if (item instanceof StrawChargeItem) { return Config.Server.getStrawTotemConfig().getIsEnabled(); } + if (item instanceof IronChargeItem) { return Config.Server.getIronTotemConfig().getIsEnabled(); } + if (item instanceof DiamondChargeItem) { return Config.Server.getDiamondTotemConfig().getIsEnabled(); } + if (item instanceof NetheriteChargeItem) { return Config.Server.getNetheriteTotemConfig().getIsEnabled(); } + return false; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java new file mode 100644 index 0000000..348ea84 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java @@ -0,0 +1,13 @@ +package dev.micle.totemofreviving.item.charge; + +import net.minecraft.world.item.Rarity; + +public class DiamondChargeItem extends ChargeItem { + public DiamondChargeItem() { + super(Rarity.RARE); + } + + public static String getName() { + return "diamond_charge"; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java new file mode 100644 index 0000000..c9f0443 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java @@ -0,0 +1,9 @@ +package dev.micle.totemofreviving.item.charge; + +public class IronChargeItem extends ChargeItem { + public IronChargeItem() {} + + public static String getName() { + return "iron_charge"; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java new file mode 100644 index 0000000..2795e51 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java @@ -0,0 +1,13 @@ +package dev.micle.totemofreviving.item.charge; + +import net.minecraft.world.item.Rarity; + +public class NetheriteChargeItem extends ChargeItem { + public NetheriteChargeItem() { + super(Rarity.EPIC); + } + + public static String getName() { + return "netherite_charge"; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java new file mode 100644 index 0000000..534a8f4 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java @@ -0,0 +1,13 @@ +package dev.micle.totemofreviving.item.charge; + +import net.minecraft.world.item.Rarity; + +public class StrawChargeItem extends ChargeItem { + public StrawChargeItem() { + super(Rarity.UNCOMMON); + } + + public static String getName() { + return "straw_charge"; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/crafting/ChargeRecipe.java b/src/main/java/dev/micle/totemofreviving/item/crafting/ChargeRecipe.java new file mode 100644 index 0000000..19c678e --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/crafting/ChargeRecipe.java @@ -0,0 +1,33 @@ +package dev.micle.totemofreviving.item.crafting; + +import dev.micle.totemofreviving.item.charge.ChargeItem; +import dev.micle.totemofreviving.setup.ModRecipes; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.level.Level; + +public class ChargeRecipe extends ExtendedShapedRecipe { + public ChargeRecipe(ShapedRecipe recipe) { + super(recipe); + } + + @Override + public RecipeSerializer getSerializer() { + return ModRecipes.CHARGE_RECIPE.get(); + } + + @Override + public boolean matches(CraftingContainer inventory, Level world) { + if (!ChargeItem.isEnabled(getResultItem())) { + return false; + } + return getBaseRecipe().matches(inventory, world); + } + + @Override + public ItemStack assemble(CraftingContainer inventory) { + return getBaseRecipe().getResultItem().copy(); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipe.java b/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipe.java new file mode 100644 index 0000000..9b5ed65 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipe.java @@ -0,0 +1,88 @@ +package dev.micle.totemofreviving.item.crafting; + +import com.google.gson.JsonObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistryEntry; + +import javax.annotation.Nullable; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public abstract class ExtendedShapedRecipe extends ShapedRecipe { + private static final RecipeSerializer BASE_SERIALIZER = RecipeSerializer.SHAPED_RECIPE; + + private final ShapedRecipe recipe; + + public ExtendedShapedRecipe(ShapedRecipe recipe) { + super(recipe.getId(), recipe.getGroup(), recipe.getRecipeWidth(), recipe.getRecipeHeight(), recipe.getIngredients(), recipe.getResultItem()); + this.recipe = recipe; + } + + public ShapedRecipe getBaseRecipe() { + return this.recipe; + } + + @Override + public abstract RecipeSerializer getSerializer(); + + @Override + public abstract boolean matches(CraftingContainer inventory, Level world); + + @Override + public abstract ItemStack assemble(CraftingContainer inventory); + + public static class Serializer extends ForgeRegistryEntry> implements RecipeSerializer { + private final Function recipeFactory; + @Nullable private final BiConsumer readJson; + @Nullable private final BiConsumer readBuffer; + @Nullable private final BiConsumer writeBuffer; + + public Serializer(Function recipeFactory, + @Nullable BiConsumer readJson, + @Nullable BiConsumer readBuffer, + @Nullable BiConsumer writeBuffer) { + this.recipeFactory = recipeFactory; + this.readJson = readJson; + this.readBuffer = readBuffer; + this.writeBuffer = writeBuffer; + } + + public static Serializer basic(Function recipeFactory) { + return new Serializer<>(recipeFactory, null, null, null); + } + + @Override + public T fromJson(ResourceLocation recipeId, JsonObject json) { + ShapedRecipe recipe = BASE_SERIALIZER.fromJson(recipeId, json); + T result = this.recipeFactory.apply(recipe); + if (this.readJson != null) { + this.readJson.accept(json, result); + } + return result; + } + + @Override + public T fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { + ShapedRecipe recipe = BASE_SERIALIZER.fromNetwork(recipeId, buffer); + T result = this.recipeFactory.apply(recipe); + if (this.readBuffer != null) { + this.readBuffer.accept(buffer, result); + } + return result; + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, T recipe) { + BASE_SERIALIZER.toNetwork(buffer, recipe.getBaseRecipe()); + if (this.writeBuffer != null) { + this.writeBuffer.accept(buffer, recipe); + } + } + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipeBuilder.java b/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipeBuilder.java new file mode 100644 index 0000000..10dac03 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/crafting/ExtendedShapedRecipeBuilder.java @@ -0,0 +1,185 @@ +package dev.micle.totemofreviving.item.crafting; + +import com.google.common.collect.Sets; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.CriterionTriggerInstance; +import net.minecraft.advancements.RequirementsStrategy; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.resources.ResourceLocation; +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.item.crafting.RecipeSerializer; +import net.minecraft.world.level.ItemLike; + +import javax.annotation.Nullable; +import java.util.*; +import java.util.function.Consumer; + +public class ExtendedShapedRecipeBuilder { + private final RecipeSerializer serializer; + private final Item result; + private final int count; + private final List pattern = new ArrayList<>(); + private final Map key = new LinkedHashMap<>(); + private final Advancement.Builder advancementBuilder = Advancement.Builder.advancement(); + private boolean hasAdvancementCriterion = false; + private String group = ""; + + private ExtendedShapedRecipeBuilder(RecipeSerializer serializer, ItemLike result, int count) { + this.serializer = serializer; + this.result = result.asItem(); + this.count = count; + } + + public static ExtendedShapedRecipeBuilder shaped(RecipeSerializer serializer, ItemLike result) { + return shaped(serializer, result, 1); + } + + public static ExtendedShapedRecipeBuilder shaped(RecipeSerializer serializer, ItemLike result, int count) { + return new ExtendedShapedRecipeBuilder(serializer, result, count); + } + + public ExtendedShapedRecipeBuilder define(Character symbol, TagKey tagIn) { + return this.define(symbol, Ingredient.of(tagIn)); + } + + public ExtendedShapedRecipeBuilder define(Character symbol, ItemLike itemIn) { + return this.define(symbol, Ingredient.of(itemIn)); + } + + public ExtendedShapedRecipeBuilder define(Character symbol, Ingredient ingredientIn) { + if (this.key.containsKey(symbol)) { + throw new IllegalArgumentException("Symbol '" + symbol + "' is already defined!"); + } else if (symbol == ' ') { + throw new IllegalArgumentException("Symbol ' ' (whitespace) is reserved and cannot be defined"); + } else { + this.key.put(symbol, ingredientIn); + return this; + } + } + + public ExtendedShapedRecipeBuilder pattern(String patternIn) { + if (!this.pattern.isEmpty() && patternIn.length() != this.pattern.get(0).length()) { + throw new IllegalArgumentException("Pattern must be the same width on every line!"); + } else { + this.pattern.add(patternIn); + return this; + } + } + + public ExtendedShapedRecipeBuilder unlockedBy(String name, CriterionTriggerInstance criterionIn) { + this.advancementBuilder.addCriterion(name, criterionIn); + this.hasAdvancementCriterion = true; + return this; + } + + public ExtendedShapedRecipeBuilder group(String groupIn) { + this.group = groupIn; + return this; + } + + public void save(Consumer consumer) { + save(consumer, this.result.getRegistryName()); + } + + public void save(Consumer consumer, ResourceLocation id) { + this.validate(id); + if (this.hasAdvancementCriterion && !this.advancementBuilder.getCriteria().isEmpty()) { + this.advancementBuilder.parent(new ResourceLocation("recipes/root")) + .addCriterion("has_the_recipe", new RecipeUnlockedTrigger.TriggerInstance(EntityPredicate.Composite.ANY, id)) + .rewards(AdvancementRewards.Builder.recipe(id)) + .requirements(RequirementsStrategy.OR); + } + ResourceLocation advancementId = new ResourceLocation(id.getNamespace(), "recipes/" + this.result.getItemCategory().getRecipeFolderName() + "/" + id.getPath()); + consumer.accept(new Result(id, this, advancementId)); + } + + private void validate(ResourceLocation id) { + if (this.pattern.isEmpty()) { + throw new IllegalStateException("No pattern is defined for shaped recipe " + id + "!"); + } else { + Set set = Sets.newHashSet(this.key.keySet()); + set.remove(' '); + + for (String s : this.pattern) { + for (int i = 0; i < s.length(); ++i) { + char c0 = s.charAt(i); + if (!this.key.containsKey(c0) && c0 != ' ') { + throw new IllegalStateException("Pattern in recipe " + id + " uses undefined symbol '" + c0 + "'"); + } + + set.remove(c0); + } + } + + if (!set.isEmpty()) { + throw new IllegalStateException("Ingredients are defined but not used in pattern for recipe " + id); + } else if (this.pattern.size() == 1 && this.pattern.get(0).length() == 1) { + throw new IllegalStateException("Shaped recipe " + id + " only takes in a single item - should it be a shapeless recipe instead?"); + } + } + } + + public static class Result implements FinishedRecipe { + private final ResourceLocation id; + private final ExtendedShapedRecipeBuilder builder; + private final ResourceLocation advancementId; + + public Result(ResourceLocation id, ExtendedShapedRecipeBuilder builder, ResourceLocation advancementId) { + this.id = id; + this.builder = builder; + this.advancementId = advancementId; + } + + @Override + public void serializeRecipeData(JsonObject json) { + if (!builder.group.isEmpty()) { + json.addProperty("group", builder.group); + } + + JsonArray pattern = new JsonArray(); + builder.pattern.forEach(pattern::add); + json.add("pattern", pattern); + + JsonObject key = new JsonObject(); + builder.key.forEach((c, ingredient) -> key.add(String.valueOf(c), ingredient.toJson())); + json.add("key", key); + + JsonObject result = new JsonObject(); + result.addProperty("item", builder.result.getRegistryName().toString()); + if (builder.count > 1) { + result.addProperty("count", builder.count); + } + json.add("result", result); + } + + @Override + public RecipeSerializer getType() { + return builder.serializer; + } + + @Override + public ResourceLocation getId() { + return id; + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return builder.hasAdvancementCriterion ? builder.advancementBuilder.serializeToJson() : null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return builder.hasAdvancementCriterion ? advancementId : null; + } + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/crafting/TotemRecipe.java b/src/main/java/dev/micle/totemofreviving/item/crafting/TotemRecipe.java new file mode 100644 index 0000000..d613313 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/crafting/TotemRecipe.java @@ -0,0 +1,33 @@ +package dev.micle.totemofreviving.item.crafting; + +import dev.micle.totemofreviving.item.totem.TotemItem; +import dev.micle.totemofreviving.setup.ModRecipes; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.level.Level; + +public class TotemRecipe extends ExtendedShapedRecipe { + public TotemRecipe(ShapedRecipe recipe) { + super(recipe); + } + + @Override + public RecipeSerializer getSerializer() { + return ModRecipes.TOTEM_RECIPE.get(); + } + + @Override + public boolean matches(CraftingContainer inventory, Level world) { + if (!TotemItem.isEnabled(getResultItem())) { + return false; + } + return getBaseRecipe().matches(inventory, world); + } + + @Override + public ItemStack assemble(CraftingContainer inventory) { + return getBaseRecipe().getResultItem().copy(); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java new file mode 100644 index 0000000..e77e299 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java @@ -0,0 +1,21 @@ +package dev.micle.totemofreviving.item.totem; + +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.item.charge.DiamondChargeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; + +public class DiamondTotemItem extends TotemItem { + public DiamondTotemItem() { + super(Rarity.RARE, Config.Server.getDiamondTotemConfig().getDurability()); + } + + public static String getName() { + return "diamond_totem"; + } + + @Override + public boolean isCharge(ItemStack stack) { + return (stack.getItem() instanceof DiamondChargeItem); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java new file mode 100644 index 0000000..5487a86 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java @@ -0,0 +1,20 @@ +package dev.micle.totemofreviving.item.totem; + +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.item.charge.IronChargeItem; +import net.minecraft.world.item.ItemStack; + +public class IronTotemItem extends TotemItem { + public IronTotemItem() { + super(Config.Server.getIronTotemConfig().getDurability()); + } + + public static String getName() { + return "iron_totem"; + } + + @Override + public boolean isCharge(ItemStack stack) { + return (stack.getItem() instanceof IronChargeItem); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java new file mode 100644 index 0000000..c904156 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java @@ -0,0 +1,26 @@ +package dev.micle.totemofreviving.item.totem; + +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; + +public class NetheriteTotemItem extends TotemItem { + public NetheriteTotemItem() { + super(Rarity.EPIC, Config.Server.getNetheriteTotemConfig().getDurability()); + } + + public static String getName() { + return "netherite_totem"; + } + + @Override + public boolean isCharge(ItemStack stack) { + return (stack.getItem() instanceof NetheriteChargeItem); + } + + @Override + public boolean isFireResistant() { + return true; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java new file mode 100644 index 0000000..a03eb24 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java @@ -0,0 +1,21 @@ +package dev.micle.totemofreviving.item.totem; + +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.item.charge.StrawChargeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; + +public class StrawTotemItem extends TotemItem { + public StrawTotemItem() { + super(Rarity.UNCOMMON, Config.Server.getStrawTotemConfig().getDurability()); + } + + public static String getName() { + return "straw_totem"; + } + + @Override + public boolean isCharge(ItemStack stack) { + return (stack.getItem() instanceof StrawChargeItem); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java new file mode 100644 index 0000000..fbd32e3 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -0,0 +1,259 @@ +package dev.micle.totemofreviving.item.totem; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.network.client.ChangeTargetPacket; +import dev.micle.totemofreviving.network.client.ChargeTotemPacket; +import dev.micle.totemofreviving.network.NetworkManager; +import dev.micle.totemofreviving.network.client.ReviveTargetPacket; +import dev.micle.totemofreviving.setup.ModKeyMappings; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +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.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; +import java.util.UUID; + +public abstract class TotemItem extends Item { + private static final String TAG_TARGET_INDEX = "target_index"; + private static final String TAG_TARGET_UUID = "target_uuid"; + private static final String TAG_TARGET_NAME = "target_name"; + private static final String TAG_TARGET_DEATHS = "target_deaths"; + private static final String TAG_CHARGE = "charge"; + + public TotemItem(int durability) { + this(Rarity.COMMON, durability); + } + + public TotemItem(Rarity rarity, int durability) { + super(new Properties().tab(TotemOfReviving.ITEM_GROUP).stacksTo(1).rarity(rarity).defaultDurability(durability)); + } + + public abstract boolean isCharge(ItemStack stack); + + public static int getTargetIndex(ItemStack stack) { + if (!isTotem(stack)) { return -1; } + return stack.getOrCreateTag().getInt(TAG_TARGET_INDEX); + } + public static void setTargetIndex(ItemStack stack, int targetIndex) { + if (!isTotem(stack)) { return; } + stack.getOrCreateTag().putInt(TAG_TARGET_INDEX, targetIndex); + } + + public static UUID getTargetUUID(ItemStack stack) { + if (!isTotem(stack)) { return null; } + try { + return UUID.fromString(stack.getOrCreateTag().getString(TAG_TARGET_UUID)); + } catch (IllegalArgumentException exception) { + return null; + } + } + public static void setTargetUUID(ItemStack stack, UUID targetUUID) { + if (!isTotem(stack)) { return; } + stack.getOrCreateTag().putString(TAG_TARGET_UUID, targetUUID.toString()); + } + + public static String getTargetName(ItemStack stack) { + if (!isTotem(stack)) { return null; } + return stack.getOrCreateTag().getString(TAG_TARGET_NAME); + } + public static void setTargetName(ItemStack stack, String targetName) { + if (!isTotem(stack)) { return; } + stack.getOrCreateTag().putString(TAG_TARGET_NAME, targetName); + } + + public static int getTargetCost(ItemStack stack) { + if (!isTotem(stack)) { return -1; } + return !isCostDynamic(stack) ? getConfig(stack).getChargeCost() : + (int)(getTargetDeaths(stack) * getConfig(stack).getChargeCostMultiplier()); + } + + public static int getTargetDeaths(ItemStack stack) { + if (!isTotem(stack)) { return -1; } + return stack.getOrCreateTag().getInt(TAG_TARGET_DEATHS); + } + public static void setTargetDeaths(ItemStack stack, ServerPlayer target) { + if (!isTotem(stack)) { return; } + stack.getOrCreateTag().putInt(TAG_TARGET_DEATHS, target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + } + + public static boolean isTotemFull(ItemStack stack) { + if (!isTotem(stack)) { return false; } + return getCharge(stack) == getMaxCharge(stack); + } + + public static boolean canTotemAffordTarget(ItemStack stack) { + if (!isTotem(stack)) { return false; } + if (getCharge(stack) < getTargetCost(stack)) { + if (!isTotemFull(stack)) { + return false; + } + return isTotemFull(stack) && canReviveMoreExpensiveTargets(stack); + } + return true; + } + + public static int getCharge(ItemStack stack) { + if (!isTotem(stack)) { return -1; } + int charge = stack.getOrCreateTag().getInt(TAG_CHARGE); + int maxCharge = getMaxCharge(stack); + if (charge > maxCharge) { + charge = maxCharge; + setCharge(stack, charge); + } + return charge; + } + public static void setCharge(ItemStack stack, int charge) { + if (!isTotem(stack)) { return; } + stack.getOrCreateTag().putInt(TAG_CHARGE, charge); + } + + public static int getMaxCharge(ItemStack stack) { + Config.TotemConfig config = getConfig(stack); + if (config == null) { return -1; } + + if (config.getChargeCost() == -1) { + return config.getChargeCostLimit(); + } + return config.getChargeCost(); + } + + public static boolean isCostDynamic(ItemStack stack) { + if (!isTotem(stack)) { return false; } + return getConfig(stack).getChargeCost() == -1; + } + + public static boolean canReviveAcrossDimensions(ItemStack stack) { + if (!isTotem(stack)) { return false; } + return getConfig(stack).getCanReviveAcrossDimensions(); + } + + public static boolean canReviveMoreExpensiveTargets(ItemStack stack) { + if (!isTotem(stack)) { return false; } + return getConfig(stack).getCanReviveMoreExpensiveTargets(); + } + + public static boolean isEnabled(ItemStack stack) { + if (!isTotem(stack)) { return false; } + return getConfig(stack).getIsEnabled(); + } + + @Override + @OnlyIn(Dist.CLIENT) + @ParametersAreNonnullByDefault + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { + if (world == null) { return; } + + UUID targetUUID = getTargetUUID(stack); + String targetName = getTargetName(stack); + int targetCost = getTargetCost(stack); + int charge = getCharge(stack); + int maxCharge = getMaxCharge(stack); + double multiplier = getConfig(stack).getChargeCostMultiplier(); + + if (getConfig(stack).getIsEnabled()) { + if (targetUUID == null) { + tooltip.add(new TextComponent(ChatFormatting.RED + "Target: " + ChatFormatting.DARK_RED + "NONE")); + } else { + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Target: " + ChatFormatting.GRAY + targetName)); + } + tooltip.add(new TextComponent("")); + if (!canTotemAffordTarget(stack)) { + tooltip.add(new TextComponent(ChatFormatting.RED + "Charges: " + ChatFormatting.DARK_RED + "(" + charge + "/" + targetCost + ") " + + ChatFormatting.RED + "[Max: " + ChatFormatting.DARK_RED + maxCharge + ChatFormatting.RED + "] [Multi: " + ChatFormatting.DARK_RED + multiplier + ChatFormatting.RED + "]")); + } else { + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Charges: " + ChatFormatting.GRAY + "(" + charge + "/" + targetCost + ") " + + ChatFormatting.WHITE + "[Max: " + ChatFormatting.GRAY + maxCharge + ChatFormatting.WHITE + "] [Multi: " + ChatFormatting.GRAY + multiplier + ChatFormatting.WHITE + "]")); + } + if (canReviveMoreExpensiveTargets(stack)) { + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Can revive more expensive targets.")); + } + if (canReviveAcrossDimensions(stack)) { + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Can revive targets across dimensions.")); + } + tooltip.add(new TextComponent("")); + if (ModKeyMappings.ADVANCED_TOOLTIP.isDown()) { + tooltip.add(new TextComponent(ChatFormatting.GRAY + "Showing advanced tooltip.")); + tooltip.add(new TextComponent(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "R-CLICK" + ChatFormatting.WHITE + "]")); + tooltip.add(new TextComponent(ChatFormatting.WHITE + "When second hand is empty: revive target.")); + tooltip.add(new TextComponent(ChatFormatting.WHITE + "When second hand is holding a reviving charge: charge totem.")); + tooltip.add(new TextComponent("")); + tooltip.add(new TextComponent(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "L-SHIFT + R-CLICK" + ChatFormatting.WHITE + "]")); + tooltip.add(new TextComponent(ChatFormatting.WHITE + "Change target.")); + } else { + tooltip.add(new TextComponent(ChatFormatting.GRAY + "Hold [" + ChatFormatting.DARK_GRAY + "L-SHIFT" + ChatFormatting.GRAY + "] for advanced tooltip.")); + } + } else { + tooltip.add(new TextComponent(ChatFormatting.RED + "Totem is disabled!")); + } + super.appendHoverText(stack, world, tooltip, tooltipFlag); + } + + @Override + @OnlyIn(Dist.CLIENT) + @ParametersAreNonnullByDefault + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + if (!getConfig(player.getItemInHand(hand)).getIsEnabled() || !world.isClientSide) { + return super.use(world, player, hand); + } + + ItemStack chargeItem = (hand.equals(InteractionHand.MAIN_HAND)) ? player.getOffhandItem() : player.getMainHandItem(); + + if (player.isCrouching()) { + NetworkManager.getChannel().sendToServer(new ChangeTargetPacket(hand)); + } else { + if (isCharge(chargeItem)) { + NetworkManager.getChannel().sendToServer(new ChargeTotemPacket(hand)); + } else { + NetworkManager.getChannel().sendToServer(new ReviveTargetPacket(hand)); + } + } + return super.use(world, player, hand); + } + + @Override + public int getMaxDamage(ItemStack stack) { + return getConfig(stack).getDurability(); + } + + @Override + public boolean isDamageable(ItemStack stack) { + return (getConfig(stack).getDurability() != 0); + } + + @Override + public int getDamage(ItemStack stack) { + if (isDamageable(stack) && super.getDamage(stack) >= getMaxDamage(stack)) { + stack.setCount(0); + return getMaxDamage(stack); + } + return (isDamageable(stack)) ? super.getDamage(stack) : 0; + } + + private static boolean isTotem(ItemStack stack) { + return (stack.getItem() instanceof TotemItem); + } + + private static Config.TotemConfig getConfig(ItemStack stack) { + Item item = stack.getItem(); + if (item instanceof StrawTotemItem) { return Config.Server.getStrawTotemConfig(); } + if (item instanceof IronTotemItem) { return Config.Server.getIronTotemConfig(); } + if (item instanceof DiamondTotemItem) { return Config.Server.getDiamondTotemConfig(); } + if (item instanceof NetheriteTotemItem) { return Config.Server.getNetheriteTotemConfig(); } + return null; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java b/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java new file mode 100644 index 0000000..6fab324 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java @@ -0,0 +1,44 @@ +package dev.micle.totemofreviving.network; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.network.client.ChangeTargetPacket; +import dev.micle.totemofreviving.network.client.ChargeTotemPacket; +import dev.micle.totemofreviving.network.client.ReviveTargetPacket; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; + +public class NetworkManager { + // Initialize variables + private static SimpleChannel channel; + + public static void init() { + // Create channel + channel = NetworkRegistry.ChannelBuilder.named(TotemOfReviving.createResourceLocation("network")) + .clientAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) + .serverAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) + .networkProtocolVersion(TotemOfReviving::getVersion) + .simpleChannel(); + + // Register packets + int id = 0; + channel.messageBuilder(ChangeTargetPacket.class, id++) + .encoder(ChangeTargetPacket::encode) + .decoder(ChangeTargetPacket::decode) + .consumer(ChangeTargetPacket::handle) + .add(); + channel.messageBuilder(ChargeTotemPacket.class, id++) + .encoder(ChargeTotemPacket::encode) + .decoder(ChargeTotemPacket::decode) + .consumer(ChargeTotemPacket::handle) + .add(); + channel.messageBuilder(ReviveTargetPacket.class, id++) + .encoder(ReviveTargetPacket::encode) + .decoder(ReviveTargetPacket::decode) + .consumer(ReviveTargetPacket::handle) + .add(); + } + + public static SimpleChannel getChannel() { + return channel; + } +} diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java new file mode 100644 index 0000000..cf26a6d --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java @@ -0,0 +1,54 @@ +package dev.micle.totemofreviving.network.client; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.item.totem.TotemItem; +import dev.micle.totemofreviving.network.NetworkManager; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ChangeTargetPacket { + private final InteractionHand hand; + + public ChangeTargetPacket(final InteractionHand hand) { + this.hand = hand; + } + + public static void encode(final ChangeTargetPacket packet, final FriendlyByteBuf buffer) { + buffer.writeEnum(packet.hand); + } + + public static ChangeTargetPacket decode(final FriendlyByteBuf buffer) { + return new ChangeTargetPacket(buffer.readEnum(InteractionHand.class)); + } + + public static void handle(final ChangeTargetPacket packet, final Supplier contextSupplier) { + final NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + ServerPlayer sender = context.getSender(); + if (sender == null) { return; } + + ItemStack totemStack = sender.getItemInHand(packet.hand); + PlayerList playerList = TotemOfReviving.getProxy().getServer().getPlayerList(); + int targetIndex = TotemItem.getTargetIndex(totemStack) + 1; + + if (targetIndex > playerList.getPlayerCount()-1) { targetIndex = 0; } + ServerPlayer target = playerList.getPlayers().get(targetIndex); + + TotemItem.setTargetIndex(totemStack, targetIndex); + TotemItem.setTargetUUID(totemStack, target.getUUID()); + TotemItem.setTargetName(totemStack, target.getDisplayName().getString()); + TotemItem.setTargetDeaths(totemStack, target); + + sender.sendMessage(new TextComponent(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + target.getDisplayName().getString() + "."), sender.getUUID()); + }); + context.setPacketHandled(true); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java new file mode 100644 index 0000000..3879f2f --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java @@ -0,0 +1,44 @@ +package dev.micle.totemofreviving.network.client; + +import dev.micle.totemofreviving.item.totem.TotemItem; +import dev.micle.totemofreviving.network.NetworkManager; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ChargeTotemPacket { + private final InteractionHand hand; + + public ChargeTotemPacket(final InteractionHand hand) { + this.hand = hand; + } + + public static void encode(final ChargeTotemPacket packet, final FriendlyByteBuf buffer) { + buffer.writeEnum(packet.hand); + } + + public static ChargeTotemPacket decode(final FriendlyByteBuf buffer) { + return new ChargeTotemPacket(buffer.readEnum(InteractionHand.class)); + } + + public static void handle(final ChargeTotemPacket packet, final Supplier contextSupplier) { + final NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + ServerPlayer sender = context.getSender(); + if (sender == null) { return; } + + ItemStack totemStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getMainHandItem() : sender.getOffhandItem(); + ItemStack chargeStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getOffhandItem() : sender.getMainHandItem(); + + if (TotemItem.isTotemFull(totemStack)) { return; } + + TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) + 1); + chargeStack.setCount(chargeStack.getCount() - 1); + }); + context.setPacketHandled(true); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java new file mode 100644 index 0000000..da69a3c --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java @@ -0,0 +1,72 @@ +package dev.micle.totemofreviving.network.client; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.item.totem.TotemItem; +import dev.micle.totemofreviving.network.NetworkManager; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ReviveTargetPacket { + private final InteractionHand hand; + + public ReviveTargetPacket(final InteractionHand hand) { + this.hand = hand; + } + + public static void encode(final ReviveTargetPacket packet, final FriendlyByteBuf buffer) { + buffer.writeEnum(packet.hand); + } + + public static ReviveTargetPacket decode(final FriendlyByteBuf buffer) { + return new ReviveTargetPacket(buffer.readEnum(InteractionHand.class)); + } + + public static void handle(final ReviveTargetPacket packet, final Supplier contextSupplier) { + final NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + ServerPlayer sender = context.getSender(); + if (sender == null) { return; } + + ItemStack totemStack = sender.getItemInHand(packet.hand); + ServerPlayer target; + + try { + target = TotemOfReviving.getProxy().getServer().getPlayerList().getPlayer(TotemItem.getTargetUUID(totemStack)); + if (target == null) { throw new NullPointerException("Target is null!"); } + } catch (NullPointerException exception) { + sender.sendMessage(new TextComponent(ChatFormatting.WHITE + "Unable to find player!"), sender.getUUID()); + return; + } + + if (!target.isSpectator()) { + sender.sendMessage(new TextComponent(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!"), sender.getUUID()); + return; + } + + if (!target.getLevel().equals(sender.getLevel()) && !TotemItem.canReviveAcrossDimensions(totemStack)) { + sender.sendMessage(new TextComponent(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!"), sender.getUUID()); + return; + } + + TotemItem.setTargetDeaths(totemStack, target); + if (!TotemItem.canTotemAffordTarget(totemStack)) { + sender.sendMessage(new TextComponent(ChatFormatting.WHITE + "Not enough charge!"), sender.getUUID()); + return; + } + + target.teleportTo(sender.getLevel(), sender.position().x, sender.position().y, sender.position().z, sender.getYRot(), sender.getXRot()); + target.setGameMode(sender.getLevel().getServer().getDefaultGameType()); + TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) - TotemItem.getTargetCost(totemStack)); + totemStack.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); + sender.sendMessage(new TextComponent(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!"), sender.getUUID()); + }); + context.setPacketHandled(true); + } +} diff --git a/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java b/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java new file mode 100644 index 0000000..4f9e335 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java @@ -0,0 +1,11 @@ +package dev.micle.totemofreviving.proxy; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +public interface IProxy { + MinecraftServer getServer(); + Player getClientPlayer(); + Level getClientWorld(); +} diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java new file mode 100644 index 0000000..2c4cb9d --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java @@ -0,0 +1,112 @@ +package dev.micle.totemofreviving.proxy; + +import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.data.DataGenerators; +import dev.micle.totemofreviving.network.NetworkManager; +import dev.micle.totemofreviving.setup.Registration; +import net.minecraft.client.Minecraft; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.AddReloadListenerEvent; +import net.minecraftforge.event.server.ServerStartedEvent; +import net.minecraftforge.event.server.ServerStoppingEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.event.lifecycle.*; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +public class Proxy implements IProxy { + // Initialize variables + private static MinecraftServer server = null; + + // Common setup + public Proxy() { + // Initialize setup + Registration.register(); + Config.init(); + NetworkManager.init(); + + // Register mod event bus listeners + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(DataGenerators::gatherData); + modEventBus.addListener(Proxy::setup); + modEventBus.addListener(Proxy::imcEnqueue); + modEventBus.addListener(Proxy::imcProcess); + + // Register event bus listeners + MinecraftForge.EVENT_BUS.addListener(Proxy::onAddReloadListeners); + MinecraftForge.EVENT_BUS.addListener(Proxy::serverStarted); + MinecraftForge.EVENT_BUS.addListener(Proxy::serverStopping); + } + + private static void setup(FMLCommonSetupEvent event) {} + + private static void imcEnqueue(InterModEnqueueEvent event) {} + + private static void imcProcess(InterModProcessEvent event) {} + + private static void onAddReloadListeners(AddReloadListenerEvent event) {} + + private static void serverStarted(ServerStartedEvent event) { + server = event.getServer(); + } + + private static void serverStopping(ServerStoppingEvent event) { + server = null; + } + + @Override + public MinecraftServer getServer() { + return server; + } + + @Override + public Player getClientPlayer() { + return null; + } + + @Override + public Level getClientWorld() { + return null; + } + + // Client setup + public static class Client extends Proxy { + public Client() { + // Register mod event bus listeners + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(Client::setup); + modEventBus.addListener(Client::postSetup); + } + + private static void setup(FMLClientSetupEvent event) {} + + private static void postSetup(FMLLoadCompleteEvent event) {} + + @Override + @OnlyIn(Dist.CLIENT) + public Player getClientPlayer() { + return Minecraft.getInstance().player; + } + + @Override + @OnlyIn(Dist.CLIENT) + public Level getClientWorld() { + return Minecraft.getInstance().level; + } + } + + // Server setup + public static class Server extends Proxy { + public Server() { + // Register mod event bus listeners + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(Server::setup); + } + + private static void setup(FMLDedicatedServerSetupEvent event) {} + } +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/Config.java b/src/main/java/dev/micle/totemofreviving/setup/Config.java new file mode 100644 index 0000000..bfefb18 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/Config.java @@ -0,0 +1,95 @@ +package dev.micle.totemofreviving.setup; + +import dev.micle.totemofreviving.item.totem.DiamondTotemItem; +import dev.micle.totemofreviving.item.totem.IronTotemItem; +import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; +import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.config.ModConfig; + +public final class Config { + public static void init() { + ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Server.SPEC); + } + + public static class Server { + private static final ForgeConfigSpec SPEC; + + private static final TotemConfig STRAW_TOTEM_CONFIG; + private static final TotemConfig IRON_TOTEM_CONFIG; + private static final TotemConfig DIAMOND_TOTEM_CONFIG; + private static final TotemConfig NETHERITE_TOTEM_CONFIG; + + static { + ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + + builder.comment("WHEN MAKING CHANGES IT IS RECOMMENDED TO NOT BE IN A WORLD.\n" + + "CHANGES WILL MOST LIKELY REQUIRE A RESTART FOR EVERYTHING TO WORK PROPERLY."); + STRAW_TOTEM_CONFIG = new TotemConfig(builder, StrawTotemItem.getName(), true, -1, 3, + 1, false, false, 1); + IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), true, -1, 5, + 0.75, false, false, 4); + DIAMOND_TOTEM_CONFIG = new TotemConfig(builder, DiamondTotemItem.getName(), true, -1, 10, + 0.5, false, false, 10); + NETHERITE_TOTEM_CONFIG = new TotemConfig(builder, NetheriteTotemItem.getName(), true, 1, 1, + 1, true, true, 0); + + SPEC = builder.build(); + } + + public static TotemConfig getStrawTotemConfig() { return STRAW_TOTEM_CONFIG; } + public static TotemConfig getIronTotemConfig() { return IRON_TOTEM_CONFIG; } + public static TotemConfig getDiamondTotemConfig() { return DIAMOND_TOTEM_CONFIG; } + public static TotemConfig getNetheriteTotemConfig() { return NETHERITE_TOTEM_CONFIG; } + } + + public static class TotemConfig { + private final ForgeConfigSpec.BooleanValue IS_ENABLED; + private final ForgeConfigSpec.IntValue CHARGE_COST; + private final ForgeConfigSpec.IntValue CHARGE_COST_LIMIT; + private final ForgeConfigSpec.DoubleValue CHARGE_COST_MULTIPLIER; + private final ForgeConfigSpec.BooleanValue CAN_REVIVE_MORE_EXPENSIVE_TARGETS; + private final ForgeConfigSpec.BooleanValue CAN_REVIVE_ACROSS_DIMENSIONS; + private final ForgeConfigSpec.IntValue DURABILITY; + + TotemConfig(ForgeConfigSpec.Builder builder, String name, boolean isEnabled, int chargeCost, + int chargeCostLimit, double chargeCostMultiplier, boolean canReviveMoreExpensiveTargets, + boolean canReviveAcrossDimensions, int durability) { + builder.push(name); + IS_ENABLED = builder + .comment("Is the " + name + " enabled?") + .define("isEnabled", isEnabled); + CHARGE_COST = builder + .comment("The charge cost to revive a player.\n" + + "-1 means the cost is dynamic (follows the amount of deaths the target has)\n" + + "Higher values set the charge cost to static, meaning that this will be the amount of charges needed to revive someone.") + .defineInRange("chargeCost", chargeCost, -1, Integer.MAX_VALUE); + CHARGE_COST_LIMIT = builder + .comment("The max amount of charge this totem can hold at once. Only works with dynamic cost.") + .defineInRange("chargeCostLimit", chargeCostLimit, 1, Integer.MAX_VALUE); + CHARGE_COST_MULTIPLIER = builder + .comment("Charge cost multiplier. 0.5 means the charge cost will be 50% of the original cost. Only works with dynamic cost.") + .defineInRange("chargeCostMultiplier", chargeCostMultiplier, 0.01, 100); + CAN_REVIVE_MORE_EXPENSIVE_TARGETS = builder + .comment("Is the totem able to revive targets that cost more than the totems max charge?\n" + + "This only applies if the totem is fully charged. (dynamic wont work if limit is 0)") + .define("canReviveMoreExpensiveTargets", canReviveMoreExpensiveTargets); + CAN_REVIVE_ACROSS_DIMENSIONS = builder + .comment("Is the totem able to revive targets across dimensions?") + .define("canReviveAcrossDimensions", canReviveAcrossDimensions); + DURABILITY = builder + .comment("The durability of the totem. 0 means unbreakable.") + .defineInRange("durability", durability, 0, Integer.MAX_VALUE); + builder.pop(); + } + + public boolean getIsEnabled() { return IS_ENABLED.get(); } + public int getChargeCost() { return CHARGE_COST.get(); } + public int getChargeCostLimit() { return CHARGE_COST_LIMIT.get(); } + public double getChargeCostMultiplier() { return CHARGE_COST_MULTIPLIER.get(); } + public boolean getCanReviveMoreExpensiveTargets() { return CAN_REVIVE_MORE_EXPENSIVE_TARGETS.get(); } + public boolean getCanReviveAcrossDimensions() { return CAN_REVIVE_ACROSS_DIMENSIONS.get(); } + public int getDurability() { return DURABILITY.get(); } + } +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModItems.java b/src/main/java/dev/micle/totemofreviving/setup/ModItems.java new file mode 100644 index 0000000..2cdcdc4 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/ModItems.java @@ -0,0 +1,26 @@ +package dev.micle.totemofreviving.setup; + +import dev.micle.totemofreviving.item.charge.DiamondChargeItem; +import dev.micle.totemofreviving.item.charge.IronChargeItem; +import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; +import dev.micle.totemofreviving.item.charge.StrawChargeItem; +import dev.micle.totemofreviving.item.totem.DiamondTotemItem; +import dev.micle.totemofreviving.item.totem.IronTotemItem; +import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; +import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.RegistryObject; + +public class ModItems { + public static RegistryObject STRAW_TOTEM = Registration.ITEMS.register(StrawTotemItem.getName(), StrawTotemItem::new); + public static RegistryObject IRON_TOTEM = Registration.ITEMS.register(IronTotemItem.getName(), IronTotemItem::new); + public static RegistryObject DIAMOND_TOTEM = Registration.ITEMS.register(DiamondTotemItem.getName(), DiamondTotemItem::new); + public static RegistryObject NETHERITE_TOTEM = Registration.ITEMS.register(NetheriteTotemItem.getName(), NetheriteTotemItem::new); + + public static RegistryObject STRAW_CHARGE = Registration.ITEMS.register(StrawChargeItem.getName(), StrawChargeItem::new); + public static RegistryObject IRON_CHARGE = Registration.ITEMS.register(IronChargeItem.getName(), IronChargeItem::new); + public static RegistryObject DIAMOND_CHARGE = Registration.ITEMS.register(DiamondChargeItem.getName(), DiamondChargeItem::new); + public static RegistryObject NETHERITE_CHARGE = Registration.ITEMS.register(NetheriteChargeItem.getName(), NetheriteChargeItem::new); + + public static void register() {} +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java b/src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java new file mode 100644 index 0000000..6d531b1 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java @@ -0,0 +1,9 @@ +package dev.micle.totemofreviving.setup; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; + +public class ModKeyMappings { + public static final KeyMapping ADVANCED_TOOLTIP = + new KeyMapping("advanced_tooltips", InputConstants.KEY_LSHIFT, KeyMapping.CATEGORY_INVENTORY); +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModRecipes.java b/src/main/java/dev/micle/totemofreviving/setup/ModRecipes.java new file mode 100644 index 0000000..5d15d26 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/ModRecipes.java @@ -0,0 +1,16 @@ +package dev.micle.totemofreviving.setup; + +import dev.micle.totemofreviving.item.crafting.ChargeRecipe; +import dev.micle.totemofreviving.item.crafting.ExtendedShapedRecipe; +import dev.micle.totemofreviving.item.crafting.TotemRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.registries.RegistryObject; + +public class ModRecipes { + public static final RegistryObject> TOTEM_RECIPE = + Registration.RECIPE_SERIALIZERS.register("totem_recipe", () -> ExtendedShapedRecipe.Serializer.basic(TotemRecipe::new)); + public static final RegistryObject> CHARGE_RECIPE = + Registration.RECIPE_SERIALIZERS.register("charge_recipe", () -> ExtendedShapedRecipe.Serializer.basic(ChargeRecipe::new)); + + public static void register() {} +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/Registration.java b/src/main/java/dev/micle/totemofreviving/setup/Registration.java new file mode 100644 index 0000000..2d79516 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/Registration.java @@ -0,0 +1,31 @@ +package dev.micle.totemofreviving.setup; + +import dev.micle.totemofreviving.TotemOfReviving; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.IForgeRegistryEntry; + +public class Registration { + // Initialize variables + public static final DeferredRegister ITEMS = create(ForgeRegistries.ITEMS); + public static final DeferredRegister> RECIPE_SERIALIZERS = create(ForgeRegistries.RECIPE_SERIALIZERS); + + public static void register() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + + ITEMS.register(modEventBus); + ModItems.register(); + + RECIPE_SERIALIZERS.register(modEventBus); + ModRecipes.register(); + } + + private static > DeferredRegister create(IForgeRegistry registry) { + return DeferredRegister.create(registry, TotemOfReviving.MOD_ID); + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..e00e6ba --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,58 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader = "javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion = "[43,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license = "All Rights Reserved" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="http://my.issue.tracker/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId = "totemofreviving" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata +# see the associated build.gradle script for how to populate this completely automatically during a build +version = "${file.jarVersion}" #mandatory +# A display name for the mod +displayName = "Micle's Totem of Reviving" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +#updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +logoFile="logo.jpg" #optional +# A text field displayed in the mod UI +#credits="Thanks for this example mod goes to Java" #optional +# A text field displayed in the mod UI +authors="Micle" #optional +# The description text for the mod (multi line!) (#mandatory) +description = ''' +Mod for reviving players in a hardcore world. +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.totemofreviving]] #optional + # the modid of the dependency + modId = "forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory = true #mandatory + # The version range of the dependency + versionRange = "[43,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering = "NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side = "BOTH" +# Here's another dependency +[[dependencies.totemofreviving]] + modId = "minecraft" + mandatory = true + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange = "[1.19.2,1.20)" + ordering = "NONE" + side = "BOTH" diff --git a/src/main/resources/assets/totemofreviving/lang/en_us.json b/src/main/resources/assets/totemofreviving/lang/en_us.json new file mode 100644 index 0000000..755693e --- /dev/null +++ b/src/main/resources/assets/totemofreviving/lang/en_us.json @@ -0,0 +1,12 @@ +{ + "itemGroup.totemofreviving": "Micle's Totem of Reviving", + "item.totemofreviving.straw_totem": "Straw totem of reviving", + "item.totemofreviving.iron_totem": "Iron totem of reviving", + "item.totemofreviving.diamond_totem": "Diamond totem of reviving", + "item.totemofreviving.netherite_totem": "Netherite totem of reviving", + "item.totemofreviving.straw_charge": "Straw reviving charge", + "item.totemofreviving.iron_charge": "Iron reviving charge", + "item.totemofreviving.diamond_charge": "Diamond reviving charge", + "item.totemofreviving.netherite_charge": "Netherite reviving charge", + "advanced_tooltips": "advanced_tooltips" +} \ No newline at end of file diff --git a/src/main/resources/assets/totemofreviving/textures/item/diamond_charge.png b/src/main/resources/assets/totemofreviving/textures/item/diamond_charge.png new file mode 100644 index 0000000000000000000000000000000000000000..b6081b123a682fabc59ecc92f637787294c57608 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|+7W;F#Ka|3Q)CxN&?lbIcVf4|c?yV3DkJ;QD{pptVt9%}$8u96_X z;Quhdu<4A>d7vm~fk$L90|Vb75M~tB@M-`GMtHh7hG+!0`bF~{P~h3rvFqOdL#th5 zH>F6*?{P`~D88>dx9^sjP`8e@nape%$$jrq8o84Cn6eLETj(jqT5EFc&I{GYrW~^! pT^T!5CqIs_w3++lVEn^6X33lEi#5{{;(&HAc)I$ztaD0e0sy}^SIz(c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/totemofreviving/textures/item/diamond_totem.png b/src/main/resources/assets/totemofreviving/textures/item/diamond_totem.png new file mode 100644 index 0000000000000000000000000000000000000000..82772bc76c49160586002da3a982ab0dd7f261d3 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|&0G|+7!J;ai2RB6Gf*1aN;q~^W)T-r<&*~X=yZ!zBPG;gPg`-=63XM1Y z-Ug(2N`m}?|04i{(EW4gfa0759+AZi419+`m{C;2s{tsOtWmNzG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/totemofreviving/textures/item/iron_charge.png b/src/main/resources/assets/totemofreviving/textures/item/iron_charge.png new file mode 100644 index 0000000000000000000000000000000000000000..f52f9a7704a9e4b79de88751bbb34f1061333c6a GIT binary patch literal 721 zcmV;?0xtcDP)EX>4Tx04R}tkv&MmP!xqvQ$>-AU^|G2WT;LSL`5963Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgbaGO3krMAq3N2#1@OU5R-E(>GJV2ZLMN=c5B95w>PV*{h@IUySt(Bjg@Fs=gKMWw&%l-5@>lA>%qQu! zmKHq%`nG|K>z1bM0hc?#z>^`HvMU8?3Hdzmen#Jv1;V#L&zhH8^BkuSK$@~j-T()O zz-WPHulu~ayFIsmdz$(E0BHeoqqRVvYXATM24YJ`L;!REbO3bmfr!}v000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&416E7tD#w88_007NNL_t(I%iWPJ4#GeXg})MP z-G&PgL>(b%T^*`77_+hm*qd;LnjQmDL9(k!55c$|U@<@lKW#t}o|$AOZ|1!>@bk#? zJdVw0Q{*hmzPoI#jn>*YrDXPwY>c64n&hj?&bbJ1t@lbEF@J0rV^h@wA}tdjQfjWqaDOS}qU~s;atK8eI@VNK}IcL|1ZmuO9r%UOV@RT5R%CduPT73syAD&$bW(}BivTorI!@w00000NkvXXu0mjf DUrjvj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/totemofreviving/textures/item/iron_totem.png b/src/main/resources/assets/totemofreviving/textures/item/iron_totem.png new file mode 100644 index 0000000000000000000000000000000000000000..04385b72e9a74b019be2d360c39f83dc79291484 GIT binary patch literal 826 zcmV-A1I7G_P)EX>4Tx04R}tkv&MmP!xqvQ$>-AU^|G2WT;LSL`5963Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgbaGO3krMAq3N2#1@OU5R-E(>GJV2ZLMN=c5B95w>PV*{h@IUySt(Bjg@Fs=gKMWw&%l-5@>lA>%qQu! zmKHq%`nG|K>z1bM0hc?#z>^`HvMU8?3Hdzmen#Jv1;V#L&zhH8^BkuSK$@~j-T()O zz-WPHulu~ayFIsmdz$(E0BHeoqqRVvYXATM24YJ`L;!REbO3bmfr!}v000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&416D%GU=dXVN00A~hL_t(I%cYZ{Zo@DXMNg|y zqiJ6d5LqK72@9F}4`GF+<3U4Z{(-<0^#>+RnlxZAsSSASq2iG;k7p>^nmW^_UUsja z{jTq`;Y!S6;%c?(VtUgw7xg!>%~e%RHSETR%*Pd~3P75sq-jbBfe^yk+OG}(L>0c5fK@93{eLUA5Xm9zSAvVXxnz+*l%PO&jIk>QxpYxp5vVR zzCzP9Gga*XthIy?D9dt~LXXqwg!dlrJ%__#c9uaeSZh0D47=U#%vQPgoV(~g`H;p~EEfNB(7X7_W8DG10NUV+Xh~>&$^ZZW07*qoM6N<$ Ef)s&uv;Y7A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/totemofreviving/textures/item/netherite_charge.png b/src/main/resources/assets/totemofreviving/textures/item/netherite_charge.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d7a248b82986f31f187cbc1dbf216054bd43b8 GIT binary patch literal 741 zcmVEX>4Tx04R}tkv&MmP!xqvQ$>-AU^|G2WT;LSL`5963Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgbaGO3krMAq3N2#1@OU5R-E(>GJV2ZLMN=c5B95w>PV*{h@IUySt(Bjg@Fs=gKMWw&%l-5@>lA>%qQu! zmKHq%`nG|K>z1bM0hc?#z>^`HvMU8?3Hdzmen#Jv1;V#L&zhH8^BkuSK$@~j-T()O zz-WPHulu~ayFIsmdz$(E0BHeoqqRVvYXATM24YJ`L;!REbO3bmfr!}v000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&416Ey^Ih5sD@007}hL_t(I%iWPrio!4$#eWr7 zwFLtr3aJzd_20@Xh>P(|-oTwlm>Y-}@Dze03Fh|a4IW^23Zpeb2&wxw0o8|8hm&R0rGX-Fc)=8{;<~Pv^ XF3V6vhkaf*00000NkvXXu0mjfp#4Yx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/totemofreviving/textures/item/netherite_totem.png b/src/main/resources/assets/totemofreviving/textures/item/netherite_totem.png new file mode 100644 index 0000000000000000000000000000000000000000..eeba15a338707cd642ee60189d247976273f354a GIT binary patch literal 836 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

^C# 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 d+Gx