diff --git a/.gitignore b/.gitignore index a6b5af566..3a6446eb3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,8 +20,9 @@ build # other eclipse run +run-data +logs # Files from Forge MDK forge*changelog.txt -/run-data/logs/ /src/generated/resources/.cache/ diff --git a/build.gradle.kts b/build.gradle.kts index d88276c8a..a8bdb0be5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,6 +30,10 @@ val mixinVersion: String by extra val modJavaVersion: String by extra val lodestoneVersion: String by extra val fusionVersion: String by extra +var caelusVersion: String by extra +val geckoLibVersion: String by extra +val playerAnimatorVersion: String by extra +val ironsSpellsVersion: String by extra jarJar.enable() @@ -145,6 +149,18 @@ repositories { } } + //Iron's Spellbooks requirements + maven { + name = "Iron's Maven - Release" + url = uri("https://code.redspace.io/releases") + } + maven { + url = uri("https://maven.kosmx.dev/") + } + maven { + url = uri("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/") + } + exclusiveContent { forRepository { maven { @@ -184,19 +200,30 @@ dependencies { implementation(fg.deobf("team.lodestar.lodestone:lodestone:${minecraftVersion}-${lodestoneVersion}")) - runtimeOnly(fg.deobf("maven.modrinth:fusion-connected-textures:${fusionVersion}-forge-mc${minecraftVersion}")) - + //FD Optional Dependency compileOnly(fg.deobf("curse.maven:farmers_delight-398521:4638874")) - runtimeOnly(fg.deobf("curse.maven:create-328085:4626108")) - //implementation(fg.deobf("curse.maven:jeed-532286:4599236")) - implementation(fg.deobf("curse.maven:mutil-351914:4824501")) - implementation(fg.deobf("curse.maven:tetra-289712:5544287")) + //Tetra Optional Dependency + compileOnly(fg.deobf("curse.maven:mutil-351914:4824501")) + compileOnly(fg.deobf("curse.maven:tetra-289712:5544287")) - runtimeOnly(fg.deobf("curse.maven:world-stripper-250603:4578579")) + //Iron's Spellbooks Optional Dependency + compileOnly(fg.deobf("top.theillusivec4.caelus:caelus-forge:${caelusVersion}:api")) + runtimeOnly(fg.deobf("top.theillusivec4.caelus:caelus-forge:${caelusVersion}")) + implementation(fg.deobf("software.bernie.geckolib:geckolib-forge-${geckoLibVersion}")) + implementation(fg.deobf("dev.kosmx.player-anim:player-animation-lib-forge:${playerAnimatorVersion}")) + compileOnly(fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${ironsSpellsVersion}:api")) + runtimeOnly(fg.deobf("io.redspace.ironsspellbooks:irons_spellbooks:${ironsSpellsVersion}")) + + //Apothic Attributes + implementation(fg.deobf("curse.maven:placebo-283644:5414631")) + implementation(fg.deobf("curse.maven:apothic-attributes-898963:5634071")) + + //Misc runtimeOnly(fg.deobf("curse.maven:spark-361579:4587309")) runtimeOnly(fg.deobf("curse.maven:attributefix-280510:4911084")) runtimeOnly(fg.deobf("curse.maven:overloaded-armor-bar-314002:4631133")) + runtimeOnly(fg.deobf("maven.modrinth:fusion-connected-textures:${fusionVersion}-forge-mc${minecraftVersion}")) } tasks.withType { @@ -242,6 +269,7 @@ tasks.withType { ) } finalizedBy("reobfJar") + finalizedBy("reobfJarJar") } tasks.jar.configure { diff --git a/gradle.properties b/gradle.properties index b3774b003..618145069 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,12 +11,22 @@ parchmentVersion=2023.09.03-1.20.1 mixinVersion=0.8.5 modName=Malum modId=malum -modVersion=1.6.2 +modVersion=1.6.4 modLicense=All Rights Reserved modGroupId=com.sammy.malum modAuthors=Sammy Semicolon modDescription=A dark magic mod focused on soul and spirit magic. -lodestoneVersion=1.6.2.216 -jeiVersion=15.2.0.22 + +# Mandatory +lodestoneVersion=1.6.3.246 curiosVersion=5.7.1+1.20.1 + +# Iron's Spellbooks +caelusVersion=3.1.0+1.20 +geckoLibVersion=1.20.1:4.4.5 +playerAnimatorVersion=1.0.2-rc1+1.20 +ironsSpellsVersion=1.20.1-3.4.0.2 + +# Misc +jeiVersion=15.2.0.22 fusionVersion=1.1.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 94336fcae..e6441136f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fae08049a..a4413138c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d51..b740cf133 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,127 @@ -#!/usr/bin/env sh +#!/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 UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,92 +130,120 @@ 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. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + 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 fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# 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" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + 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 - i=$((i+1)) + # 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 - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# 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 index f9553162f..25da30dbd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@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 @@ -9,25 +25,29 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused 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= +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 init +if %ERRORLEVEL% equ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -35,48 +55,36 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%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 +if %ERRORLEVEL% equ 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 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/logs/debug.log b/logs/debug.log deleted file mode 100644 index e69de29bb..000000000 diff --git a/logs/latest.log b/logs/latest.log deleted file mode 100644 index e69de29bb..000000000 diff --git a/run-data/config/fml.toml b/run-data/config/fml.toml deleted file mode 100644 index f843a0bd1..000000000 --- a/run-data/config/fml.toml +++ /dev/null @@ -1,25 +0,0 @@ -#Early window height -earlyWindowHeight = 480 -#Early window framebuffer scale -earlyWindowFBScale = 1 -#Enable forge global version checking -versionCheck = true -#Early window provider -earlyWindowProvider = "fmlearlywindow" -#Early window width -earlyWindowWidth = 854 -#Early window starts maximized -earlyWindowMaximized = false -#Default config path for servers -defaultConfigPath = "defaultconfigs" -#Disables Optimized DFU client-side - already disabled on servers -disableOptimizedDFU = true -#Skip specific GL versions, may help with buggy graphics card drivers -earlyWindowSkipGLVersions = [] -#Should we control the window. Disabling this disables new GL features and can be bad for mods that rely on them. -earlyWindowControl = true -#Max threads for early initialization parallelism, -1 is based on processor count -maxThreads = -1 -#Squir? -earlyWindowSquir = false - diff --git a/run-data/config/jei/jei-client.ini b/run-data/config/jei/jei-client.ini deleted file mode 100644 index 2146509c9..000000000 --- a/run-data/config/jei/jei-client.ini +++ /dev/null @@ -1,141 +0,0 @@ -[advanced] - # Description: Display search bar in the center - # Valid Values: [true, false] - # Default Value: false - CenterSearch = false - - # Description: Set low-memory mode (makes search very slow, but uses less RAM) - # Valid Values: [true, false] - # Default Value: false - LowMemorySlowSearchEnabled = false - - # Description: Enable cheating items into the hotbar by using the shift+number keys. - # Valid Values: [true, false] - # Default Value: false - CheatToHotbarUsingHotkeysEnabled = false - - # Description: Enable adding new bookmarks to the front of the bookmark list. - # Valid Values: [true, false] - # Default Value: true - AddBookmarksToFrontEnabled = true - - # Description: When looking up recipes with items that contain fluids, also look up recipes for the fluids. - # Valid Values: [true, false] - # Default Value: false - LookupFluidContents = false - - # Description: How items should be handed to you - # Valid Values: [INVENTORY, MOUSE_PICKUP] - # Default Value: MOUSE_PICKUP - GiveMode = MOUSE_PICKUP - - # Description: Max. recipe gui height - # Valid Values: Any integer greater than or equal to 175 - # Default Value: 350 - RecipeGuiHeight = 350 - - -[sorting] - # Description: Sorting order for the ingredient list - # Valid Values: A comma-separated list containing values of: - # [MOD_NAME, INGREDIENT_TYPE, ALPHABETICAL, CREATIVE_MENU, TAG, ARMOR, MAX_DURABILITY] - # Default Value: MOD_NAME, INGREDIENT_TYPE, CREATIVE_MENU - IngredientSortStages = MOD_NAME, INGREDIENT_TYPE, CREATIVE_MENU - - -[search] - # Description: Search mode for Mod Names (prefix: @) - # Valid Values: [ENABLED, REQUIRE_PREFIX, DISABLED] - # Default Value: REQUIRE_PREFIX - ModNameSearchMode = REQUIRE_PREFIX - - # Description: Search mode for Tooltips (prefix: #) - # Valid Values: [ENABLED, REQUIRE_PREFIX, DISABLED] - # Default Value: ENABLED - TooltipSearchMode = ENABLED - - # Description: Search mode for Tag Names (prefix: $) - # Valid Values: [ENABLED, REQUIRE_PREFIX, DISABLED] - # Default Value: REQUIRE_PREFIX - TagSearchMode = REQUIRE_PREFIX - - # Description: Search mode for Colors (prefix: ^) - # Valid Values: [ENABLED, REQUIRE_PREFIX, DISABLED] - # Default Value: DISABLED - ColorSearchMode = DISABLED - - # Description: Search mode for resources locations (prefix: &) - # Valid Values: [ENABLED, REQUIRE_PREFIX, DISABLED] - # Default Value: DISABLED - ResourceLocationSearchMode = DISABLED - - # Description: Search advanced tooltips (visible with F3+H) - # Valid Values: [true, false] - # Default Value: false - SearchAdvancedTooltips = false - - -[IngredientList] - # Description: Max number of rows shown - # Valid Values: An integer in the range [1, 100] (inclusive) - # Default Value: 16 - MaxRows = 16 - - # Description: Max number of columns shown - # Valid Values: An integer in the range [4, 100] (inclusive) - # Default Value: 9 - MaxColumns = 9 - - # Description: Horizontal alignment of the ingredient grid inside the available area - # Valid Values: [LEFT, CENTER, RIGHT] - # Default Value: RIGHT - HorizontalAlignment = RIGHT - - # Description: Vertical alignment of the ingredient grid inside the available area - # Valid Values: [TOP, CENTER, BOTTOM] - # Default Value: TOP - VerticalAlignment = TOP - - # Description: Visibility of the top page buttons. Use AUTO_HIDE to only show it when there are multiple pages. - # Valid Values: [ENABLED, AUTO_HIDE, DISABLED] - # Default Value: ENABLED - ButtonNavigationVisibility = ENABLED - - # Description: Set to true to draw a background texture behind the gui. - # Valid Values: [true, false] - # Default Value: false - DrawBackground = false - - -[BookmarkList] - # Description: Max number of rows shown - # Valid Values: An integer in the range [1, 100] (inclusive) - # Default Value: 16 - MaxRows = 16 - - # Description: Max number of columns shown - # Valid Values: An integer in the range [4, 100] (inclusive) - # Default Value: 9 - MaxColumns = 9 - - # Description: Horizontal alignment of the ingredient grid inside the available area - # Valid Values: [LEFT, CENTER, RIGHT] - # Default Value: LEFT - HorizontalAlignment = LEFT - - # Description: Vertical alignment of the ingredient grid inside the available area - # Valid Values: [TOP, CENTER, BOTTOM] - # Default Value: TOP - VerticalAlignment = TOP - - # Description: Visibility of the top page buttons. Use AUTO_HIDE to only show it when there are multiple pages. - # Valid Values: [ENABLED, AUTO_HIDE, DISABLED] - # Default Value: ENABLED - ButtonNavigationVisibility = ENABLED - - # Description: Set to true to draw a background texture behind the gui. - # Valid Values: [true, false] - # Default Value: false - DrawBackground = false - - diff --git a/run-data/config/jei/jei-colors.ini b/run-data/config/jei/jei-colors.ini deleted file mode 100644 index 1fc7da4ea..000000000 --- a/run-data/config/jei/jei-colors.ini +++ /dev/null @@ -1,8 +0,0 @@ -[colors] - # Description: Color values to search for - # Valid Values: A comma-separated list containing values of: - # Any color name and an RGB hex color, separated by a ':' - # Default Value: White:EEEEEE, LightBlue:7492CC, Cyan:00EEEE, Blue:2222DD, LapisBlue:25418B, Teal:008080, Yellow:CACB58, GoldenYellow:EED700, Orange:D97634, Pink:D1899D, HotPink:FC0FC0, Magenta:B24BBB, Purple:813EB9, EvilPurple:2E1649, Lavender:B57EDC, Indigo:480082, Sand:DBD3A0, Tan:BB9B63, LightBrown:A0522D, Brown:634B33, DarkBrown:3A2D13, LimeGreen:43B239, SlimeGreen:83CB73, Green:008000, DarkGreen:224D22, GrassGreen:548049, Red:963430, BrickRed:B0604B, NetherBrick:2A1516, Redstone:CE3E36, Black:181515, CharcoalGray:464646, IronGray:646464, Gray:808080, Silver:C0C0C0 - SearchColors = White:EEEEEE, LightBlue:7492CC, Cyan:00EEEE, Blue:2222DD, LapisBlue:25418B, Teal:008080, Yellow:CACB58, GoldenYellow:EED700, Orange:D97634, Pink:D1899D, HotPink:FC0FC0, Magenta:B24BBB, Purple:813EB9, EvilPurple:2E1649, Lavender:B57EDC, Indigo:480082, Sand:DBD3A0, Tan:BB9B63, LightBrown:A0522D, Brown:634B33, DarkBrown:3A2D13, LimeGreen:43B239, SlimeGreen:83CB73, Green:008000, DarkGreen:224D22, GrassGreen:548049, Red:963430, BrickRed:B0604B, NetherBrick:2A1516, Redstone:CE3E36, Black:181515, CharcoalGray:464646, IronGray:646464, Gray:808080, Silver:C0C0C0 - - diff --git a/run-data/config/jei/jei-debug.ini b/run-data/config/jei/jei-debug.ini deleted file mode 100644 index 89c6b8f5f..000000000 --- a/run-data/config/jei/jei-debug.ini +++ /dev/null @@ -1,12 +0,0 @@ -[debug] - # Description: Debug mode enabled - # Valid Values: [true, false] - # Default Value: false - DebugMode = false - - # Description: Debug inputs enabled - # Valid Values: [true, false] - # Default Value: false - DebugInputs = false - - diff --git a/run-data/config/jei/jei-mod-id-format.ini b/run-data/config/jei/jei-mod-id-format.ini deleted file mode 100644 index 05234a802..000000000 --- a/run-data/config/jei/jei-mod-id-format.ini +++ /dev/null @@ -1,11 +0,0 @@ -[modname] - # Description: Formatting for mod name tooltip - # Valid Values: A chat formatting string. - # Use these formatting colors: - # black dark_blue dark_green dark_aqua dark_red dark_purple gold gray dark_gray blue green aqua red light_purple yellow white - # With these formatting options: - # obfuscated bold strikethrough underline italic - # Default Value: blue italic - ModNameFormat = blue italic - - diff --git a/run-data/config/worldstripper/stripper.json b/run-data/config/worldstripper/stripper.json deleted file mode 100644 index 44669b5c1..000000000 --- a/run-data/config/worldstripper/stripper.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "entries": [ - "minecraft:dirt", - "minecraft:grass", - "minecraft:grass_path", - "minecraft:tall_grass", - "minecraft:grass_block", - "minecraft:stone", - "minecraft:diorite", - "minecraft:granite", - "minecraft:andesite", - "minecraft:gravel", - "minecraft:sand", - "minecraft:sandstone", - "minecraft:red_sand", - "minecraft:red_sandstone", - "minecraft:ice", - "minecraft:snow", - "minecraft:snow_block", - "minecraft:powder_snow", - "minecraft:oak_log", - "minecraft:dark_oak_log", - "minecraft:spruce_log", - "minecraft:birch_log", - "minecraft:jungle_log", - "minecraft:acacia_log", - "minecraft:oak_leaves", - "minecraft:dark_oak_leaves", - "minecraft:spruce_leaves", - "minecraft:birch_leaves", - "minecraft:jungle_leaves", - "minecraft:acacia_leaves", - "minecraft:water", - "minecraft:flowing_water", - "minecraft:lava", - "minecraft:flowing_lava", - "minecraft:netherrack", - "minecraft:end_stone", - "minecraft:podzol", - "minecraft:mycelium", - "minecraft:bamboo", - "minecraft:seagrass", - "minecraft:tall_seagrass", - "minecraft:kelp", - "minecraft:kelp_plant", - "minecraft:deepslate", - "minecraft:tuff", - "minecraft:glow_lichen" - ] -} \ No newline at end of file diff --git a/src/generated/resources/assets/malum/lang/en_us.json b/src/generated/resources/assets/malum/lang/en_us.json index ab414ffa5..ce7ced999 100644 --- a/src/generated/resources/assets/malum/lang/en_us.json +++ b/src/generated/resources/assets/malum/lang/en_us.json @@ -1,12 +1,20 @@ { "attribute.name.malum.arcane_resonance": "Arcane Resonance", + "attribute.name.malum.arcane_resonance.desc": "Bonus potency for spirit-collection effects", "attribute.name.malum.malignant_conversion": "Malignant Conversion", + "attribute.name.malum.malignant_conversion.desc": "A percentile conversion rate in which certain magical attributes are converted into armor, armor toughness and magic resistance", "attribute.name.malum.reserve_staff_charges": "Reserve Staff Charges", + "attribute.name.malum.reserve_staff_charges.desc": "A capacity for extra staff charges, replenished overtime, consumed when casting.", "attribute.name.malum.scythe_proficiency": "Scythe Proficiency", + "attribute.name.malum.scythe_proficiency.desc": "Damage multiplier for Scythes", "attribute.name.malum.soul_ward_capacity": "Soul Ward Capacity", + "attribute.name.malum.soul_ward_capacity.desc": "The capacity for Soul Ward", + "attribute.name.malum.soul_ward_integrity": "Soul Ward Integrity", + "attribute.name.malum.soul_ward_integrity.desc": "A percentile increase in durability for Soul Ward", "attribute.name.malum.soul_ward_recovery_rate": "Soul Ward Recovery Rate", - "attribute.name.malum.soul_ward_strength": "Soul Ward Strength", + "attribute.name.malum.soul_ward_recovery_rate.desc": "A percentile increase in recovery rate for Soul Ward", "attribute.name.malum.spirit_spoils": "Spirit Spoils", + "attribute.name.malum.spirit_spoils.desc": "Flat increase to spirits looted from slain foes", "block.malum.aerial_spirited_glass": "Aerial Spirited Glass", "block.malum.aqueous_spirited_glass": "Aqueous Spirited Glass", "block.malum.arcane_spirited_glass": "Arcane Spirited Glass", @@ -300,7 +308,9 @@ "effect.malum.aethers_charm.description": "The heavens call for you, increasing jump height and decreasing gravity.", "effect.malum.anglers_lure": "Angler's Lure", "effect.malum.anglers_lure.description": "Let any fish who meets my gaze learn the true meaning of fear; for I am the harbinger of death. The bane of creatures sub-aqueous, my rod is true and unwavering as I cast into the aquatic abyss. A man, scorned by this uncaring Earth, finds solace in the sea. My only friend, the worm upon my hook. Wriggling, writhing, struggling to surmount the mortal pointlessness that permeates this barren world. I am alone. I am empty. And yet, I fish.", + "effect.malum.arcane_reverberation": "Arcane Reverberation", "effect.malum.cancerous_growth": "Cancerous Growth", + "effect.malum.cancerous_growth.description": "You are emboldened by uncontrolled growth, increasing maximum health.", "effect.malum.earthen_might": "Earthen Might", "effect.malum.earthen_might.description": "Your fists and tools are reinforced with earth, increasing your overall damage.", "effect.malum.gaias_bulwark": "Gaias Bulwark", @@ -308,8 +318,10 @@ "effect.malum.gluttony": "Gluttony", "effect.malum.gluttony.description": "You feed on the vulnerable, increasing scythe proficiency and gradually restoring lost hunger.", "effect.malum.grim_certainty": "Grim Certainty", + "effect.malum.grim_certainty.description": "The Weight of Worlds oscillates, sealing the next strike as a critical blow.", "effect.malum.ifrits_embrace": "Ifrit's Embrace", "effect.malum.ifrits_embrace.description": "The warm embrace of fire coats your soul, mending your seared scars.", + "effect.malum.imminent_deliverance": "Imminent Deliverance", "effect.malum.miners_rage": "Miner's Rage", "effect.malum.miners_rage.description": "Your tools are bolstered with radiance, increasing your mining and attack speed.", "effect.malum.poseidons_grasp": "Poseidon's Grasp", @@ -318,7 +330,9 @@ "effect.malum.rejected": "Rejected", "effect.malum.sacrificial_empowerment": "Sacrificial Empowerment", "effect.malum.silenced": "Silenced", + "effect.malum.silenced.description": "You are silenced, leaving your magical capabilities neutered.", "effect.malum.wicked_intent": "Wicked Intent", + "effect.malum.wicked_intent.description": "You bring forth a powerful counter attack, increasing scythe proficiency for just one strike.", "effect.malum.zephyrs_courage": "Zephyr's Courage", "effect.malum.zephyrs_courage.description": "The zephyr propels you forward, increasing your movement speed.", "enchantment.malum.haunted": "Haunted", @@ -332,6 +346,7 @@ "entity.malum.draining_bolt": "Draining Bolt", "entity.malum.etheric_nitrate": "Etheric Nitrate", "entity.malum.hex_bolt": "Hex Bolt", + "entity.malum.hidden_blade_delayed_impact": "Hidden Blade Delayed Impact", "entity.malum.natural_spirit": "Natural Spirit", "entity.malum.pneuma_void": "Pneuma Void", "entity.malum.runewood_boat": "Runewood Boat", @@ -402,6 +417,7 @@ "item.malum.demigirl_prideweave": "Demigirl Prideweave", "item.malum.dreaded_weave": "Dreaded Weave", "item.malum.earthen_spirit": "Earthen Spirit", + "item.malum.edge_of_deliverance": "Edge of Deliverance", "item.malum.elaborate_brooch": "Elaborate Brooch", "item.malum.eldritch_spirit": "Eldritch Spirit", "item.malum.enby_prideweave": "Enby Prideweave", @@ -478,9 +494,11 @@ "item.malum.ring_of_arcane_prowess": "Ring of Arcane Prowess", "item.malum.ring_of_curative_talent": "Ring of Curative Talent", "item.malum.ring_of_desperate_voracity": "Ring of Desperate Voracity", + "item.malum.ring_of_echoing_arcana": "Ring of Echoing Arcana", "item.malum.ring_of_esoteric_spoils": "Ring of Esoteric Spoils", "item.malum.ring_of_growing_flesh": "Ring of Growing Flesh", "item.malum.ring_of_gruesome_concentration": "Ring of Gruesome Concentration", + "item.malum.ring_of_manaweaving": "Ring of Manaweaving", "item.malum.ring_of_the_demolitionist": "Ring of the Demolitionist", "item.malum.ring_of_the_endless_well": "Ring of the Endless Well", "item.malum.ring_of_the_hoarder": "Ring of the Hoarder", @@ -754,6 +772,7 @@ "malum.gui.book.entry.page.headline.prismatic_focus_lens": "Prismatic Focus Lens", "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_alchemical_mastery": "Ring of Alchemical Mastery", "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_curative_talent": "Ring of Curative Talent", + "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_manaweaving": "Ring of Manaweaving", "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_prowess": "Ring of Prowess", "malum.gui.book.entry.page.headline.ring_of_esoteric_spoils": "Ring of Esoteric Spoils", "malum.gui.book.entry.page.headline.ritual_magic": "Ritual magic", @@ -821,6 +840,7 @@ "malum.gui.book.entry.page.headline.tyrving": "Tyrving", "malum.gui.book.entry.page.headline.void.black_crystal": "A Black Crystal", "malum.gui.book.entry.page.headline.void.catalyst_lobber": "Catalyst Lobber", + "malum.gui.book.entry.page.headline.void.edge_of_deliverance": "The Edge of Deliverance", "malum.gui.book.entry.page.headline.void.erosion_scepter": "Erosion Scepter", "malum.gui.book.entry.page.headline.void.inverse_and_hybrid_arcana": "Theoretical Arcana", "malum.gui.book.entry.page.headline.void.malignant_pewter": "Malignant Pewter", @@ -839,6 +859,7 @@ "malum.gui.book.entry.page.headline.void.material_study_void_salts.reexamination": "Reexamination: Void Salts", "malum.gui.book.entry.page.headline.void.necklace_of_the_hidden_blade": "The Hidden Blade", "malum.gui.book.entry.page.headline.void.necklace_of_the_watcher": "Necklace of the Watcher", + "malum.gui.book.entry.page.headline.void.ring_of_echoing_arcana": "Ring of Echoing Arcana", "malum.gui.book.entry.page.headline.void.ring_of_growing_flesh": "Ring of Growing Flesh", "malum.gui.book.entry.page.headline.void.ring_of_gruesome_concentration": "Gruesome Concentration", "malum.gui.book.entry.page.headline.void.rune_of_bolstering": "Rune of Bolstering", @@ -1005,6 +1026,7 @@ "malum.gui.book.entry.page.text.prismatic_focus_lens.1": "Sometimes, simplicity is the best goal. The Prismatic Focus Lens bends not light, but the flow of arcana, reducing instability of the spirit focusing process. It is important to note, stability can only prevent the impetus from suffering $iadditional/$ damage.", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_alchemical_mastery.1": "This ring, through alchemical trickery, is able to manipulate the potions running through my blood. Whenever I collect arcana, the ring will partially filter out negative effects, while at the same time prolonging positive ones.", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_curative_talent.1": "The trinkets documented within cause effects whenever a spirit crystal is collected, feeding off the excess energy. As an example, this restorative trinket will replenish a small division of my health any time I collect arcana.", + "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_manaweaving.1": "Soul Ward is a powerful barrier, but in it's current state it leaves much to be desired. One of it's glaring issues is the burdensome recovery time. To combat this, I've created a ring that in reaction to spirit arcana accelerates the recovery process of Soul Ward", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_prowess.1": "Brilliance is attached to the soul, but isn't an impulse like the arcana. It is accumulated knowledge, and so is not inherently tied to the soul that learned it. Even strikes which pass through the soul harmlessly are capable of dislodging it.", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_prowess.2": "By using condensed Brilliance, I have created a ring that filters out that Brilliance out of arcana I collect, giving me a burst of Brilliant knowledge whenever I collect arcana.", "malum.gui.book.entry.page.text.ring_of_esoteric_spoils.1": "It can be tiring, harvesting the sheer quantities of arcana I need for my research. This ring can increase the efficiency of the harvest, allowing me to reap an additional spirit from every slain soul. At a certain point, though, \"efficiency\" ceases to explain it. How am I obtaining more power than the soul itself has?", @@ -1104,6 +1126,8 @@ "malum.gui.book.entry.page.text.void.catalyst_lobber.1": "The flame of progress is a potent one, which bulldozes everything in its search for advancement. There had to be a destructive way to harness it, and so there was.", "malum.gui.book.entry.page.text.void.catalyst_lobber.2": "I've created a device out of a pair of lamplighter's tongs I call the Catalyst Lobber. It \"unlocks\" Auric Embers by retuning them, turning their flame from a gentle one into an explosive blaze, containing the result until it's ready to fire.", "malum.gui.book.entry.page.text.void.catalyst_lobber.3": "I implemented a safety, because... well, I don't want to rebuild my lab again. The flames are violently explosive. Standard explosive precautions work just as well, such as obsidian, of course.", + "malum.gui.book.entry.page.text.void.edge_of_deliverance.1": "Progress can be revoked, and crude can overcome grand. But progress can be undone by progress, can it not? A scythe, familiar in ways the axe was not, which I name the Edge of Deliverance. It is the true opposite - where the Weight of Worlds is sharp and heavy, the Edge is thin and winding.", + "malum.gui.book.entry.page.text.void.edge_of_deliverance.2": "This focuses the inconsistent force of the Weight of Worlds, seeking slaughter to wet the blade. Instead, a single attack's taste of blood empowers the scythe, creating an alternating pattern of killing strength.", "malum.gui.book.entry.page.text.void.erosion_scepter.1": "A new false arcana has been created, using Malignant Pewter as a focus. In its corrosive reversal, the metal serves entropy - and so Eldritch answers its call. Like other uses of the metal, the resulting crystal in its Void Salt suspension seeks to unwind what humanity has wrought.", "malum.gui.book.entry.page.text.void.erosion_scepter.2": "The Erosion Scepter, made using this false crystal, is a staff which fires bolts of a crawling, corruptive substance - almost like Blight or the Void Salt used in its creation. Each charge fires two volleys, each of four bolts. These bolts chew away at the souls of their victims, which, delightfully, appears to inhibit the use of magic for a time.", "malum.gui.book.entry.page.text.void.erosion_scepter.3": "Each bolt applies another layer of this effect, reducing the effective magical might and soul force of the target by a tenth. Naturally, this can stack up to a complete seal on the target, and every application reinforces and lengthens the durations of the others.", @@ -1140,8 +1164,11 @@ "malum.gui.book.entry.page.text.void.material_study_void_salts.1": "When passed through the Well, Hex Ash is reduced to a substance I call Void Salt. This dark powder appears to be chemically similar to Hex Ash, but without the carbonization that gives the Ash its name.", "malum.gui.book.entry.page.text.void.material_study_void_salts.2": "It appears to be comprised of an unknown and unstable metal, bonded to something caustic I cannot identify. It is baffling beyond the physical, though. Carbon is the basis of life, and yet removing carbon makes this substance... almost seem to move? I haven't been able to verify that experimentally, but I could swear that the material is alive and shifting.", "malum.gui.book.entry.page.text.void.material_study_void_salts.reexamination.1": "The fact that $iabsence/$ is creating $ipresence/$ implies Umbral. Perhaps it $iis/$ alive... but with life defined by deeper nothingness instead of the presence of matter. Might this indicate there is more complex life adapted to the Void?", - "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.1": "The Narrow Edge concentrates my scythe's edge, but the Hidden Blade goes further, inverting the edge and making it hunger. I lose the sweeping attack, yes, but as I am harmed, the blade drinks of my pain, intensifying my next strike.", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.1": "The Narrow Edge concentrates my scythe's edge, but the Hidden Blade goes further, inverting the edge and making it hunger. I lose the sweeping attack, yes, but as I am harmed, the blade drinks of my pain- feeding upon it to enable a seemingly impossible flurry of cuts and slashes.", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.2": "Upon activation, the necklace remains inert for a total of ten seconds, requiring rest and concentration in order to recover it's effect. Attacking at any point in this state will prolong this absence of function.", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.3": "The counterattack's nature is a strange one, one I have not fully identified. It is as though the blade asserts its existence in multiple places at once, demanding reality make it so.", "malum.gui.book.entry.page.text.void.necklace_of_the_watcher.1": "Souls emit energy when damaged, not merely when shattered. This necklace allows me to harness that energy, causing effects that normally only occur when I collect a spirit to also happen when I strike an enemy at full health.", + "malum.gui.book.entry.page.text.void.ring_of_echoing_arcana.1": "Overclocking the Ring of Curative Talent created a useful ring, so I have applied that principle to another ring, Manaweaving, to not only bind, but create resonance in magic. The Ring of Echoing Arcana grants Arcane Resonance whenever I collect a spirit crystal, empowering all my other spirit-collection effects.", "malum.gui.book.entry.page.text.void.ring_of_growing_flesh.1": "I have overclocked the Ring of Curative Talent, creating a ring that does not simply heal, but overheal, granting additional health instead of regeneration whenever I collect a spirit crystal.", "malum.gui.book.entry.page.text.void.ring_of_gruesome_concentration.1": "Why would Gluttony be restricted to the collection of spirits? By eating foul food, I can make myself hungrier, and so cultivate and concentrate what remains, increasing my magical might even as I starve.", "malum.gui.book.entry.page.text.void.rune_of_bolstering.1": "The Rune of Bolstering does not heal like its counterpart. Instead, it forces the body to heal past its limits, granting a small amount of extra health.", @@ -1280,6 +1307,8 @@ "malum.gui.book.entry.void.black_crystal.description": "A mistake, or a boon?", "malum.gui.book.entry.void.catalyst_lobber": "Catalyst Lobber", "malum.gui.book.entry.void.catalyst_lobber.description": "Progress overtakes", + "malum.gui.book.entry.void.edge_of_deliverance": "The Edge of Deliverance", + "malum.gui.book.entry.void.edge_of_deliverance.description": "A mad screamer's melody", "malum.gui.book.entry.void.erosion_scepter": "Erosion Scepter", "malum.gui.book.entry.void.erosion_scepter.description": "May mages fear my might", "malum.gui.book.entry.void.inverse_and_hybrid_arcana": "Inverse and Hybrid Arcana?", @@ -1316,6 +1345,8 @@ "malum.gui.book.entry.void.necklace_of_the_hidden_blade.description": "A knife at their backs", "malum.gui.book.entry.void.necklace_of_the_watcher": "Necklace of the Watcher", "malum.gui.book.entry.void.necklace_of_the_watcher.description": "It looks back", + "malum.gui.book.entry.void.ring_of_echoing_arcana": "Ring of Echoing Arcana", + "malum.gui.book.entry.void.ring_of_echoing_arcana.description": "I can see see the future $ifuture future/$", "malum.gui.book.entry.void.ring_of_growing_flesh": "Ring of Growing Flesh", "malum.gui.book.entry.void.ring_of_growing_flesh.description": "Creeping and crawling", "malum.gui.book.entry.void.ring_of_gruesome_concentration": "Ring of Gruesome Concentration", @@ -1382,6 +1413,7 @@ "malum.gui.curio.effect.hunger_drain": "Actively Drains Hunger", "malum.gui.curio.effect.low_health_speed": "Speed at Low Health", "malum.gui.curio.effect.no_sweep": "Disables Scythe Sweeping", + "malum.gui.curio.effect.pacifist_recharge": "Cooldown Extends if the Scythe is Used", "malum.gui.curio.effect.passive_healing": "Passive Healing", "malum.gui.curio.effect.rotten_gluttony": "Eating Rotten Food Generates Gluttony", "malum.gui.curio.effect.scythe_chain": "Scythe Kill Chaining", @@ -1391,9 +1423,12 @@ "malum.gui.curio.effect.soul_ward_magic_resilience": "Soul Ward Magic Resilience", "malum.gui.curio.effect.soul_ward_physical_absorption": "Soul Ward Absorbs Physical Damage Equally to Magic Damage", "malum.gui.curio.effect.spirits_add_health": "Spirit Collection Grants Extra Hearts", + "malum.gui.curio.effect.spirits_buff_spirit_collection": "Spirit Collection Generates Arcane Resonance", "malum.gui.curio.effect.spirits_extend_effect": "Spirit Collection Aids Potion Durations", "malum.gui.curio.effect.spirits_gluttony": "Spirit Collection Generates Gluttony", "malum.gui.curio.effect.spirits_heal": "Spirit Collection Replenishes Health", + "malum.gui.curio.effect.spirits_weave_mana": "Spirit Collection Recovers Soul Ward", + "malum.gui.curio.effect.spirits_weave_mana_irons_spellbooks": "Also Recovers Iron's Spellbooks' Mana", "malum.gui.curio.effect.spirits_xp": "Spirit Collection Generates Experience Points", "malum.gui.curio.negative": "-%s", "malum.gui.curio.positive": "+%s", @@ -1538,6 +1573,9 @@ "malum.subtitle.deepslate_soulstone_place": "Block placed", "malum.subtitle.deepslate_soulstone_step": "Footsteps", "malum.subtitle.draining_motif": "Draining motif", + "malum.subtitle.echoing_ring_absorbs": "Echoing ring absorbs", + "malum.subtitle.edge_of_deliverance_cuts": "Edge of deliverance cuts", + "malum.subtitle.edge_of_deliverance_sweeps": "Edge of deliverance sweeps", "malum.subtitle.ether_break": "Block broken", "malum.subtitle.ether_place": "Block placed", "malum.subtitle.flesh_ring_absorbs": "Flesh ring absorbs", @@ -1547,10 +1585,13 @@ "malum.subtitle.hallowed_gold_hit": "Block breaking", "malum.subtitle.hallowed_gold_place": "Block placed", "malum.subtitle.hallowed_gold_step": "Footsteps", - "malum.subtitle.hidden_blade_strikes": "Hidden blade strikes", + "malum.subtitle.hidden_blade_charged": "Hidden blade charged", + "malum.subtitle.hidden_blade_disrupted": "Hidden blade disrupted", + "malum.subtitle.hidden_blade_primed": "Hidden blade primed", + "malum.subtitle.hidden_blade_unleashed": "Hidden blade unleashed", "malum.subtitle.hungry_belt_feeds": "Hungry belt feeds", "malum.subtitle.impetus_takes_damage": "Impetus takes damage", - "malum.subtitle.malignant_metal_resonates": "Malignant metal resonates", + "malum.subtitle.malignant_metal_motif": "Malignant metal motif", "malum.subtitle.metallic_trinket_equipped": "Metallic trinket equipped", "malum.subtitle.ornate_trinket_equipped": "Ornate trinket equipped", "malum.subtitle.pedestal_item_inserted": "Pedestal item inserted", @@ -1562,6 +1603,9 @@ "malum.subtitle.quartz_cluster_block_place": "Block placed", "malum.subtitle.quartz_cluster_block_step": "Footsteps", "malum.subtitle.rejected_by_the_unknown": "Rejected by the unknown", + "malum.subtitle.repair_pylon_begins_repairing": "Repair pylon begins repairing", + "malum.subtitle.repair_pylon_eagerly_hums": "Repair pylon eagerly hums", + "malum.subtitle.repair_pylon_finishes_repairing": "Repair pylon finishes repairing", "malum.subtitle.ritual_absorbs_item": "Ritual absorbs item", "malum.subtitle.ritual_absorbs_spirit": "Ritual absorbs spirit", "malum.subtitle.ritual_beginning_ambience": "Ritual beginning ambience", @@ -1595,7 +1639,11 @@ "malum.subtitle.runewood_trapdoor_close": "Runewood trapdoor close", "malum.subtitle.runewood_trapdoor_open": "Runewood trapdoor open", "malum.subtitle.runic_workbench_crafts": "Runic workbench crafts", + "malum.subtitle.scythe_caught": "Scythe caught", "malum.subtitle.scythe_cuts": "Scythe cuts", + "malum.subtitle.scythe_spins_happily": "Scythe spins happily", + "malum.subtitle.scythe_sweeps": "Scythe sweeps", + "malum.subtitle.scythe_thrown": "Scythe thrown", "malum.subtitle.shielding_apparatus_shields": "Shielding apparatus shields", "malum.subtitle.song_of_the_void": "Song of the void", "malum.subtitle.soul_stained_steel_break": "Block broken", @@ -1654,14 +1702,14 @@ "malum.subtitle.the_void_heart_beats": "The void heart beats", "malum.subtitle.totem_charges": "Totem charges", "malum.subtitle.tuning_fork_tinkers": "Tuning fork tinkers", + "malum.subtitle.tyrving_slashes_twice": "Tyrving slashes twice", "malum.subtitle.void_eats_gunk": "Void eats gunk", - "malum.subtitle.void_slash_swooshes": "Void slash swooshes", "malum.subtitle.void_transmutation": "Void transmutation", "malum.subtitle.void_trinket_equipped": "Void trinket equipped", "malum.subtitle.voracious_ring_feeds": "Voracious ring feeds", "malum.subtitle.warping_engine_reverberates": "Warping engine reverberates", - "malum.subtitle.weight_of_worlds_slashes": "Weight of worlds slashes", - "tetra.improvement.malum.soul_strike.description": "Allows your item to shatter souls.", + "malum.subtitle.weight_of_worlds_cuts": "Weight of worlds cuts", + "tetra.improvement.malum.soul_strike.description": "The item's material allows it to strike the soul.", "tetra.improvement.malum.soul_strike.name": "Soul Strike", "tetra.material.hallowed_gold": "Hallowed Gold", "tetra.material.hallowed_gold.prefix": "Hallowed Gold", diff --git a/src/generated/resources/assets/malum/models/item/ring_of_echoing_arcana.json b/src/generated/resources/assets/malum/models/item/ring_of_echoing_arcana.json new file mode 100644 index 000000000..baaac07b9 --- /dev/null +++ b/src/generated/resources/assets/malum/models/item/ring_of_echoing_arcana.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "malum:item/ring_of_echoing_arcana" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/malum/models/item/ring_of_manaweaving.json b/src/generated/resources/assets/malum/models/item/ring_of_manaweaving.json new file mode 100644 index 000000000..ebbe63594 --- /dev/null +++ b/src/generated/resources/assets/malum/models/item/ring_of_manaweaving.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "malum:item/ring_of_manaweaving" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/curios/tags/items/ring.json b/src/generated/resources/data/curios/tags/items/ring.json index 0325cf4d6..81a2983c8 100644 --- a/src/generated/resources/data/curios/tags/items/ring.json +++ b/src/generated/resources/data/curios/tags/items/ring.json @@ -5,11 +5,13 @@ "malum:ring_of_esoteric_spoils", "malum:ring_of_curative_talent", "malum:ring_of_arcane_prowess", + "malum:ring_of_manaweaving", "malum:ring_of_alchemical_mastery", "malum:ring_of_desperate_voracity", "malum:ring_of_the_hoarder", "malum:ring_of_the_demolitionist", "malum:ring_of_the_endless_well", + "malum:ring_of_echoing_arcana", "malum:ring_of_growing_flesh", "malum:ring_of_gruesome_concentration" ] diff --git a/src/generated/resources/data/forge/tags/damage_type/can_trigger_magic_damage.json b/src/generated/resources/data/forge/tags/damage_type/can_trigger_magic_damage.json new file mode 100644 index 000000000..21130cd0c --- /dev/null +++ b/src/generated/resources/data/forge/tags/damage_type/can_trigger_magic_damage.json @@ -0,0 +1,6 @@ +{ + "values": [ + "malum:scythe_melee", + "malum:scythe_sweep" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/ether_torch_alternative.json b/src/generated/resources/data/malum/advancements/recipes/ether_torch_alternative.json similarity index 85% rename from src/generated/resources/data/minecraft/advancements/recipes/ether_torch_alternative.json rename to src/generated/resources/data/malum/advancements/recipes/ether_torch_alternative.json index bbc6e271b..9e29da3e5 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/ether_torch_alternative.json +++ b/src/generated/resources/data/malum/advancements/recipes/ether_torch_alternative.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:ether_torch_alternative" + "recipe": "malum:ether_torch_alternative" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:ether_torch_alternative" + "malum:ether_torch_alternative" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/advancements/recipes/iridescent_ether_torch_alternative.json b/src/generated/resources/data/malum/advancements/recipes/iridescent_ether_torch_alternative.json similarity index 82% rename from src/generated/resources/data/minecraft/advancements/recipes/iridescent_ether_torch_alternative.json rename to src/generated/resources/data/malum/advancements/recipes/iridescent_ether_torch_alternative.json index 5010709b1..d57c93440 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/iridescent_ether_torch_alternative.json +++ b/src/generated/resources/data/malum/advancements/recipes/iridescent_ether_torch_alternative.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:iridescent_ether_torch_alternative" + "recipe": "malum:iridescent_ether_torch_alternative" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:iridescent_ether_torch_alternative" + "malum:iridescent_ether_torch_alternative" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/advancements/recipes/tainted_ether_brazier.json b/src/generated/resources/data/malum/advancements/recipes/tainted_ether_brazier.json similarity index 85% rename from src/generated/resources/data/minecraft/advancements/recipes/tainted_ether_brazier.json rename to src/generated/resources/data/malum/advancements/recipes/tainted_ether_brazier.json index 799c938d6..ca46ad070 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/tainted_ether_brazier.json +++ b/src/generated/resources/data/malum/advancements/recipes/tainted_ether_brazier.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:tainted_ether_brazier" + "recipe": "malum:tainted_ether_brazier" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:tainted_ether_brazier" + "malum:tainted_ether_brazier" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/advancements/recipes/tainted_iridescent_ether_brazier.json b/src/generated/resources/data/malum/advancements/recipes/tainted_iridescent_ether_brazier.json similarity index 82% rename from src/generated/resources/data/minecraft/advancements/recipes/tainted_iridescent_ether_brazier.json rename to src/generated/resources/data/malum/advancements/recipes/tainted_iridescent_ether_brazier.json index ff5de6bf3..a8045fc74 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/tainted_iridescent_ether_brazier.json +++ b/src/generated/resources/data/malum/advancements/recipes/tainted_iridescent_ether_brazier.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:tainted_iridescent_ether_brazier" + "recipe": "malum:tainted_iridescent_ether_brazier" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:tainted_iridescent_ether_brazier" + "malum:tainted_iridescent_ether_brazier" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/advancements/recipes/twisted_ether_brazier.json b/src/generated/resources/data/malum/advancements/recipes/twisted_ether_brazier.json similarity index 85% rename from src/generated/resources/data/minecraft/advancements/recipes/twisted_ether_brazier.json rename to src/generated/resources/data/malum/advancements/recipes/twisted_ether_brazier.json index ac12cc3c8..bdf8c5ae7 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/twisted_ether_brazier.json +++ b/src/generated/resources/data/malum/advancements/recipes/twisted_ether_brazier.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:twisted_ether_brazier" + "recipe": "malum:twisted_ether_brazier" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:twisted_ether_brazier" + "malum:twisted_ether_brazier" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/advancements/recipes/twisted_iridescent_ether_brazier.json b/src/generated/resources/data/malum/advancements/recipes/twisted_iridescent_ether_brazier.json similarity index 82% rename from src/generated/resources/data/minecraft/advancements/recipes/twisted_iridescent_ether_brazier.json rename to src/generated/resources/data/malum/advancements/recipes/twisted_iridescent_ether_brazier.json index a46daa4a2..a23c7aba0 100644 --- a/src/generated/resources/data/minecraft/advancements/recipes/twisted_iridescent_ether_brazier.json +++ b/src/generated/resources/data/malum/advancements/recipes/twisted_iridescent_ether_brazier.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "minecraft:twisted_iridescent_ether_brazier" + "recipe": "malum:twisted_iridescent_ether_brazier" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "minecraft:twisted_iridescent_ether_brazier" + "malum:twisted_iridescent_ether_brazier" ] }, "sends_telemetry_event": true diff --git a/src/generated/resources/data/minecraft/recipes/ether_torch_alternative.json b/src/generated/resources/data/malum/recipes/ether_torch_alternative.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/ether_torch_alternative.json rename to src/generated/resources/data/malum/recipes/ether_torch_alternative.json diff --git a/src/generated/resources/data/minecraft/recipes/iridescent_ether_torch_alternative.json b/src/generated/resources/data/malum/recipes/iridescent_ether_torch_alternative.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/iridescent_ether_torch_alternative.json rename to src/generated/resources/data/malum/recipes/iridescent_ether_torch_alternative.json diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/belt_of_the_limitless.json b/src/generated/resources/data/malum/recipes/spirit_infusion/belt_of_the_limitless.json index 0933276f1..931c714cd 100644 --- a/src/generated/resources/data/malum/recipes/spirit_infusion/belt_of_the_limitless.json +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/belt_of_the_limitless.json @@ -27,11 +27,11 @@ }, "spirits": [ { - "type": "wicked", - "count": 32 + "type": "arcane", + "count": 64 }, { - "type": "arcane", + "type": "wicked", "count": 32 }, { diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/edge_of_deliverance.json b/src/generated/resources/data/malum/recipes/spirit_infusion/edge_of_deliverance.json new file mode 100644 index 000000000..58e82a62f --- /dev/null +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/edge_of_deliverance.json @@ -0,0 +1,30 @@ +{ + "type": "malum:spirit_infusion", + "extra_items": [ + { + "count": 2, + "item": "malum:malignant_pewter_ingot" + } + ], + "input": { + "count": 1, + "item": "malum:soul_stained_steel_scythe" + }, + "output": { + "item": "malum:edge_of_deliverance" + }, + "spirits": [ + { + "type": "earthen", + "count": 32 + }, + { + "type": "wicked", + "count": 32 + }, + { + "type": "eldritch", + "count": 16 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_echoing_arcana.json b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_echoing_arcana.json new file mode 100644 index 000000000..463102cd0 --- /dev/null +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_echoing_arcana.json @@ -0,0 +1,38 @@ +{ + "type": "malum:spirit_infusion", + "extra_items": [ + { + "count": 16, + "item": "malum:null_slate" + }, + { + "count": 8, + "item": "malum:mnemonic_fragment" + } + ], + "input": { + "count": 1, + "item": "malum:ring_of_manaweaving" + }, + "output": { + "item": "malum:ring_of_echoing_arcana" + }, + "spirits": [ + { + "type": "aqueous", + "count": 32 + }, + { + "type": "arcane", + "count": 16 + }, + { + "type": "wicked", + "count": 16 + }, + { + "type": "eldritch", + "count": 8 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_growing_flesh.json b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_growing_flesh.json index 35f7b861b..cafe13a7f 100644 --- a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_growing_flesh.json +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_growing_flesh.json @@ -32,7 +32,7 @@ }, { "type": "eldritch", - "count": 16 + "count": 8 } ] } \ No newline at end of file diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_gruesome_concentration.json b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_gruesome_concentration.json index 3263f6f48..3167fb45f 100644 --- a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_gruesome_concentration.json +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_gruesome_concentration.json @@ -32,7 +32,7 @@ }, { "type": "eldritch", - "count": 16 + "count": 8 } ] } \ No newline at end of file diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_manaweaving.json b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_manaweaving.json new file mode 100644 index 000000000..b1d141c03 --- /dev/null +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_manaweaving.json @@ -0,0 +1,30 @@ +{ + "type": "malum:spirit_infusion", + "extra_items": [ + { + "count": 6, + "item": "malum:soul_stained_steel_plating" + }, + { + "count": 4, + "item": "malum:processed_soulstone" + } + ], + "input": { + "count": 1, + "item": "malum:gilded_ring" + }, + "output": { + "item": "malum:ring_of_manaweaving" + }, + "spirits": [ + { + "type": "arcane", + "count": 16 + }, + { + "type": "earthen", + "count": 16 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_the_endless_well.json b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_the_endless_well.json index 923e7edc8..e149cac62 100644 --- a/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_the_endless_well.json +++ b/src/generated/resources/data/malum/recipes/spirit_infusion/ring_of_the_endless_well.json @@ -2,7 +2,7 @@ "type": "malum:spirit_infusion", "extra_items": [ { - "count": 8, + "count": 16, "item": "malum:null_slate" }, { diff --git a/src/generated/resources/data/minecraft/recipes/tainted_ether_brazier.json b/src/generated/resources/data/malum/recipes/tainted_ether_brazier.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/tainted_ether_brazier.json rename to src/generated/resources/data/malum/recipes/tainted_ether_brazier.json diff --git a/src/generated/resources/data/minecraft/recipes/tainted_iridescent_ether_brazier.json b/src/generated/resources/data/malum/recipes/tainted_iridescent_ether_brazier.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/tainted_iridescent_ether_brazier.json rename to src/generated/resources/data/malum/recipes/tainted_iridescent_ether_brazier.json diff --git a/src/generated/resources/data/minecraft/recipes/twisted_ether_brazier.json b/src/generated/resources/data/malum/recipes/twisted_ether_brazier.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/twisted_ether_brazier.json rename to src/generated/resources/data/malum/recipes/twisted_ether_brazier.json diff --git a/src/generated/resources/data/minecraft/recipes/twisted_iridescent_ether_brazier.json b/src/generated/resources/data/malum/recipes/twisted_iridescent_ether_brazier.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/twisted_iridescent_ether_brazier.json rename to src/generated/resources/data/malum/recipes/twisted_iridescent_ether_brazier.json diff --git a/src/generated/resources/data/malum/tags/damage_type/can_soul_shatter.json b/src/generated/resources/data/malum/tags/damage_type/can_soul_shatter.json index 8daf147fe..b4f828679 100644 --- a/src/generated/resources/data/malum/tags/damage_type/can_soul_shatter.json +++ b/src/generated/resources/data/malum/tags/damage_type/can_soul_shatter.json @@ -1,6 +1,44 @@ { "values": [ + "malum:scythe_melee", "malum:voodoo", - "malum:scythe_sweep" + "malum:scythe_sweep", + "malum:hidden_blade_counter", + { + "id": "irons_spellbooks:blood_magic", + "required": false + }, + { + "id": "irons_spellbooks:eldritch_magic", + "required": false + }, + { + "id": "irons_spellbooks:ender_magic", + "required": false + }, + { + "id": "irons_spellbooks:evocation_magic", + "required": false + }, + { + "id": "irons_spellbooks:fire_magic", + "required": false + }, + { + "id": "irons_spellbooks:holy_magic", + "required": false + }, + { + "id": "irons_spellbooks:ice_magic", + "required": false + }, + { + "id": "irons_spellbooks:lightning_magic", + "required": false + }, + { + "id": "irons_spellbooks:nature_magic", + "required": false + } ] } \ No newline at end of file diff --git a/src/generated/resources/data/malum/tags/damage_type/is_scythe.json b/src/generated/resources/data/malum/tags/damage_type/is_scythe.json new file mode 100644 index 000000000..4990eed65 --- /dev/null +++ b/src/generated/resources/data/malum/tags/damage_type/is_scythe.json @@ -0,0 +1,7 @@ +{ + "values": [ + "malum:scythe_melee", + "malum:scythe_sweep", + "malum:hidden_blade_counter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/tags/damage_type/is_scythe_melee.json b/src/generated/resources/data/malum/tags/damage_type/is_scythe_melee.json new file mode 100644 index 000000000..21130cd0c --- /dev/null +++ b/src/generated/resources/data/malum/tags/damage_type/is_scythe_melee.json @@ -0,0 +1,6 @@ +{ + "values": [ + "malum:scythe_melee", + "malum:scythe_sweep" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/tags/items/aspected_spirits.json b/src/generated/resources/data/malum/tags/items/aspected_spirits.json new file mode 100644 index 000000000..57eb5fc5b --- /dev/null +++ b/src/generated/resources/data/malum/tags/items/aspected_spirits.json @@ -0,0 +1,12 @@ +{ + "values": [ + "malum:sacred_spirit", + "malum:wicked_spirit", + "malum:arcane_spirit", + "malum:eldritch_spirit", + "malum:aerial_spirit", + "malum:aqueous_spirit", + "malum:earthen_spirit", + "malum:infernal_spirit" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/tags/items/hidden_items/black_crystal.json b/src/generated/resources/data/malum/tags/items/hidden_items/black_crystal.json index 8d9e80ea8..1b70b0284 100644 --- a/src/generated/resources/data/malum/tags/items/hidden_items/black_crystal.json +++ b/src/generated/resources/data/malum/tags/items/hidden_items/black_crystal.json @@ -27,6 +27,7 @@ "malum:rune_of_igneous_solace", "malum:ring_of_the_endless_well", "malum:ring_of_growing_flesh", + "malum:ring_of_echoing_arcana", "malum:ring_of_gruesome_concentration", "malum:necklace_of_the_hidden_blade", "malum:necklace_of_the_watcher", diff --git a/src/generated/resources/data/malum/tags/items/spirit.json b/src/generated/resources/data/malum/tags/items/spirit.json new file mode 100644 index 000000000..988e6b948 --- /dev/null +++ b/src/generated/resources/data/malum/tags/items/spirit.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#malum:aspected_spirits", + "malum:umbral_spirit" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/malum/worldgen/placed_feature/azure_runewood_tree.json b/src/generated/resources/data/malum/worldgen/placed_feature/azure_runewood_tree.json index 7d2435a93..5c84ac8f8 100644 --- a/src/generated/resources/data/malum/worldgen/placed_feature/azure_runewood_tree.json +++ b/src/generated/resources/data/malum/worldgen/placed_feature/azure_runewood_tree.json @@ -7,7 +7,7 @@ }, { "type": "minecraft:rarity_filter", - "chance": 12 + "chance": 16 }, { "type": "minecraft:in_square" diff --git a/src/generated/resources/data/malum/worldgen/placed_feature/cthonic_gold_ore.json b/src/generated/resources/data/malum/worldgen/placed_feature/cthonic_gold_ore.json index 0dd00c9ab..74f5353dd 100644 --- a/src/generated/resources/data/malum/worldgen/placed_feature/cthonic_gold_ore.json +++ b/src/generated/resources/data/malum/worldgen/placed_feature/cthonic_gold_ore.json @@ -25,7 +25,7 @@ }, { "type": "minecraft:rarity_filter", - "chance": 3 + "chance": 2 } ] } \ No newline at end of file diff --git a/src/generated/resources/data/malum/worldgen/placed_feature/rare_azure_runewood_tree.json b/src/generated/resources/data/malum/worldgen/placed_feature/rare_azure_runewood_tree.json index 13b12c39e..0ac8e26cc 100644 --- a/src/generated/resources/data/malum/worldgen/placed_feature/rare_azure_runewood_tree.json +++ b/src/generated/resources/data/malum/worldgen/placed_feature/rare_azure_runewood_tree.json @@ -7,7 +7,7 @@ }, { "type": "minecraft:rarity_filter", - "chance": 20 + "chance": 24 }, { "type": "minecraft:in_square" diff --git a/src/generated/resources/data/malum/worldgen/placed_feature/rare_runewood_tree.json b/src/generated/resources/data/malum/worldgen/placed_feature/rare_runewood_tree.json index 616d5082b..52288a6e9 100644 --- a/src/generated/resources/data/malum/worldgen/placed_feature/rare_runewood_tree.json +++ b/src/generated/resources/data/malum/worldgen/placed_feature/rare_runewood_tree.json @@ -7,7 +7,7 @@ }, { "type": "minecraft:rarity_filter", - "chance": 16 + "chance": 20 }, { "type": "minecraft:in_square" diff --git a/src/generated/resources/data/malum/worldgen/placed_feature/runewood_tree.json b/src/generated/resources/data/malum/worldgen/placed_feature/runewood_tree.json index e4b01b3d3..a4d5a9359 100644 --- a/src/generated/resources/data/malum/worldgen/placed_feature/runewood_tree.json +++ b/src/generated/resources/data/malum/worldgen/placed_feature/runewood_tree.json @@ -7,14 +7,14 @@ }, { "type": "minecraft:rarity_filter", - "chance": 8 + "chance": 12 }, { "type": "minecraft:in_square" }, { "type": "minecraft:count", - "count": 3 + "count": 2 } ] } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/MalumMod.java b/src/main/java/com/sammy/malum/MalumMod.java index df1a8f28b..2fc46fbf5 100644 --- a/src/main/java/com/sammy/malum/MalumMod.java +++ b/src/main/java/com/sammy/malum/MalumMod.java @@ -1,6 +1,8 @@ package com.sammy.malum; +import com.sammy.malum.compability.attributelib.*; import com.sammy.malum.compability.farmersdelight.*; +import com.sammy.malum.compability.irons_spellbooks.*; import com.sammy.malum.compability.tetra.*; import com.sammy.malum.config.*; import com.sammy.malum.registry.common.item.tabs.*; @@ -60,6 +62,8 @@ public MalumMod() { TetraCompat.init(); FarmersDelightCompat.init(); + AttributeLibCompat.init(); + IronsSpellsCompat.init(); modBus.addListener(CreativeTabRegistry::populateItemGroups); } diff --git a/src/main/java/com/sammy/malum/client/PointyDirectionalBehaviorComponent.java b/src/main/java/com/sammy/malum/client/PointyDirectionalBehaviorComponent.java new file mode 100644 index 000000000..34505f433 --- /dev/null +++ b/src/main/java/com/sammy/malum/client/PointyDirectionalBehaviorComponent.java @@ -0,0 +1,36 @@ +package com.sammy.malum.client; + +import net.minecraft.world.phys.*; +import team.lodestar.lodestone.systems.particle.world.*; +import team.lodestar.lodestone.systems.particle.world.behaviors.*; +import team.lodestar.lodestone.systems.particle.world.behaviors.components.*; + +import java.util.function.*; + +public class PointyDirectionalBehaviorComponent implements LodestoneBehaviorComponent { + + //TODO: move this to lodestone + public static PointyDirectionalBehaviorComponent DIRECTIONAL = new PointyDirectionalBehaviorComponent(); + private final Function direction; + + protected PointyDirectionalBehaviorComponent(Function direction) { + this.direction = direction; + } + + public PointyDirectionalBehaviorComponent(Vec3 direction) { + this(p -> direction); + } + + public PointyDirectionalBehaviorComponent() { + this(p -> p.getParticleSpeed().normalize()); + } + + public Vec3 getDirection(LodestoneWorldParticle particle) { + return direction.apply(particle); + } + + @Override + public LodestoneParticleBehavior getBehaviorType() { + return PointyDirectionalParticleBehavior.DIRECTIONAL; + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/client/PointyDirectionalParticleBehavior.java b/src/main/java/com/sammy/malum/client/PointyDirectionalParticleBehavior.java new file mode 100644 index 000000000..43eaa7c62 --- /dev/null +++ b/src/main/java/com/sammy/malum/client/PointyDirectionalParticleBehavior.java @@ -0,0 +1,85 @@ +package com.sammy.malum.client; + +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.*; +import net.minecraft.util.*; +import net.minecraft.world.phys.*; +import org.joml.*; +import team.lodestar.lodestone.systems.particle.world.*; +import team.lodestar.lodestone.systems.particle.world.behaviors.*; +import team.lodestar.lodestone.systems.particle.world.behaviors.components.*; + +import java.lang.*; +import java.lang.Math; + +public class PointyDirectionalParticleBehavior implements LodestoneParticleBehavior { + + //TODO: move this to lodestone + public static LodestoneParticleBehavior DIRECTIONAL = new PointyDirectionalParticleBehavior(); + + protected PointyDirectionalParticleBehavior() { + } + + @Override + public PointyDirectionalBehaviorComponent getComponent(LodestoneBehaviorComponent component) { + return component instanceof PointyDirectionalBehaviorComponent directional ? directional : PointyDirectionalBehaviorComponent.DIRECTIONAL; + } + + @Override + public void render(LodestoneWorldParticle particle, VertexConsumer consumer, Camera camera, float partialTicks) { + var component = getComponent(particle.behaviorComponent); + var direction = component.getDirection(particle); + float yRot = ((float) (Mth.atan2(direction.x, direction.z) * (double) (180F / (float) Math.PI))); + float xRot = ((float) (Mth.atan2(direction.y, direction.horizontalDistance()) * (double) (180F / (float) Math.PI))); + float yaw = (float) Math.toRadians(yRot - 90); + float pitch = (float) Math.toRadians(xRot); + Quaternionf quaternion = new Quaternionf(0.0F, 0.0F, 0.0F, 1.0F); + quaternion.mul(oldSchool(0, yaw, 0)); + quaternion.mul(oldSchool(0, 0, pitch)); + if (particle.getRoll() != 0) { + quaternion.rotateX(Mth.lerp(partialTicks, particle.getORoll(), particle.getRoll())); + } + + Vec3 vec3 = camera.getPosition(); + float x = (float) (Mth.lerp(partialTicks, particle.getXOld(), particle.getX()) - vec3.x()); + float y = (float) (Mth.lerp(partialTicks, particle.getYOld(), particle.getY()) - vec3.y()); + float z = (float) (Mth.lerp(partialTicks, particle.getZOld(), particle.getZ()) - vec3.z()); + Vector3f[] avector3f = new Vector3f[]{new Vector3f(-1.0F, 0.0F, 1.0F), new Vector3f(1.0F, 0.0F, 1.0F), new Vector3f(1.0F, 0.0F, -1.0F), new Vector3f(-1.0F, 0.0F, -1.0F)}; + float f4 = particle.getQuadSize(partialTicks); + for (int i = 0; i < 4; ++i) { + Vector3f vector3f = avector3f[i]; + vector3f.rotate(quaternion); + vector3f.mul(f4); + vector3f.add(x, y, z); + } + + float f7 = particle.getU0(); + float f8 = particle.getU1(); + float f5 = particle.getV0(); + float f6 = particle.getV1(); + int j = particle.getLightColor(partialTicks); + float red = particle.getRed(); + float green = particle.getGreen(); + float blue = particle.getBlue(); + float alpha = particle.getAlpha(); + + consumer.vertex(avector3f[0].x(), avector3f[0].y(), avector3f[0].z()).uv(f8, f6).color(red, green, blue, alpha).uv2(j).endVertex(); + consumer.vertex(avector3f[1].x(), avector3f[1].y(), avector3f[1].z()).uv(f8, f5).color(red, green, blue, alpha).uv2(j).endVertex(); + consumer.vertex(avector3f[2].x(), avector3f[2].y(), avector3f[2].z()).uv(f7, f5).color(red, green, blue, alpha).uv2(j).endVertex(); + consumer.vertex(avector3f[3].x(), avector3f[3].y(), avector3f[3].z()).uv(f7, f6).color(red, green, blue, alpha).uv2(j).endVertex(); + } + + public Quaternionf oldSchool(float pX, float pY, float pZ) { + float f = Mth.sin(0.5F * pX); + float f1 = Mth.cos(0.5F * pX); + float f2 = Mth.sin(0.5F * pY); + float f3 = Mth.cos(0.5F * pY); + float f4 = Mth.sin(0.5F * pZ); + float f5 = Mth.cos(0.5F * pZ); + float x = f * f3 * f5 + f1 * f2 * f4; + float y = f1 * f2 * f5 - f * f3 * f4; + float z = f * f2 * f5 + f1 * f3 * f4; + float w = f1 * f3 * f5 - f * f2 * f4; + return new Quaternionf(x, y, z, w); + } +} diff --git a/src/main/java/com/sammy/malum/client/renderer/block/SpiritCatalyzerRenderer.java b/src/main/java/com/sammy/malum/client/renderer/block/SpiritCatalyzerRenderer.java index 51e4629a1..131619920 100644 --- a/src/main/java/com/sammy/malum/client/renderer/block/SpiritCatalyzerRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/block/SpiritCatalyzerRenderer.java @@ -26,8 +26,6 @@ public class SpiritCatalyzerRenderer implements BlockEntityRenderer { - private static final RenderTypeToken LIGHT_TRAIL = MalumRenderTypeTokens.CONCENTRATED_TRAIL; - private static final RenderType TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.apply(LIGHT_TRAIL); public SpiritCatalyzerRenderer(BlockEntityRendererProvider.Context context) { } @@ -75,17 +73,17 @@ public void render(SpiritCatalyzerCoreBlockEntity blockEntityIn, float partialTi } public void renderBeam(SpiritCatalyzerCoreBlockEntity catalyzer, PoseStack poseStack, MalumSpiritType spiritType, int intensity) { - BlockPos catalyzerPos = catalyzer.getBlockPos(); - Vec3 startPos = catalyzer.getItemOffset().add(catalyzerPos.getX(), catalyzerPos.getY(), catalyzerPos.getZ()); - Vec3 targetPos = catalyzer.getTarget().getAccelerationPoint(); - Vec3 difference = targetPos.subtract(startPos); + var catalyzerPos = catalyzer.getBlockPos(); + var startPos = catalyzer.getItemOffset().add(catalyzerPos.getX(), catalyzerPos.getY(), catalyzerPos.getZ()); + var targetPos = catalyzer.getTarget().getAccelerationPoint(); + var difference = targetPos.subtract(startPos); float distance = 0.35f + Easing.SINE_OUT.ease(intensity / 60f, 0, 0.35f, 1); float alpha = intensity / 60f; - Vec3 midPoint = startPos.add(difference.scale(distance)); + var midPoint = startPos.add(difference.scale(distance)); + var renderType = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); SpiritBasedWorldVFXBuilder.create(spiritType) - .setColor(spiritType.getPrimaryColor()) - .setRenderType(TRAIL_TYPE) + .setRenderType(renderType) .setAlpha(alpha) .renderBeam(poseStack.last().pose(), startPos, midPoint, 0.4f, b -> b.setColor(spiritType.getSecondaryColor()).setAlpha(0f)); } diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java index 7ad46f0b1..37eaa8659 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/FloatingItemEntityRenderer.java @@ -10,10 +10,8 @@ import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.texture.*; -import net.minecraft.client.resources.model.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; -import net.minecraft.world.level.*; import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.registry.client.*; import team.lodestar.lodestone.systems.easing.*; @@ -31,36 +29,30 @@ public FloatingItemEntityRenderer(EntityRendererProvider.Context context) { this.shadowStrength = 0; } - private static final LodestoneRenderType TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); - - private static final LodestoneRenderType TWINKLE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(MalumRenderTypeTokens.TWINKLE); - private static final LodestoneRenderType STAR = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(MalumRenderTypeTokens.STAR); - @Override public void render(FloatingItemEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { - final MalumSpiritType spiritType = entity.getSpiritType(); - VFXBuilders.WorldVFXBuilder trailBuilder = SpiritBasedWorldVFXBuilder.create(spiritType).setRenderType(TRAIL_TYPE); - RenderUtils.renderEntityTrail(poseStack, trailBuilder, entity.trailPointBuilder, entity, spiritType.getPrimaryColor(), spiritType.getSecondaryColor(), 1f, partialTicks); + var spiritType = entity.getSpiritType(); + var renderType = LodestoneRenderTypeRegistry.ADDITIVE_ROUNDED_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); + var builder = SpiritBasedWorldVFXBuilder.create(spiritType).setRenderType(renderType); + RenderUtils.renderEntityTrail(poseStack, builder, entity.trail, entity, spiritType.getPrimaryColor(), spiritType.getSecondaryColor(), 1f, partialTicks); renderSpiritEntity(entity, itemRenderer, partialTicks, poseStack, bufferIn, packedLightIn); super.render(entity, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); } public static void renderSpiritEntity(FloatingItemEntity entity, ItemRenderer itemRenderer, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { - ItemStack itemStack = entity.getItem(); - BakedModel model = itemRenderer.getModel(itemStack, entity.level(), null, entity.getItem().getCount()); + var level = entity.level(); + var stack = entity.getItem(); + var model = itemRenderer.getModel(stack, level, null, entity.getItem().getCount()); float yOffset = entity.getYOffset(partialTicks); float scale = model.getTransforms().getTransform(ItemDisplayContext.GROUND).scale.y(); float rotation = entity.getRotation(partialTicks); - poseStack.pushPose(); - poseStack.translate(0.0D, (yOffset - 0.25F * scale), 0.0D); - poseStack.mulPose(Axis.YP.rotation(rotation)); - itemRenderer.render(itemStack, ItemDisplayContext.GROUND, false, poseStack, bufferIn, packedLightIn, OverlayTexture.NO_OVERLAY, model); - poseStack.popPose(); - poseStack.pushPose(); poseStack.translate(0.0D, yOffset, 0.0D); renderSpiritGlimmer(poseStack, entity.getSpiritType(), partialTicks); + poseStack.translate(0.0D, -0.25F * scale, 0.0D); + poseStack.mulPose(Axis.YP.rotation(rotation)); + itemRenderer.render(stack, ItemDisplayContext.GROUND, false, poseStack, bufferIn, packedLightIn, OverlayTexture.NO_OVERLAY, model); poseStack.popPose(); } @@ -89,21 +81,26 @@ public static void renderSpiritGlimmer(PoseStack poseStack, Color primaryColor, } public static void renderSpiritGlimmer(PoseStack poseStack, VFXBuilders.WorldVFXBuilder builder, Color primaryColor, Color secondaryColor, float scaleScalar, float alphaScalar, float partialTicks) { - Level level = Minecraft.getInstance().level; + var minecraft = Minecraft.getInstance(); + var level = minecraft.level; + + var star = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(MalumRenderTypeTokens.STAR); + var twinkle = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE.applyAndCache(MalumRenderTypeTokens.TWINKLE); + float gameTime = level.getGameTime() + partialTicks; - float sine = (float) Math.abs(((Math.sin((gameTime / 80f) % 360)) * 0.075f)); + double sine = Math.abs(((Math.sin((gameTime / 80f) % 360)) * 0.075f)); float bounce = EasingHelper.weightedEasingLerp(Easing.BOUNCE_IN_OUT, (gameTime % 20) / 20f, 0.025f, 0.05f, 0.025f); - float scale = (0.12f + sine + bounce) * scaleScalar; + float scale = (float) ((0.12f + sine + bounce) * scaleScalar); poseStack.pushPose(); - poseStack.mulPose(Minecraft.getInstance().getEntityRenderDispatcher().cameraOrientation()); + poseStack.mulPose(minecraft.getEntityRenderDispatcher().cameraOrientation()); poseStack.mulPose(Axis.YP.rotationDegrees(180f)); builder.setAlpha(0.6f * alphaScalar) .setColor(primaryColor) - .setRenderType(STAR) + .setRenderType(star) .renderQuad(poseStack, scale * 0.8f); builder.setAlpha(0.8f * alphaScalar) - .setRenderType(TWINKLE) + .setRenderType(twinkle) .renderQuad(poseStack, scale * 0.6f); builder.setAlpha(0.2f * alphaScalar) .setColor(secondaryColor) diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/ScytheBoomerangEntityRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/ScytheBoomerangEntityRenderer.java index 18e17c6da..013df507b 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/ScytheBoomerangEntityRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/ScytheBoomerangEntityRenderer.java @@ -2,8 +2,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import com.sammy.malum.client.*; import com.sammy.malum.common.entity.boomerang.ScytheBoomerangEntity; +import com.sammy.malum.common.item.*; import com.sammy.malum.common.item.curiosities.weapons.scythe.MalumScytheItem; +import com.sammy.malum.registry.client.*; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -14,8 +17,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import team.lodestar.lodestone.registry.client.*; +import team.lodestar.lodestone.systems.rendering.*; +import team.lodestar.lodestone.systems.rendering.rendeertype.*; + +import java.awt.*; + +import static com.sammy.malum.MalumMod.malumPath; public class ScytheBoomerangEntityRenderer extends EntityRenderer { + + public final ItemRenderer itemRenderer; public ScytheBoomerangEntityRenderer(EntityRendererProvider.Context context) { @@ -28,15 +40,26 @@ public ScytheBoomerangEntityRenderer(EntityRendererProvider.Context context) { @Override public void render(ScytheBoomerangEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { poseStack.pushPose(); - ItemStack itemstack = entityIn.getItem(); - BakedModel model = this.itemRenderer.getModel(itemstack, entityIn.level(), null, 1); + var itemstack = entityIn.getItem(); + var model = this.itemRenderer.getModel(itemstack, entityIn.level(), null, 1); poseStack.mulPose(Axis.XP.rotationDegrees(90F)); poseStack.scale(2f, 2f, 2f); poseStack.mulPose(Axis.ZP.rotation((entityIn.age + partialTicks) * 0.9f)); itemRenderer.render(itemstack, itemstack.getItem() instanceof MalumScytheItem ? ItemDisplayContext.NONE : ItemDisplayContext.FIXED, false, poseStack, bufferIn, packedLightIn, OverlayTexture.NO_OVERLAY, model); - poseStack.popPose(); + var spirit = entityIn.getItem().getItem() instanceof ISpiritAffiliatedItem affiliatedItem ? affiliatedItem.getDefiningSpiritType() : null; + final boolean isMagical = spirit != null; + var renderType = isMagical ? + LodestoneRenderTypeRegistry.ADDITIVE_TWO_SIDED_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL) : + LodestoneRenderTypeRegistry.TRANSPARENT_TWO_SIDED_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL, ShaderUniformHandler.LUMITRANSPARENT); + var primaryColor = isMagical ? spirit.getPrimaryColor() : new Color(0.9f, 0.9f, 0.9f); + var secondaryColor = isMagical ? spirit.getSecondaryColor() : new Color(0.5f, 0.5f, 0.5f); + var builder = VFXBuilders.createWorld().setRenderType(renderType); + final float scalar = Math.min(entityIn.age / 20f, 1f); + RenderUtils.renderEntityTrail(poseStack, builder, entityIn.theFormer, entityIn, primaryColor, secondaryColor, scalar, partialTicks); + RenderUtils.renderEntityTrail(poseStack, builder, entityIn.theLatter, entityIn, primaryColor, secondaryColor, scalar, partialTicks); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); } diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/SpiritCollectionActivatorEntityRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/SpiritCollectionActivatorEntityRenderer.java index 0378a2b5e..4512f057f 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/SpiritCollectionActivatorEntityRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/SpiritCollectionActivatorEntityRenderer.java @@ -13,7 +13,7 @@ import team.lodestar.lodestone.registry.client.*; import team.lodestar.lodestone.systems.rendering.*; -import static com.sammy.malum.registry.common.SpiritTypeRegistry.UMBRAL_SPIRIT; +import static com.sammy.malum.registry.common.SpiritTypeRegistry.*; public class SpiritCollectionActivatorEntityRenderer extends EntityRenderer { public final ItemRenderer itemRenderer; @@ -25,22 +25,24 @@ public SpiritCollectionActivatorEntityRenderer(EntityRendererProvider.Context co this.shadowStrength = 0; } - private static final LodestoneRenderType TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); @Override public void render(SpiritCollectionActivatorEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { - MalumSpiritType spiritType = UMBRAL_SPIRIT; - VFXBuilders.WorldVFXBuilder trailBuilder = SpiritBasedWorldVFXBuilder.create(spiritType).setRenderType(TRAIL_TYPE); + var spiritType = UMBRAL_SPIRIT; + var secondarySpiritType = ELDRITCH_SPIRIT; + var renderType = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); + var trailBuilder = SpiritBasedWorldVFXBuilder.create(spiritType).setRenderType(renderType); + var eldritchTrailBuilder = SpiritBasedWorldVFXBuilder.create(secondarySpiritType).setRenderType(renderType); float yOffset = entity.getYOffset(partialTicks); + poseStack.pushPose(); poseStack.translate(0.0D, yOffset, 0.0D); FloatingItemEntityRenderer.renderSpiritGlimmer(poseStack, spiritType, 0.85f, 4f, partialTicks); - FloatingItemEntityRenderer.renderSpiritGlimmer(poseStack, SpiritTypeRegistry.ELDRITCH_SPIRIT, 0.6f, 0.5f, partialTicks); + FloatingItemEntityRenderer.renderSpiritGlimmer(poseStack, secondarySpiritType, 0.6f, 0.5f, partialTicks); poseStack.popPose(); - RenderUtils.renderEntityTrail(poseStack, trailBuilder, entity.trailPointBuilder, entity, spiritType.getPrimaryColor(), spiritType.getSecondaryColor(), 1f, partialTicks); - spiritType = SpiritTypeRegistry.ELDRITCH_SPIRIT; - trailBuilder = SpiritBasedWorldVFXBuilder.create(spiritType).setRenderType(TRAIL_TYPE); - RenderUtils.renderEntityTrail(poseStack, trailBuilder, entity.trailPointBuilder, entity, spiritType.getPrimaryColor(), spiritType.getSecondaryColor(), 0.75f, 0.5f, partialTicks); + + RenderUtils.renderEntityTrail(poseStack, trailBuilder, entity.trail, entity, spiritType.getPrimaryColor(), spiritType.getSecondaryColor(), 1f, partialTicks); + RenderUtils.renderEntityTrail(poseStack, eldritchTrailBuilder, entity.trail, entity, secondarySpiritType.getPrimaryColor(), secondarySpiritType.getSecondaryColor(), 0.75f, 0.5f, partialTicks); super.render(entity, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/ThrownConcentratedGluttonyRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/ThrownConcentratedGluttonyRenderer.java index 49bffd73d..5bda8ecdf 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/ThrownConcentratedGluttonyRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/ThrownConcentratedGluttonyRenderer.java @@ -4,6 +4,7 @@ import com.mojang.math.*; import com.sammy.malum.client.*; import com.sammy.malum.common.entity.thrown.*; +import com.sammy.malum.registry.client.*; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.texture.*; @@ -22,8 +23,8 @@ public class ThrownConcentratedGluttonyRenderer extends EntityRenderer { - private static final RenderType ADDITIVE_TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.apply(RenderTypeToken.createCachedToken(malumPath("textures/vfx/concentrated_trail.png"))); - private static final RenderType TRANSPARENT_TRAIL_TYPE = LodestoneRenderTypeRegistry.TRANSPARENT_TEXTURE_TRIANGLE.apply(RenderTypeToken.createCachedToken(malumPath("textures/vfx/concentrated_trail.png")), ShaderUniformHandler.LUMITRANSPARENT); + private static final RenderType TRANSPARENT_TRAIL_TYPE = LodestoneRenderTypeRegistry.TRANSPARENT_TWO_SIDED_TEXTURE_TRIANGLE.apply(RenderTypeToken.createCachedToken(malumPath("textures/vfx/concentrated_trail.png")), ShaderUniformHandler.LUMITRANSPARENT); + private static final Color GLUTTONY_GREEN = new Color(47, 81, 28); private static final Color GLUTTONY_DARK = new Color(31, 35, 30); private static final Color GLUTTONY_SHADE = new Color(14, 14, 16); @@ -60,7 +61,9 @@ public void render(ThrownConcentratedGluttony entity, float entityYaw, float par poseStack.popPose(); } float scale = entity.getVisualEffectScalar(); - VFXBuilders.WorldVFXBuilder builder = VFXBuilders.createWorld().setRenderType(ADDITIVE_TRAIL_TYPE); + var additive = LodestoneRenderTypeRegistry.ADDITIVE_TWO_SIDED_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); + var transparent = LodestoneRenderTypeRegistry.TRANSPARENT_TWO_SIDED_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL, ShaderUniformHandler.LUMITRANSPARENT); + var builder = VFXBuilders.createWorld().setRenderType(additive); for (TrailPointBuilder trail : entity.trails) { RenderUtils.renderEntityTrail(poseStack, builder, trail, entity, GLUTTONY_GREEN, GLUTTONY_DARK, scale * 0.5f, scale * 0.5f, partialTicks); } diff --git a/src/main/java/com/sammy/malum/client/renderer/entity/nitrate/AbstractNitrateEntityRenderer.java b/src/main/java/com/sammy/malum/client/renderer/entity/nitrate/AbstractNitrateEntityRenderer.java index 29542177d..f25fbf1ad 100644 --- a/src/main/java/com/sammy/malum/client/renderer/entity/nitrate/AbstractNitrateEntityRenderer.java +++ b/src/main/java/com/sammy/malum/client/renderer/entity/nitrate/AbstractNitrateEntityRenderer.java @@ -32,12 +32,12 @@ public AbstractNitrateEntityRenderer(EntityRendererProvider.Context context, Col this(context, f -> primaryColor, f -> secondaryColor); } - private static final RenderType TRAIL_TYPE = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.apply(MalumRenderTypeTokens.CONCENTRATED_TRAIL); @Override public void render(T entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { float effectScalar = entity.getVisualEffectScalar(); - VFXBuilders.WorldVFXBuilder builder = VFXBuilders.createWorld().setRenderType(TRAIL_TYPE); + var renderType = LodestoneRenderTypeRegistry.ADDITIVE_TEXTURE_TRIANGLE.applyAndCache(MalumRenderTypeTokens.CONCENTRATED_TRAIL); + var builder = VFXBuilders.createWorld().setRenderType(renderType); RenderUtils.renderEntityTrail(poseStack, builder, entity.trailPointBuilder, entity, primaryColor, secondaryColor, effectScalar, partialTicks); RenderUtils.renderEntityTrail(poseStack, builder, entity.spinningTrailPointBuilder, entity, primaryColor, secondaryColor, effectScalar, partialTicks); if (entity.age > 1 && !entity.fadingAway) { diff --git a/src/main/java/com/sammy/malum/client/screen/codex/entries/TinkeringEntries.java b/src/main/java/com/sammy/malum/client/screen/codex/entries/TinkeringEntries.java index f98b55dab..f3038dcf4 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/entries/TinkeringEntries.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/entries/TinkeringEntries.java @@ -79,6 +79,8 @@ public static void setupEntries(ArcanaProgressionScreen screen) { .addPage(SpiritInfusionPage.fromOutput(RING_OF_CURATIVE_TALENT.get())) .addPage(new HeadlineTextPage("reactive_trinkets.ring_of_alchemical_mastery", "reactive_trinkets.ring_of_alchemical_mastery.1")) .addPage(SpiritInfusionPage.fromOutput(RING_OF_ALCHEMICAL_MASTERY.get())) + .addPage(new HeadlineTextPage("reactive_trinkets.ring_of_manaweaving", "reactive_trinkets.ring_of_manaweaving.1")) + .addPage(SpiritInfusionPage.fromOutput(RING_OF_MANAWEAVING.get())) .addPage(new HeadlineTextPage("reactive_trinkets.ring_of_prowess", "reactive_trinkets.ring_of_prowess.1")) .addPage(new TextPage("reactive_trinkets.ring_of_prowess.2")) .addPage(SpiritInfusionPage.fromOutput(RING_OF_ARCANE_PROWESS.get())) diff --git a/src/main/java/com/sammy/malum/client/screen/codex/screens/VoidProgressionScreen.java b/src/main/java/com/sammy/malum/client/screen/codex/screens/VoidProgressionScreen.java index 51f239c1a..173bb0c69 100644 --- a/src/main/java/com/sammy/malum/client/screen/codex/screens/VoidProgressionScreen.java +++ b/src/main/java/com/sammy/malum/client/screen/codex/screens/VoidProgressionScreen.java @@ -230,19 +230,26 @@ public void setupEntries() { .afterUmbralCrystal() ); - addEntry("void.ring_of_growing_flesh", -3, 9, b -> b - .withTraceFragmentEntry() - .configureWidget(w -> w.setIcon(RING_OF_GROWING_FLESH).setStyle(BookWidgetStyle.SOULWOOD)) - .addPage(new HeadlineTextPage("void.ring_of_growing_flesh", "void.ring_of_growing_flesh.1")) - .addPage(SpiritInfusionPage.fromOutput(RING_OF_GROWING_FLESH.get())) - .afterUmbralCrystal() - ); - addEntry("void.ring_of_gruesome_concentration", -4, 10, b -> b + addEntry("void.ring_of_gruesome_concentration", -3, 9, b -> b .configureWidget(w -> w.setIcon(RING_OF_GRUESOME_CONCENTRATION).setStyle(BookWidgetStyle.SOULWOOD)) .addPage(new HeadlineTextPage("void.ring_of_gruesome_concentration", "void.ring_of_gruesome_concentration.1")) .addPage(SpiritInfusionPage.fromOutput(RING_OF_GRUESOME_CONCENTRATION.get())) .afterUmbralCrystal() ); + addEntry("void.ring_of_growing_flesh", -4, 10, b -> b + .withTraceFragmentEntry() + .configureWidget(w -> w.setIcon(RING_OF_GROWING_FLESH).setStyle(BookWidgetStyle.SOULWOOD)) + .addPage(new HeadlineTextPage("void.ring_of_growing_flesh", "void.ring_of_growing_flesh.1")) + .addPage(SpiritInfusionPage.fromOutput(RING_OF_GROWING_FLESH.get())) + .afterUmbralCrystal() + ); + addEntry("void.ring_of_echoing_arcana", -5, 10, b -> b + .withTraceFragmentEntry() + .configureWidget(w -> w.setIcon(RING_OF_ECHOING_ARCANA).setStyle(BookWidgetStyle.SOULWOOD)) + .addPage(new HeadlineTextPage("void.ring_of_echoing_arcana", "void.ring_of_echoing_arcana.1")) + .addPage(SpiritInfusionPage.fromOutput(RING_OF_ECHOING_ARCANA.get())) + .afterUmbralCrystal() + ); addEntry("void.necklace_of_the_watcher", -3, 11, b -> b .configureWidget(w -> w.setIcon(NECKLACE_OF_THE_WATCHER).setStyle(BookWidgetStyle.SOULWOOD)) .addPage(new HeadlineTextPage("void.necklace_of_the_watcher", "void.necklace_of_the_watcher.1")) @@ -266,7 +273,23 @@ public void setupEntries() { .afterUmbralCrystal() ); - addEntry("void.erosion_scepter", 4, 10, b -> b + addEntry("void.weight_of_worlds", 4, 10, b -> b + .configureWidget(w -> w.setIcon(WEIGHT_OF_WORLDS).setStyle(BookWidgetStyle.SOULWOOD)) + .addPage(new HeadlineTextPage("void.weight_of_worlds", "void.weight_of_worlds.1")) + .addPage(SpiritInfusionPage.fromOutput(WEIGHT_OF_WORLDS.get())) + .addPage(new TextPage("void.weight_of_worlds.2")) + .afterUmbralCrystal() + ); + + addEntry("void.edge_of_deliverance", 5, 10, b -> b + .configureWidget(w -> w.setIcon(EDGE_OF_DELIVERANCE).setStyle(BookWidgetStyle.SOULWOOD)) + .addPage(new HeadlineTextPage("void.edge_of_deliverance", "void.edge_of_deliverance.1")) + .addPage(SpiritInfusionPage.fromOutput(EDGE_OF_DELIVERANCE.get())) + .addPage(new TextPage("void.edge_of_deliverance.2")) + .afterUmbralCrystal() + ); + + addEntry("void.erosion_scepter", 3, 11, b -> b .configureWidget(w -> w.setIcon(EROSION_SCEPTER).setStyle(BookWidgetStyle.SOULWOOD)) .addPage(new HeadlineTextPage("void.erosion_scepter", "void.erosion_scepter.1")) .addPage(SpiritInfusionPage.fromOutput(EROSION_SCEPTER.get())) @@ -276,14 +299,6 @@ public void setupEntries() { .afterUmbralCrystal() ); - addEntry("void.weight_of_worlds", 3, 11, b -> b - .configureWidget(w -> w.setIcon(WEIGHT_OF_WORLDS).setStyle(BookWidgetStyle.SOULWOOD)) - .addPage(new HeadlineTextPage("void.weight_of_worlds", "void.weight_of_worlds.1")) - .addPage(SpiritInfusionPage.fromOutput(WEIGHT_OF_WORLDS.get())) - .addPage(new TextPage("void.weight_of_worlds.2")) - .afterUmbralCrystal() - ); - addEntry("void.malignant_stronghold_armor", 4, 12, b -> b .configureWidget(w -> w.setIcon(MALIGNANT_STRONGHOLD_HELMET).setStyle(BookWidgetStyle.SOULWOOD)) .addPage(new HeadlineTextPage("void.malignant_stronghold_armor", "void.malignant_stronghold_armor.1")) diff --git a/src/main/java/com/sammy/malum/common/block/MalumBlockEntityInventory.java b/src/main/java/com/sammy/malum/common/block/MalumBlockEntityInventory.java index 8b2cf3b90..46b5c39aa 100644 --- a/src/main/java/com/sammy/malum/common/block/MalumBlockEntityInventory.java +++ b/src/main/java/com/sammy/malum/common/block/MalumBlockEntityInventory.java @@ -28,7 +28,8 @@ public MalumBlockEntityInventory(int slotCount, int allowedItemSize) { public void extractItem(Player playerEntity, ItemStack stack, int slot) { super.extractItem(playerEntity, stack, slot); SoundEvent soundEvent = getExtractSound(stack); - playerEntity.level().playSound(null, playerEntity.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.7f, RandomHelper.randomBetween(playerEntity.level().random, 0.8f, 1.2f)); + + SoundHelper.playSound(playerEntity, soundEvent, SoundSource.BLOCKS, 0.7f, RandomHelper.randomBetween(playerEntity.getRandom(), 0.8f, 1.2f)); } @Override @@ -36,7 +37,7 @@ public ItemStack insertItem(Player playerEntity, ItemStack stack) { final ItemStack result = super.insertItem(playerEntity, stack); if (!result.isEmpty()) { SoundEvent soundEvent = getInsertSound(result); - playerEntity.level().playSound(null, playerEntity.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.7f, RandomHelper.randomBetween(playerEntity.level().random, 0.8f, 1.2f)); + SoundHelper.playSound(playerEntity, soundEvent, SoundSource.BLOCKS, 0.7f, RandomHelper.randomBetween(playerEntity.getRandom(), 0.8f, 1.2f)); } return result; } diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonCoreBlockEntity.java b/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonCoreBlockEntity.java index 5df34e040..c8fb8b4e2 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonCoreBlockEntity.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonCoreBlockEntity.java @@ -1,6 +1,7 @@ package com.sammy.malum.common.block.curiosities.repair_pylon; import com.sammy.malum.common.block.*; +import com.sammy.malum.common.block.curiosities.spirit_crucible.*; import com.sammy.malum.common.block.storage.*; import com.sammy.malum.common.item.spirit.*; import com.sammy.malum.common.recipe.*; @@ -12,6 +13,7 @@ import com.sammy.malum.visual_effects.networked.pylon.*; import net.minecraft.core.*; import net.minecraft.nbt.*; +import net.minecraft.sounds.*; import net.minecraft.util.*; import net.minecraft.world.*; import net.minecraft.world.entity.player.*; @@ -183,10 +185,14 @@ public void init() { if (state.equals(RepairPylonState.COOLDOWN)) { return; } - boolean wasNull = recipe == null; recipe = SpiritRepairRecipe.getRecipe(level, c -> c.doesRepairMatch(inventory.getStackInSlot(0)) && c.doSpiritsMatch(spiritInventory.nonEmptyItemStacks)); - if (wasNull) { - setState(RepairPylonState.SEARCHING); + if (recipe != null) { + if (state.equals(RepairPylonState.IDLE)) { + setState(RepairPylonState.SEARCHING); + } + if (level.isClientSide) { + RepairPylonSoundInstance.playSound(this); + } } } @@ -196,12 +202,18 @@ public void tick() { spiritAmount = Math.max(1, Mth.lerp(0.1f, spiritAmount, spiritInventory.nonEmptyItemAmount)); if (level.isClientSide) { spiritSpin++; - if (state.equals(RepairPylonState.COOLDOWN) && timer < 300) { + if (state.equals(RepairPylonState.COOLDOWN) && timer < 1200) { timer++; } RepairPylonParticleEffects.passiveRepairPylonParticles(this); } else { + if (!state.equals(RepairPylonState.IDLE) && !state.equals(RepairPylonState.COOLDOWN)) { + if (recipe == null) { + setState(RepairPylonState.IDLE); + return; + } + } switch (state) { case IDLE -> { if (recipe != null) { @@ -210,11 +222,7 @@ public void tick() { } case SEARCHING -> { timer++; - if (timer >= 100) { - if (recipe == null) { - timer = 0; - return; - } + if (timer >= 40) { boolean success = tryRepair(); if (success) { setState(RepairPylonState.CHARGING); @@ -226,11 +234,7 @@ public void tick() { } case CHARGING -> { timer++; - if (recipe == null) { - setState(RepairPylonState.IDLE); - return; - } - if (timer >= 60) { + if (timer >= 600) { if (repairablePosition == null) { setState(RepairPylonState.IDLE); return; @@ -244,11 +248,7 @@ public void tick() { } case REPAIRING -> { timer++; - if (recipe == null) { - setState(RepairPylonState.IDLE); - return; - } - if (timer >= 30) { + if (timer >= 40) { if (repairablePosition == null) { setState(RepairPylonState.IDLE); return; @@ -262,7 +262,7 @@ public void tick() { } case COOLDOWN -> { timer++; - if (timer >= 300) { + if (timer >= 1200) { setState(RepairPylonState.IDLE); } } @@ -290,6 +290,7 @@ public boolean tryRepair(IMalumSpecialItemAccessPoint provider) { public void prepareRepair(IMalumSpecialItemAccessPoint provider) { ParticleEffectTypeRegistry.REPAIR_PYLON_PREPARES.createPositionedEffect(level, new PositionEffectData(worldPosition), ColorEffectData.fromRecipe(recipe.spirits), PylonPrepareRepairParticleEffect.createData(provider.getAccessPointBlockPos())); + level.playSound(null, worldPosition, SoundRegistry.REPAIR_PYLON_REPAIR_START.get(), SoundSource.BLOCKS, 1.0f, 0.8f); setState(RepairPylonState.REPAIRING); } @@ -312,12 +313,13 @@ public void repairItem(IMalumSpecialItemAccessPoint provider) { result.setDamageValue(Math.max(0, result.getDamageValue() - (int) (result.getMaxDamage() * recipe.durabilityPercentage))); suppliedInventory.setStackInSlot(0, result); ParticleEffectTypeRegistry.REPAIR_PYLON_REPAIRS.createPositionedEffect(level, new PositionEffectData(worldPosition), ColorEffectData.fromRecipe(recipe.spirits), PylonPrepareRepairParticleEffect.createData(provider.getAccessPointBlockPos())); + level.playSound(null, worldPosition, SoundRegistry.REPAIR_PYLON_REPAIR_FINISH.get(), SoundSource.BLOCKS, 1.0f, 0.8f); setState(RepairPylonState.COOLDOWN); } public void setState(RepairPylonState state) { this.state = state; - this.timer = 0; + this.timer = state.equals(RepairPylonState.SEARCHING) ? 100 : 0; BlockHelper.updateAndNotifyState(level, worldPosition); } @@ -335,7 +337,7 @@ public Vec3 getSpiritItemOffset(int slot, float partialTicks) { float distance = 0.75f + (float) Math.sin(((spiritSpin + partialTicks) % 6.28f) / 20f) * 0.025f; float height = 2.75f; if (state.equals(RepairPylonState.COOLDOWN)) { - int relativeCooldown = timer < 270 ? Math.min(timer, 30) : 300-timer; + int relativeCooldown = timer < 1110 ? Math.min(timer, 90) : 1200-timer; distance += getCooldownOffset(relativeCooldown, Easing.SINE_OUT) * 0.25f; height -= getCooldownOffset(relativeCooldown, Easing.QUARTIC_OUT) * getCooldownOffset(relativeCooldown, Easing.BACK_OUT) * 0.5f; } @@ -343,7 +345,7 @@ public Vec3 getSpiritItemOffset(int slot, float partialTicks) { } public float getCooldownOffset(int relativeCooldown, Easing easing) { - return easing.ease(relativeCooldown / 30f, 0, 1, 1); + return easing.ease(relativeCooldown / 90f, 0, 1, 1); } @Nonnull diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonSoundInstance.java b/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonSoundInstance.java new file mode 100644 index 000000000..3cb9b9929 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/block/curiosities/repair_pylon/RepairPylonSoundInstance.java @@ -0,0 +1,28 @@ +package com.sammy.malum.common.block.curiosities.repair_pylon; + +import com.sammy.malum.common.block.curiosities.spirit_altar.*; +import com.sammy.malum.registry.common.*; +import team.lodestar.lodestone.systems.sound.*; + +public class RepairPylonSoundInstance extends CachedBlockEntitySoundInstance { + public RepairPylonSoundInstance(RepairPylonCoreBlockEntity blockEntity, float volume, float pitch) { + super(blockEntity, SoundRegistry.REPAIR_PYLON_LOOP, volume, pitch); + this.x = blockEntity.getBlockPos().getX() + 0.5f; + this.y = blockEntity.getBlockPos().getY() + 0.5f; + this.z = blockEntity.getBlockPos().getZ() + 0.5f; + this.pitch = 0.8f; + } + + @Override + public void tick() { + if (!blockEntity.state.equals(RepairPylonCoreBlockEntity.RepairPylonState.CHARGING) && + !blockEntity.state.equals(RepairPylonCoreBlockEntity.RepairPylonState.REPAIRING)) { + stop(); + } + super.tick(); + } + + public static void playSound(RepairPylonCoreBlockEntity blockEntity) { + playSound(blockEntity, new RepairPylonSoundInstance(blockEntity, 1, 1)); + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleAccelerationData.java b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleAccelerationData.java index 5c8a8911f..82340b318 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleAccelerationData.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleAccelerationData.java @@ -54,24 +54,18 @@ public static CrucibleAccelerationData createData(ICatalyzerAccelerationTarget t public CrucibleAccelerationData(ICatalyzerAccelerationTarget target, Map typeCount, Collection accelerators) { final List augments = Stream.concat(accelerators.stream().map(ICrucibleAccelerator::getAugmentType), target.getAugmentTypes().stream()).filter(Optional::isPresent).map(Optional::get).toList(); - CrucibleTuning tuning = new CrucibleTuning(target, 1f + augments.stream().map(AbstractAugmentItem::getTuningStrengthIncrease).reduce(Float::sum).orElse(0f)); - this.focusingSpeed = tuning.focusingSpeedMultiplier.createTunedValue( - typeCount.entrySet().stream().map((entry) -> entry.getKey().getAcceleration(entry.getValue())).reduce(Float::sum).orElse(0f) - + augments.stream().map(AbstractAugmentItem::getSpeedIncrease).reduce(Float::sum).orElse(0f)); - this.damageChance = tuning.damageChanceMultiplier.createTunedValue( - typeCount.entrySet().stream().map((entry) -> entry.getKey().getExtraDamageRollChance(entry.getValue())).reduce(Float::sum).orElse(0f) - + augments.stream().map(AbstractAugmentItem::getInstabilityIncrease).reduce(Float::sum).orElse(0f)); - - this.bonusYieldChance = tuning.bonusYieldChanceMultiplier.createTunedValue( - augments.stream().map(AbstractAugmentItem::getFortuneChance).reduce(Float::sum).orElse(0f)); - this.fuelUsageRate = tuning.fuelUsageRate.createTunedValue( - augments.stream().map(AbstractAugmentItem::getFuelUsageRateIncrease).reduce(Float::sum).orElse(0f)); - this.chainFocusingChance = tuning.chainFocusingChanceMultiplier.createTunedValue( - augments.stream().map(AbstractAugmentItem::getChainFocusingChance).reduce(Float::sum).orElse(0f)); - this.damageAbsorptionChance = tuning.damageAbsorptionChanceMultiplier.createTunedValue( - augments.stream().map(AbstractAugmentItem::getShieldingChance).reduce(Float::sum).orElse(0f)); - this.restorationChance = tuning.restorationChanceMultiplier.createTunedValue( - augments.stream().map(AbstractAugmentItem::getRestorationChance).reduce(Float::sum).orElse(0f)); + float acceleratorExtraSpeed = typeCount.entrySet().stream().map((entry) -> entry.getKey().getAcceleration(entry.getValue())).reduce(Float::sum).orElse(0f); + float acceleratorExtraDamage = typeCount.entrySet().stream().map((entry) -> entry.getKey().getExtraDamageRollChance(entry.getValue())).reduce(Float::sum).orElse(0f); + float tuningStrength = 1f + augments.stream().map(AbstractAugmentItem::getTuningStrengthIncrease).reduce(Float::sum).orElse(0f); + var tuning = new CrucibleTuning(target, tuningStrength); + this.focusingSpeed = tuning.focusingSpeedMultiplier.createTunedValue(augments, AbstractAugmentItem::getSpeedIncrease, acceleratorExtraSpeed); + this.damageChance = tuning.damageChanceMultiplier.createTunedValue(augments, AbstractAugmentItem::getInstabilityIncrease, acceleratorExtraDamage); + + this.bonusYieldChance = tuning.bonusYieldChanceMultiplier.createTunedValue(augments, AbstractAugmentItem::getFortuneChance); + this.fuelUsageRate = tuning.fuelUsageRate.createTunedValue(augments, AbstractAugmentItem::getFuelUsageRateIncrease); + this.chainFocusingChance = tuning.chainFocusingChanceMultiplier.createTunedValue(augments, AbstractAugmentItem::getChainFocusingChance); + this.damageAbsorptionChance = tuning.damageAbsorptionChanceMultiplier.createTunedValue(augments, AbstractAugmentItem::getShieldingChance); + this.restorationChance = tuning.restorationChanceMultiplier.createTunedValue(augments, AbstractAugmentItem::getRestorationChance); final List validTuningTypes = CrucibleTuning.CrucibleAttributeType.getValidValues(this); TunedValue weakestValue = figureOutWeakestValue(target.getAccelerationData(), Stream.of(focusingSpeed, bonusYieldChance, chainFocusingChance, damageAbsorptionChance, restorationChance).filter(t -> validTuningTypes.contains(t.tuning.attributeType)).collect(Collectors.toList())); diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleSoundInstance.java b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleSoundInstance.java index 4f69b732c..0e05a34f4 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleSoundInstance.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleSoundInstance.java @@ -1,12 +1,13 @@ package com.sammy.malum.common.block.curiosities.spirit_crucible; +import com.sammy.malum.common.block.curiosities.repair_pylon.*; import com.sammy.malum.registry.common.SoundRegistry; import net.minecraft.client.Minecraft; -import team.lodestar.lodestone.systems.sound.LodestoneBlockEntitySoundInstance; +import team.lodestar.lodestone.systems.sound.*; -public class CrucibleSoundInstance extends LodestoneBlockEntitySoundInstance { +public class CrucibleSoundInstance extends CachedBlockEntitySoundInstance { public CrucibleSoundInstance(SpiritCrucibleCoreBlockEntity blockEntity, float volume, float pitch) { - super(blockEntity, SoundRegistry.CRUCIBLE_LOOP.get(), volume, pitch); + super(blockEntity, SoundRegistry.CRUCIBLE_LOOP, volume, pitch); this.x = blockEntity.getBlockPos().getX() + 0.5f; this.y = blockEntity.getBlockPos().getY() + 0.5f; this.z = blockEntity.getBlockPos().getZ() + 0.5f; @@ -14,14 +15,13 @@ public CrucibleSoundInstance(SpiritCrucibleCoreBlockEntity blockEntity, float vo @Override public void tick() { - if (blockEntity.recipe != null) { - super.tick(); - return; + if (blockEntity.recipe == null) { + stop(); } - stop(); + super.tick(); } - public static void playSound(SpiritCrucibleCoreBlockEntity tileEntity) { - Minecraft.getInstance().getSoundManager().queueTickingSound(new CrucibleSoundInstance(tileEntity, 1, 1)); + public static void playSound(SpiritCrucibleCoreBlockEntity blockEntity) { + playSound(blockEntity, new CrucibleSoundInstance(blockEntity, 1, 1)); } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleTuning.java b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleTuning.java index 76c222d3d..147280702 100644 --- a/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleTuning.java +++ b/src/main/java/com/sammy/malum/common/block/curiosities/spirit_crucible/CrucibleTuning.java @@ -1,5 +1,7 @@ package com.sammy.malum.common.block.curiosities.spirit_crucible; +import com.sammy.malum.common.item.augment.*; + import java.util.*; import java.util.function.*; @@ -123,6 +125,12 @@ public TuningModifier(CrucibleTuning tuning, CrucibleAttributeType attributeType this(tuning, attributeType, 0); } + public CrucibleAccelerationData.TunedValue createTunedValue(List augmentItems, Function mappingFunction) { + return createTunedValue(augmentItems.stream().map(mappingFunction).reduce(Float::sum).orElse(0f)); + } + public CrucibleAccelerationData.TunedValue createTunedValue(List augmentItems, Function mappingFunction, float bonus) { + return createTunedValue(bonus + augmentItems.stream().map(mappingFunction).reduce(Float::sum).orElse(0f)); + } public CrucibleAccelerationData.TunedValue createTunedValue(float bonus) { return new CrucibleAccelerationData.TunedValue(this, bonus); } diff --git a/src/main/java/com/sammy/malum/common/capability/MalumItemDataCapability.java b/src/main/java/com/sammy/malum/common/capability/MalumItemDataCapability.java index ab0c4c40e..25a1c62f2 100644 --- a/src/main/java/com/sammy/malum/common/capability/MalumItemDataCapability.java +++ b/src/main/java/com/sammy/malum/common/capability/MalumItemDataCapability.java @@ -24,7 +24,6 @@ public class MalumItemDataCapability implements LodestoneCapability { public List soulsToDrop; public UUID attackerForSouls; - public float totalSoulCount; public static Capability CAPABILITY = CapabilityManager.get(new CapabilityToken<>() { }); @@ -56,7 +55,6 @@ public CompoundTag serializeNBT() { if (attackerForSouls != null) { tag.putUUID("attacker", attackerForSouls); } - tag.putFloat("soulCount", totalSoulCount); return tag; } @@ -77,8 +75,6 @@ public void deserializeNBT(CompoundTag tag) { } else { attackerForSouls = null; } - - totalSoulCount = tag.getFloat("soulCount"); } public static LazyOptional getCapabilityOptional(ItemEntity entity) { diff --git a/src/main/java/com/sammy/malum/common/capability/MalumLivingEntityDataCapability.java b/src/main/java/com/sammy/malum/common/capability/MalumLivingEntityDataCapability.java index 2cfb248ed..461359f6d 100644 --- a/src/main/java/com/sammy/malum/common/capability/MalumLivingEntityDataCapability.java +++ b/src/main/java/com/sammy/malum/common/capability/MalumLivingEntityDataCapability.java @@ -1,14 +1,16 @@ package com.sammy.malum.common.capability; import com.sammy.malum.MalumMod; -import com.sammy.malum.common.packets.SyncLivingCapabilityDataPacket; +import com.sammy.malum.common.packets.*; import com.sammy.malum.core.handlers.*; +import com.sammy.malum.registry.common.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; -import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.*; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.*; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityManager; @@ -37,6 +39,7 @@ public class MalumLivingEntityDataCapability implements LodestoneCapability { public TouchOfDarknessHandler touchOfDarknessHandler = new TouchOfDarknessHandler(); public int watcherNecklaceCooldown; + public int hiddenBladeCounterCooldown; public List soulsToApplyToDrops; public UUID killerUUID; @@ -58,7 +61,7 @@ public static void attachEntityCapability(AttachCapabilitiesEvent event) public static void syncEntityCapability(PlayerEvent.StartTracking event) { if (event.getTarget() instanceof LivingEntity livingEntity) { if (livingEntity.level() instanceof ServerLevel) { - MalumLivingEntityDataCapability.sync(livingEntity); + MalumLivingEntityDataCapability.syncTracking(livingEntity); } } } @@ -73,6 +76,9 @@ public CompoundTag serializeNBT() { if (watcherNecklaceCooldown > 0) { tag.putInt("watcherNecklaceCooldown", watcherNecklaceCooldown); } + if (hiddenBladeCounterCooldown > 0) { + tag.putInt("hiddenBladeCounterCooldown", hiddenBladeCounterCooldown); + } if (soulsToApplyToDrops != null) { ListTag souls = new ListTag(); for (ItemStack soul : soulsToApplyToDrops) { @@ -94,12 +100,8 @@ public void deserializeNBT(CompoundTag tag) { if (tag.contains("darknessAfflictionData")) { touchOfDarknessHandler.deserializeNBT(tag.getCompound("darknessAfflictionData")); } - if (tag.contains("watcherNecklaceCooldown")) { - watcherNecklaceCooldown = tag.getInt("watcherNecklaceCooldown"); - } - else { - watcherNecklaceCooldown = 0; - } + watcherNecklaceCooldown = tag.contains("watcherNecklaceCooldown") ? tag.getInt("watcherNecklaceCooldown") : 0; + hiddenBladeCounterCooldown = tag.contains("hiddenBladeCounterCooldown") ? tag.getInt("hiddenBladeCounterCooldown") : 0; if (tag.contains("soulsToApplyToDrops", Tag.TAG_LIST)) { soulsToApplyToDrops = new ArrayList<>(); @@ -118,8 +120,20 @@ public void deserializeNBT(CompoundTag tag) { } } - public static void sync(LivingEntity entity) { - getCapabilityOptional(entity).ifPresent(c -> MALUM_CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), new SyncLivingCapabilityDataPacket(entity.getId(), c.serializeNBT()))); + public static void syncSelf(ServerPlayer player) { + sync(player, PacketDistributor.PLAYER.with(() -> player)); + } + + public static void syncTrackingAndSelf(ServerPlayer player) { + sync(player, PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> player)); + } + + public static void syncTracking(LivingEntity entity) { + sync(entity, PacketDistributor.TRACKING_ENTITY.with(() -> entity)); + } + + public static void sync(LivingEntity entity, PacketDistributor.PacketTarget target) { + getCapabilityOptional(entity).ifPresent(c -> PacketRegistry.MALUM_CHANNEL.send(target, new SyncLivingCapabilityDataPacket(entity.getId(), c.serializeNBT()))); } public static LazyOptional getCapabilityOptional(LivingEntity entity) { diff --git a/src/main/java/com/sammy/malum/common/container/SpiritPouchContainer.java b/src/main/java/com/sammy/malum/common/container/SpiritPouchContainer.java index d5e1d7f1d..10bfa9a65 100644 --- a/src/main/java/com/sammy/malum/common/container/SpiritPouchContainer.java +++ b/src/main/java/com/sammy/malum/common/container/SpiritPouchContainer.java @@ -12,6 +12,7 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.systems.container.ItemInventory; import javax.annotation.Nonnull; @@ -72,7 +73,7 @@ public boolean mayPlace(ItemStack pStack) { @Override public void removed(Player playerIn) { - playerIn.level().playSound(null, playerIn.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1, 1); + SoundHelper.playSound(playerIn, SoundEvents.ARMOR_EQUIP_LEATHER, 1, 1); super.removed(playerIn); this.inventory.stopOpen(playerIn); } diff --git a/src/main/java/com/sammy/malum/common/effect/EchoingArcanaEffect.java b/src/main/java/com/sammy/malum/common/effect/EchoingArcanaEffect.java new file mode 100644 index 000000000..1b6583da1 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/effect/EchoingArcanaEffect.java @@ -0,0 +1,20 @@ +package com.sammy.malum.common.effect; + +import com.sammy.malum.registry.common.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.*; +import team.lodestar.lodestone.helpers.*; + +import java.awt.*; + +public class EchoingArcanaEffect extends MobEffect { + public EchoingArcanaEffect() { + super(MobEffectCategory.BENEFICIAL, ColorHelper.getColor(new Color(255, 79, 234))); + addAttributeModifier(AttributeRegistry.ARCANE_RESONANCE.get(), "04448cbf-ee2c-4f36-b71f-e641a312834a", 0.05f, AttributeModifier.Operation.MULTIPLY_TOTAL); + } + + @Override + public void applyEffectTick(LivingEntity entityLivingBaseIn, int amplifier) { + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/effect/GluttonyEffect.java b/src/main/java/com/sammy/malum/common/effect/GluttonyEffect.java index 88010cd69..0ffee1199 100644 --- a/src/main/java/com/sammy/malum/common/effect/GluttonyEffect.java +++ b/src/main/java/com/sammy/malum/common/effect/GluttonyEffect.java @@ -24,7 +24,7 @@ public class GluttonyEffect extends MobEffect { public GluttonyEffect() { super(MobEffectCategory.BENEFICIAL, ColorHelper.getColor(88, 86, 60)); - addAttributeModifier(LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), "4d82fd0a-24b6-45f5-8d7a-983f99fd6783", 2f, AttributeModifier.Operation.ADDITION); + addAttributeModifier(LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), "4d82fd0a-24b6-45f5-8d7a-983f99fd6783", 0.2f, AttributeModifier.Operation.MULTIPLY_TOTAL); } public static void canApplyPotion(MobEffectEvent.Applicable event) { diff --git a/src/main/java/com/sammy/malum/common/effect/ImminentDeliveranceEffect.java b/src/main/java/com/sammy/malum/common/effect/ImminentDeliveranceEffect.java new file mode 100644 index 000000000..c32c645b8 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/effect/ImminentDeliveranceEffect.java @@ -0,0 +1,15 @@ +package com.sammy.malum.common.effect; + +import com.sammy.malum.registry.common.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.*; +import team.lodestar.lodestone.helpers.*; + +import java.awt.*; + +public class ImminentDeliveranceEffect extends MobEffect { + public ImminentDeliveranceEffect() { + super(MobEffectCategory.HARMFUL, ColorHelper.getColor(235, 207, 249)); + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/effect/RejectedEffect.java b/src/main/java/com/sammy/malum/common/effect/RejectedEffect.java index f04906d5b..b98c99fb8 100644 --- a/src/main/java/com/sammy/malum/common/effect/RejectedEffect.java +++ b/src/main/java/com/sammy/malum/common/effect/RejectedEffect.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.*; -import team.lodestar.lodestone.helpers.ColorHelper; +import team.lodestar.lodestone.helpers.*; public class RejectedEffect extends MobEffect { public RejectedEffect() { @@ -25,7 +25,7 @@ public void applyEffectTick(LivingEntity pLivingEntity, int pAmplifier) { if (pLivingEntity instanceof Player player && player.isCreative()) { return; } - pLivingEntity.hurt(DamageTypeRegistry.create(pLivingEntity.level(), DamageTypeRegistry.VOODOO), 1); + pLivingEntity.hurt(DamageTypeHelper.create(pLivingEntity.level(), DamageTypeRegistry.VOODOO), 1); } } diff --git a/src/main/java/com/sammy/malum/common/effect/SacrificialEmpowermentEffect.java b/src/main/java/com/sammy/malum/common/effect/SacrificialEmpowermentEffect.java index de479366f..fe377f302 100644 --- a/src/main/java/com/sammy/malum/common/effect/SacrificialEmpowermentEffect.java +++ b/src/main/java/com/sammy/malum/common/effect/SacrificialEmpowermentEffect.java @@ -8,7 +8,7 @@ public class SacrificialEmpowermentEffect extends MobEffect { public SacrificialEmpowermentEffect() { super(MobEffectCategory.BENEFICIAL, ColorHelper.getColor(SpiritTypeRegistry.WICKED_SPIRIT.getPrimaryColor())); - addAttributeModifier(AttributeRegistry.SCYTHE_PROFICIENCY.get(), "5149e7f4-8f69-404e-9011-27396058db80", 4f, AttributeModifier.Operation.ADDITION); + addAttributeModifier(AttributeRegistry.SCYTHE_PROFICIENCY.get(), "5149e7f4-8f69-404e-9011-27396058db80", 0.15f, AttributeModifier.Operation.MULTIPLY_BASE); } diff --git a/src/main/java/com/sammy/malum/common/effect/SilencedEffect.java b/src/main/java/com/sammy/malum/common/effect/SilencedEffect.java index f17138d48..6e062a960 100644 --- a/src/main/java/com/sammy/malum/common/effect/SilencedEffect.java +++ b/src/main/java/com/sammy/malum/common/effect/SilencedEffect.java @@ -16,7 +16,7 @@ public SilencedEffect() { addAttributeModifier(LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), "c7a4eea8-38ee-4b56-8623-02c9f4a8b363", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); addAttributeModifier(LodestoneAttributeRegistry.MAGIC_RESISTANCE.get(), "90d9ba7f-4023-4b6a-88f0-d50ec5ee1040", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); - addAttributeModifier(AttributeRegistry.SOUL_WARD_STRENGTH.get(), "c804e494-0f03-49e3-b9e1-c382ddd98927", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); + addAttributeModifier(AttributeRegistry.SOUL_WARD_INTEGRITY.get(), "c804e494-0f03-49e3-b9e1-c382ddd98927", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); addAttributeModifier(AttributeRegistry.SOUL_WARD_CAP.get(), "e0e391f4-ca5c-4237-a261-fbcb85d2a491", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); addAttributeModifier(AttributeRegistry.SOUL_WARD_RECOVERY_RATE.get(), "c460be81-7c50-499d-b66f-ec7b78f917e4", -0.1f, AttributeModifier.Operation.MULTIPLY_TOTAL); diff --git a/src/main/java/com/sammy/malum/common/effect/WickedIntentEffect.java b/src/main/java/com/sammy/malum/common/effect/WickedIntentEffect.java index 305e391cb..12e4a587b 100644 --- a/src/main/java/com/sammy/malum/common/effect/WickedIntentEffect.java +++ b/src/main/java/com/sammy/malum/common/effect/WickedIntentEffect.java @@ -1,44 +1,14 @@ package com.sammy.malum.common.effect; -import com.sammy.malum.common.item.curiosities.weapons.scythe.MalumScytheItem; import com.sammy.malum.registry.common.AttributeRegistry; -import com.sammy.malum.registry.common.MobEffectRegistry; -import com.sammy.malum.registry.common.SoundRegistry; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.living.LivingDamageEvent; import team.lodestar.lodestone.helpers.ColorHelper; -import team.lodestar.lodestone.registry.common.tag.*; public class WickedIntentEffect extends MobEffect { public WickedIntentEffect() { super(MobEffectCategory.BENEFICIAL, ColorHelper.getColor(88, 86, 60)); - addAttributeModifier(AttributeRegistry.SCYTHE_PROFICIENCY.get(), "0cd21cec-758c-456b-9955-06713e732303", 4f, AttributeModifier.Operation.ADDITION); - } - - public static void removeWickedIntent(LivingDamageEvent event) { - DamageSource source = event.getSource(); - if (source.is(LodestoneDamageTypeTags.IS_MAGIC) || (source.is(DamageTypes.THORNS))) { - return; - } - if (source.getEntity() instanceof LivingEntity livingEntity) { - if (MalumScytheItem.getScytheItemStack(source, livingEntity).isEmpty()) { - return; - } - MobEffectInstance effect = livingEntity.getEffect(MobEffectRegistry.WICKED_INTENT.get()); - if (effect != null) { - Level level = livingEntity.level(); - livingEntity.removeEffect(effect.getEffect()); - level.playSound(null, livingEntity.blockPosition(), SoundRegistry.HIDDEN_BLADE_STRIKES.get(), SoundSource.PLAYERS, 2.5f, 1 + level.random.nextFloat() * 0.15f); - } - } } @Override diff --git a/src/main/java/com/sammy/malum/common/enchantment/ReboundEnchantment.java b/src/main/java/com/sammy/malum/common/enchantment/ReboundEnchantment.java index d9c449f14..f0b866739 100644 --- a/src/main/java/com/sammy/malum/common/enchantment/ReboundEnchantment.java +++ b/src/main/java/com/sammy/malum/common/enchantment/ReboundEnchantment.java @@ -1,7 +1,7 @@ package com.sammy.malum.common.enchantment; import com.sammy.malum.common.entity.boomerang.ScytheBoomerangEntity; -import com.sammy.malum.registry.common.AttributeRegistry; +import com.sammy.malum.registry.common.*; import com.sammy.malum.registry.common.item.EnchantmentRegistry; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; @@ -13,6 +13,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.registry.common.LodestoneAttributeRegistry; public class ReboundEnchantment extends Enchantment { @@ -31,17 +32,20 @@ public static void onRightClickItem(PlayerInteractEvent.RightClickItem event) { if (EnchantmentHelper.getItemEnchantmentLevel(EnchantmentRegistry.REBOUND.get(), stack) > 0) { Level level = player.level(); if (!level.isClientSide) { - player.setItemInHand(event.getHand(), ItemStack.EMPTY); float baseDamage = (float) player.getAttributes().getValue(Attributes.ATTACK_DAMAGE); float magicDamage = (float) player.getAttributes().getValue(LodestoneAttributeRegistry.MAGIC_DAMAGE.get()); + float velocity = (float) (1.5F + 0.5f * player.getAttributeValue(AttributeRegistry.SCYTHE_PROFICIENCY.get())); - int slot = event.getHand() == InteractionHand.OFF_HAND ? player.getInventory().getContainerSize() - 1 : player.getInventory().selected; - ScytheBoomerangEntity entity = new ScytheBoomerangEntity(level, player.position().x, player.position().y + player.getBbHeight() / 2f, player.position().z); + var hand = event.getHand(); + int slot = hand == InteractionHand.OFF_HAND ? player.getInventory().getContainerSize() - 1 : player.getInventory().selected; + var entity = new ScytheBoomerangEntity(level, player.position().x, player.position().y + player.getBbHeight() / 2f, player.position().z); entity.setData(player, baseDamage, magicDamage, slot); entity.setItem(stack); - - entity.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, (float) (1.5F + player.getAttributeValue(AttributeRegistry.SCYTHE_PROFICIENCY.get()) * 0.125f), 0F); + entity.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, velocity, 0F); level.addFreshEntity(entity); + player.setItemInHand(hand, ItemStack.EMPTY); + player.swing(hand, true); + SoundHelper.playSound(player, SoundRegistry.SCYTHE_THROW.get(),2.0f, RandomHelper.randomBetween(level.getRandom(), 0.75f, 1.25f)); } player.awardStat(Stats.ITEM_USED.get(stack.getItem())); } diff --git a/src/main/java/com/sammy/malum/common/entity/FloatingEntity.java b/src/main/java/com/sammy/malum/common/entity/FloatingEntity.java index 5f4e0f27e..fafbe58e9 100644 --- a/src/main/java/com/sammy/malum/common/entity/FloatingEntity.java +++ b/src/main/java/com/sammy/malum/common/entity/FloatingEntity.java @@ -21,7 +21,7 @@ public abstract class FloatingEntity extends Entity { - public final TrailPointBuilder trailPointBuilder = TrailPointBuilder.create(10); + public final TrailPointBuilder trail = TrailPointBuilder.create(10); public int age; public int maxAge; @@ -122,7 +122,6 @@ public void tick() { } } - //vanilla stump BlockHitResult result = level().clip(new ClipContext(position(), position().add(getDeltaMovement()), ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)); if (result.getType() == HitResult.Type.BLOCK) { @@ -151,22 +150,17 @@ public void tick() { setPos(nextX, nextY, nextZ); ProjectileUtil.rotateTowardsMovement(this, 0.2F); + if (level().isClientSide) { - double x = xOld, y = yOld + getYOffset(0), z = zOld; - spawnParticles(x, y, z); + spawnParticles(xOld, yOld + getYOffset(0), zOld); for (int i = 0; i < 2; i++) { float progress = (i+1) * 0.5f; Vec3 position = getPosition(progress).add(0, getYOffset(progress), 0); - trailPointBuilder.addTrailPoint(position); - if (i == 0) { - float f = 0; - } - if (i == 1) { - float f = 0; - } + trail.addTrailPoint(position); } - trailPointBuilder.tickTrailPoints(); + trail.tickTrailPoints(); } + } @Override diff --git a/src/main/java/com/sammy/malum/common/entity/activator/SpiritCollectionActivatorEntity.java b/src/main/java/com/sammy/malum/common/entity/activator/SpiritCollectionActivatorEntity.java index 1566447e9..cdee2436a 100644 --- a/src/main/java/com/sammy/malum/common/entity/activator/SpiritCollectionActivatorEntity.java +++ b/src/main/java/com/sammy/malum/common/entity/activator/SpiritCollectionActivatorEntity.java @@ -29,6 +29,11 @@ public SpiritCollectionActivatorEntity(Level level, UUID ownerUUID, double posX, maxAge = 800; } + @Override + public SoundSource getSoundSource() { + return SoundSource.NEUTRAL; + } + @Override public void collect() { AttributeInstance instance = owner.getAttribute(AttributeRegistry.ARCANE_RESONANCE.get()); @@ -37,7 +42,7 @@ public void collect() { eventItem.pickupSpirit(owner, instance != null ? instance.getValue() : 0); } }); - level().playSound(null, blockPosition(), SoundRegistry.SPIRIT_PICKUP.get(), SoundSource.NEUTRAL, 0.3f, Mth.nextFloat(random, 1.2f, 1.5f)); + SoundHelper.playSound(this, SoundRegistry.SPIRIT_PICKUP.get(), 0.3f, Mth.nextFloat(random, 1.2f, 1.5f)); } @Override diff --git a/src/main/java/com/sammy/malum/common/entity/bolt/AbstractBoltProjectileEntity.java b/src/main/java/com/sammy/malum/common/entity/bolt/AbstractBoltProjectileEntity.java index 2e24d0cfb..012bed0a8 100644 --- a/src/main/java/com/sammy/malum/common/entity/bolt/AbstractBoltProjectileEntity.java +++ b/src/main/java/com/sammy/malum/common/entity/bolt/AbstractBoltProjectileEntity.java @@ -148,7 +148,7 @@ protected void onHitEntity(EntityHitResult result) { if (getOwner() instanceof LivingEntity staffOwner) { Entity target = result.getEntity(); target.invulnerableTime = 0; - DamageSource source = DamageTypeRegistry.create(level(), DamageTypeRegistry.VOODOO, this, staffOwner); + DamageSource source = DamageTypeHelper.create(level(), DamageTypeRegistry.VOODOO, this, staffOwner); boolean success = target.hurt(source, magicDamage); if (success && target instanceof LivingEntity livingentity) { onDealDamage(livingentity); diff --git a/src/main/java/com/sammy/malum/common/entity/boomerang/ScytheBoomerangEntity.java b/src/main/java/com/sammy/malum/common/entity/boomerang/ScytheBoomerangEntity.java index 3e8bb52b9..905dd5d80 100644 --- a/src/main/java/com/sammy/malum/common/entity/boomerang/ScytheBoomerangEntity.java +++ b/src/main/java/com/sammy/malum/common/entity/boomerang/ScytheBoomerangEntity.java @@ -19,11 +19,16 @@ import net.minecraft.world.phys.*; import net.minecraftforge.items.*; import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.rendering.trail.*; import java.util.*; public class ScytheBoomerangEntity extends ThrowableItemProjectile { + public final TrailPointBuilder theFormer = TrailPointBuilder.create(8); + public final TrailPointBuilder theLatter = TrailPointBuilder.create(8); + public float spinOffset = (float) (random.nextFloat() * Math.PI * 2); + protected int slot; protected float damage; protected float magicDamage; @@ -87,6 +92,11 @@ public void readAdditionalSaveData(CompoundTag compound) { protected void onHitBlock(BlockHitResult result) { super.onHitBlock(result); returnTimer = 0; + if (getOwner() instanceof LivingEntity scytheOwner) { + var ownerPos = scytheOwner.position().add(0, 1, 0); + var returnMotion = ownerPos.subtract(position()).normalize().scale(0.75f); + setDeltaMovement(returnMotion); + } } @Override @@ -96,9 +106,13 @@ protected boolean canHitEntity(Entity pTarget) { @Override protected void onHitEntity(EntityHitResult result) { - if (getOwner() instanceof LivingEntity scytheOwner && !level().isClientSide) { + if (level().isClientSide()) { + return; + } + if (getOwner() instanceof LivingEntity scytheOwner) { Entity target = result.getEntity(); - DamageSource source = target.damageSources().mobProjectile(this, scytheOwner); + DamageSource source = DamageTypeHelper.create(level(), DamageTypeRegistry.SCYTHE_SWEEP, this, scytheOwner); + target.invulnerableTime = 0; boolean success = target.hurt(source, damage); if (success && target instanceof LivingEntity livingentity) { ItemStack scythe = getItem(); @@ -111,13 +125,13 @@ protected void onHitEntity(EntityHitResult result) { if (magicDamage > 0) { if (!livingentity.isDeadOrDying()) { livingentity.invulnerableTime = 0; - livingentity.hurt(DamageTypeRegistry.create(level(), DamageTypeRegistry.VOODOO, this, scytheOwner), magicDamage); + livingentity.hurt(DamageTypeHelper.create(level(), DamageTypeRegistry.VOODOO, this, scytheOwner), magicDamage); } } - + enemiesHit+=1; } returnTimer += 4; - target.level().playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.SCYTHE_CUT.get(), target.getSoundSource(), 1.0F, 0.9f + target.level().random.nextFloat() * 0.2f); + SoundHelper.playSound(this, SoundRegistry.SCYTHE_SWEEP.get(),1.0f, RandomHelper.randomBetween(level().getRandom(), 0.75f, 1.25f)); } super.onHitEntity(result); } @@ -126,66 +140,96 @@ protected void onHitEntity(EntityHitResult result) { public void tick() { super.tick(); age++; - ItemStack scythe = getItem(); - final Level level = level(); + var scythe = getItem(); + var level = level(); if (level.isClientSide) { + for (int i = 0; i < 2; i++) { + float progress = (i + 1) * 0.5f; + Vec3 position = getPosition(progress); + float scalar = (age + progress) / 2f; + for (int j = 0; j < 2; j++) { + var trail = j == 0 ? theFormer : theLatter; + double xOffset = Math.cos(spinOffset + 3.14f * j + scalar) * 1.2f; + double zOffset = Math.sin(spinOffset + 3.14f * j + scalar) * 1.2f; + trail.addTrailPoint(position.add(xOffset, 0, zOffset)); + } + } + theFormer.tickTrailPoints(); + theLatter.tickTrailPoints(); + if (!isInWaterRainOrBubble()) { if (getItem().getEnchantmentLevel(Enchantments.FIRE_ASPECT) > 0) { Vec3 vector = new Vec3(getRandomX(0.7), getRandomY(), getRandomZ(0.7)); if (scythe.getItem() instanceof MalumScytheItem) { - Random random = new Random(); float rotation = random.nextFloat(); - vector = new Vec3(Math.cos(this.age) * 0.8f + this.getX(), getY(0.1), Math.sin(this.age) * 0.8f + this.getZ()); - level.addParticle(ParticleTypes.FLAME, Math.cos(this.age + rotation * 2 - 1) * 0.8f + this.getX(), vector.y, Math.sin(this.age + rotation * 2 - 1) * 0.8f + this.getZ(), 0, 0, 0); - level.addParticle(ParticleTypes.FLAME, Math.cos(this.age + rotation * 2 - 1) * 0.8f + this.getX(), vector.y, Math.sin(this.age + rotation * 2 - 1) * 0.8f + this.getZ(), 0, 0, 0); + vector = new Vec3(getX() + Math.cos(age) * 1.2f, getY(0.1), getZ() + Math.sin(age) * 1.2f); + double x = Math.cos(age + rotation * 2 - 1) * 0.8f + getX(); + double z = Math.sin(age + rotation * 2 - 1) * 0.8f + getZ(); + level.addParticle(ParticleTypes.FLAME, x, vector.y, z, 0, 0, 0); + level.addParticle(ParticleTypes.FLAME, x, vector.y, z, 0, 0, 0); } level.addParticle(ParticleTypes.FLAME, vector.x, vector.y, vector.z, 0, 0, 0); } } } else { - Entity owner = getOwner(); + var owner = getOwner(); if (owner == null || !owner.isAlive() || !owner.level().equals(level()) || distanceTo(owner) > 1000f) { if (age > 3600) { ItemEntity itemEntity = new ItemEntity(level, getX(), getY() + 0.5, getZ(), scythe); itemEntity.setPickUpDelay(40); + itemEntity.setNoGravity(true); level.addFreshEntity(itemEntity); remove(RemovalReason.DISCARDED); } + if (level().getGameTime() % 40L == 0) { + Player playerEntity = level().getNearestPlayer(this, 50); + if (playerEntity != null) { + setOwner(playerEntity); + } + } setDeltaMovement(Vec3.ZERO); return; } if (owner instanceof LivingEntity scytheOwner) { if (age % 3 == 0) { - level.playSound(null, blockPosition(), SoundEvents.PLAYER_ATTACK_SWEEP, SoundSource.PLAYERS, 0.75f, 1.25f); + float pitch = (float) (0.8f + Math.sin(level.getGameTime() * 0.5f) * 0.2f); + float volumeScalar = Mth.clamp(age / 12f, 0, 1f); + if (isInWater()) { + volumeScalar *= 0.2f; + pitch *= 0.5f; + } + SoundHelper.playSound(this, SoundRegistry.SCYTHE_SPINS.get(),0.6f * volumeScalar, pitch); + SoundHelper.playSound(this, SoundRegistry.SCYTHE_SWEEP.get(),0.4f * volumeScalar, pitch); } - if (this.xRotO == 0.0F && this.yRotO == 0.0F) { - Vec3 motion = getDeltaMovement(); + var motion = getDeltaMovement(); + if (xRotO == 0.0F && yRotO == 0.0F) { setYRot((float) (Mth.atan2(motion.x, motion.z) * (double) (180F / (float) Math.PI))); yRotO = getYRot(); xRotO = getXRot(); } if (returnTimer <= 0) { noPhysics = true; - Vec3 ownerPos = scytheOwner.position().add(0, 1, 0); - Vec3 motion = ownerPos.subtract(position()); - setDeltaMovement(motion.normalize().scale(0.75f)); + var ownerPos = scytheOwner.position().add(0, scytheOwner.getBbHeight()*0.6f, 0); + var returnMotion = ownerPos.subtract(position()).normalize().scale(Mth.clamp(motion.length()*3, 0.5f, 2f)); float distance = distanceTo(scytheOwner); if (isAlive() && distance < 3f) { if (scytheOwner instanceof Player player) { ItemHandlerHelper.giveItemToPlayer(player, scythe, slot); if (!player.isCreative()) { - int enchantmentLevel = EnchantmentHelper.getItemEnchantmentLevel(EnchantmentRegistry.REBOUND.get(), scythe); + int enchantmentLevel = scythe.getEnchantmentLevel(EnchantmentRegistry.REBOUND.get()); if (enchantmentLevel < 4) { - int cooldown = 100 - 25 * (enchantmentLevel - 1); - if (cooldown > 0) { - player.getCooldowns().addCooldown(scythe.getItem(), cooldown); - } + player.getCooldowns().addCooldown(scythe.getItem(), 100 - 25 * (enchantmentLevel - 1)); } } + SoundHelper.playSound(this, SoundRegistry.SCYTHE_CATCH.get(),1.5f, RandomHelper.randomBetween(level().getRandom(), 0.75f, 1.25f)); remove(RemovalReason.DISCARDED); } } + double x = Mth.lerp(0.1f, motion.x, returnMotion.x); + double y = Mth.lerp(0.1f, motion.y, returnMotion.y); + double z = Mth.lerp(0.1f, motion.z, returnMotion.z); + setDeltaMovement(new Vec3(x, y, z)); } returnTimer--; } @@ -201,6 +245,11 @@ public void shootFromRotation(Entity shooter, float rotationPitch, float rotatio this.setDeltaMovement(this.getDeltaMovement().add(vec3.x, 0, vec3.z)); } + @Override + protected Item getDefaultItem() { + return ItemRegistry.SOUL_STAINED_STEEL_SCYTHE.get(); + } + @Override public boolean isNoGravity() { return true; @@ -211,11 +260,6 @@ public float getPickRadius() { return 4f; } - @Override - protected Item getDefaultItem() { - return ItemRegistry.SOUL_STAINED_STEEL_SCYTHE.get(); - } - @Override public boolean fireImmune() { return true; diff --git a/src/main/java/com/sammy/malum/common/entity/hidden_blade/HiddenBladeDelayedImpactEntity.java b/src/main/java/com/sammy/malum/common/entity/hidden_blade/HiddenBladeDelayedImpactEntity.java new file mode 100644 index 000000000..b03f321f6 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/entity/hidden_blade/HiddenBladeDelayedImpactEntity.java @@ -0,0 +1,155 @@ +package com.sammy.malum.common.entity.hidden_blade; + +import com.sammy.malum.common.item.curiosities.weapons.scythe.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.registry.common.entity.*; +import com.sammy.malum.registry.common.item.*; +import net.minecraft.core.particles.*; +import net.minecraft.nbt.*; +import net.minecraft.network.syncher.*; +import net.minecraft.sounds.*; +import net.minecraft.util.*; +import net.minecraft.world.damagesource.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.item.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.items.*; +import team.lodestar.lodestone.helpers.*; + +import java.util.*; + +import static net.minecraft.world.entity.projectile.ProjectileUtil.getEntityHitResult; + +public class HiddenBladeDelayedImpactEntity extends ThrowableItemProjectile { + + protected float damage; + protected float magicDamage; + public int age; + public int duration = 25; + + public int enemiesHit; + + public HiddenBladeDelayedImpactEntity(Level level) { + super(EntityRegistry.HIDDEN_BLADE_DELAYED_IMPACT.get(), level); + noPhysics = false; + } + + public HiddenBladeDelayedImpactEntity(Level level, double pX, double pY, double pZ) { + super(EntityRegistry.HIDDEN_BLADE_DELAYED_IMPACT.get(), pX, pY, pZ, level); + noPhysics = false; + } + + public void setData(Entity owner, float damage, float magicDamage, int duration) { + setOwner(owner); + this.damage = damage; + this.magicDamage = magicDamage; + this.duration = duration; + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + if (damage != 0) { + compound.putFloat("damage", damage); + } + if (magicDamage != 0) { + compound.putFloat("magicDamage", magicDamage); + } + if (age != 0) { + compound.putInt("age", age); + } + if (duration != 0) { + compound.putInt("duration", duration); + } + if (enemiesHit != 0) { + compound.putInt("enemiesHit", enemiesHit); + } + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + damage = compound.getFloat("damage"); + magicDamage = compound.getFloat("magicDamage"); + age = compound.getInt("age"); + duration = compound.getInt("duration"); + enemiesHit = compound.getInt("enemiesHit"); + } + + @Override + protected boolean canHitEntity(Entity pTarget) { + return !pTarget.equals(getOwner()) && super.canHitEntity(pTarget); + } + + @Override + protected void onHitEntity(EntityHitResult result) { + if (getOwner() instanceof LivingEntity scytheOwner) { + Entity target = result.getEntity(); + DamageSource source = DamageTypeHelper.create(level(), DamageTypeRegistry.HIDDEN_BLADE_COUNTER, this, scytheOwner); + target.invulnerableTime = 0; + final Vec3 deltaMovement = target.getDeltaMovement(); + boolean success = target.hurt(source, damage); + if (success && target instanceof LivingEntity livingentity) { + ItemStack scythe = getItem(); + ItemHelper.applyEnchantments(scytheOwner, livingentity, scythe); + int i = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FIRE_ASPECT, scythe); + if (i > 0) { + livingentity.setSecondsOnFire(i * 4); + } + if (magicDamage > 0) { + if (!livingentity.isDeadOrDying()) { + target.invulnerableTime = 0; + livingentity.hurt(DamageTypeHelper.create(level(), DamageTypeRegistry.VOODOO, this, scytheOwner), magicDamage); + } + } + enemiesHit+=1; + } + target.setDeltaMovement(deltaMovement); + SoundHelper.playSound(this, SoundRegistry.SCYTHE_CUT.get(), 1.0F, 0.9f + level().getRandom().nextFloat() * 0.2f); + } + super.onHitEntity(result); + } + + @Override + public void tick() { + age++; + if (!level().isClientSide()) { + for(Entity target : level().getEntities(this, getBoundingBox(), this::canHitEntity)) { + onHitEntity(new EntityHitResult(target)); + } + if (age >= duration) { + remove(RemovalReason.DISCARDED); + } + } + } + + @Override + protected Item getDefaultItem() { + return ItemRegistry.SOUL_STAINED_STEEL_SCYTHE.get(); + } + + @Override + public boolean isNoGravity() { + return true; + } + + @Override + public float getPickRadius() { + return 4f; + } + + @Override + public boolean fireImmune() { + return true; + } + + @Override + public boolean ignoreExplosion() { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/entity/nitrate/NitrateExplosion.java b/src/main/java/com/sammy/malum/common/entity/nitrate/NitrateExplosion.java index c17d70f7e..716c5a47a 100644 --- a/src/main/java/com/sammy/malum/common/entity/nitrate/NitrateExplosion.java +++ b/src/main/java/com/sammy/malum/common/entity/nitrate/NitrateExplosion.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.Level; import net.minecraftforge.event.level.ExplosionEvent; import org.jetbrains.annotations.Nullable; +import team.lodestar.lodestone.helpers.*; public class NitrateExplosion extends Explosion { @@ -19,9 +20,9 @@ public NitrateExplosion(Level pLevel, @Nullable Entity pSource, @Nullable Damage @Override public DamageSource getDamageSource() { if (getDirectSourceEntity() != null) { - return DamageTypeRegistry.create(getDirectSourceEntity().level(), DamageTypeRegistry.VOODOO, getDirectSourceEntity()); + return DamageTypeHelper.create(getDirectSourceEntity().level(), DamageTypeRegistry.VOODOO, getDirectSourceEntity()); } - return DamageTypeRegistry.create(getDirectSourceEntity().level(), DamageTypeRegistry.VOODOO); + return DamageTypeHelper.create(getDirectSourceEntity().level(), DamageTypeRegistry.VOODOO); } public static void processExplosion(ExplosionEvent.Detonate event) { diff --git a/src/main/java/com/sammy/malum/common/entity/spirit/SpiritItemEntity.java b/src/main/java/com/sammy/malum/common/entity/spirit/SpiritItemEntity.java index 80e2cdfcb..97ddbbe9b 100644 --- a/src/main/java/com/sammy/malum/common/entity/spirit/SpiritItemEntity.java +++ b/src/main/java/com/sammy/malum/common/entity/spirit/SpiritItemEntity.java @@ -36,6 +36,11 @@ public SpiritItemEntity(Level level, UUID ownerUUID, ItemStack stack, double pos } } + @Override + public SoundSource getSoundSource() { + return SoundSource.NEUTRAL; + } + @Override public void collect() { ItemStack stack = getItem(); @@ -45,18 +50,20 @@ public void collect() { ItemHelper.giveItemToEntity(owner, stack); } if (random.nextFloat() < 0.6f) { - level().playSound(null, blockPosition(), SoundRegistry.SPIRIT_PICKUP.get(), SoundSource.NEUTRAL, 0.3f, Mth.nextFloat(random, 1.1f, 2f)); + SoundHelper.playSound(this, SoundRegistry.SPIRIT_PICKUP.get(), 0.3f, Mth.nextFloat(random, 1.1f, 2f)); } } @Override public void tick() { super.tick(); - if (soundCooldown-- == 0) { - if (random.nextFloat() < 0.4f) { - level().playSound(null, blockPosition(), SoundRegistry.ARCANE_WHISPERS.get(), SoundSource.NEUTRAL, 0.3f, Mth.nextFloat(random, 0.8f, 2f)); + if (!level().isClientSide()) { + if (soundCooldown-- == 0) { + if (random.nextFloat() < 0.4f) { + SoundHelper.playSound(this, SoundRegistry.ARCANE_WHISPERS.get(), 0.3f, Mth.nextFloat(random, 0.8f, 2f)); + } + soundCooldown = 40 + random.nextInt(40); } - soundCooldown = random.nextInt(40) + 40; } } diff --git a/src/main/java/com/sammy/malum/common/item/IMalumEventResponderItem.java b/src/main/java/com/sammy/malum/common/item/IMalumEventResponderItem.java index e671616e8..3416a78d9 100644 --- a/src/main/java/com/sammy/malum/common/item/IMalumEventResponderItem.java +++ b/src/main/java/com/sammy/malum/common/item/IMalumEventResponderItem.java @@ -11,19 +11,19 @@ default void pickupSpirit(LivingEntity collector, double arcaneResonance) { } - default float overrideSoulwardDamageAbsorbPercentage(LivingHurtEvent event, LivingEntity wardedEntity, ItemStack stack, float original) { - return overrideSoulwardDamageAbsorbPercentage(wardedEntity, stack, original); + default float adjustSoulWardDamageAbsorption(LivingHurtEvent event, LivingEntity wardedEntity, ItemStack stack, float original) { + return adjustSoulWardDamageAbsorption(wardedEntity, stack, original); } - default float overrideSoulwardDamageAbsorbPercentage(LivingEntity wardedEntity, ItemStack stack, float original) { + default float adjustSoulWardDamageAbsorption(LivingEntity wardedEntity, ItemStack stack, float original) { return original; } - default void onSoulwardAbsorbDamage(LivingHurtEvent event, Player wardedPlayer, ItemStack stack, float soulwardLost, float damageAbsorbed) { + default void onSoulwardAbsorbDamage(LivingHurtEvent event, Player wardedPlayer, ItemStack stack, double soulwardLost, float damageAbsorbed) { onSoulwardAbsorbDamage(wardedPlayer, stack, soulwardLost, damageAbsorbed); } - default void onSoulwardAbsorbDamage(Player wardedPlayer, ItemStack stack, float soulwardLost, float damageAbsorbed) { + default void onSoulwardAbsorbDamage(Player wardedPlayer, ItemStack stack, double soulwardLost, float damageAbsorbed) { } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/ISpiritAffiliatedItem.java b/src/main/java/com/sammy/malum/common/item/ISpiritAffiliatedItem.java new file mode 100644 index 000000000..c17c55f60 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/item/ISpiritAffiliatedItem.java @@ -0,0 +1,9 @@ +package com.sammy.malum.common.item; + +import com.sammy.malum.core.systems.spirit.*; + +public interface ISpiritAffiliatedItem { + + MalumSpiritType getDefiningSpiritType(); + +} diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/CatalystFlingerItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/CatalystFlingerItem.java index b9c7bb03a..ffb53d4de 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/CatalystFlingerItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/CatalystFlingerItem.java @@ -28,19 +28,9 @@ public CatalystFlingerItem(Properties pProperties, Function use(Level level, Player playerIn, InteractionHand handIn) { if (!level.isClientSide) { ItemStack stack = playerIn.getItemInHand(handIn); - MenuProvider container = - new SimpleMenuProvider((w, p, pl) -> new SpiritPouchContainer(w, p, stack), stack.getHoverName()); + MenuProvider container = new SimpleMenuProvider((w, p, pl) -> new SpiritPouchContainer(w, p, stack), stack.getHoverName()); NetworkHooks.openScreen((ServerPlayer) playerIn, container, b -> b.writeItem(stack)); - playerIn.level().playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1, 1); + SoundHelper.playSound(playerIn, SoundEvents.ARMOR_EQUIP_LEATHER, 1, 1); } return InteractionResultHolder.success(playerIn.getItemInHand(handIn)); } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulHunterArmorItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulHunterArmorItem.java index 80565116f..855024a03 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulHunterArmorItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulHunterArmorItem.java @@ -33,7 +33,7 @@ public SoulHunterArmorItem(ArmorItem.Type slot, Properties builder) { public Multimap createExtraAttributes(Type type) { Multimap attributes = ArrayListMultimap.create(); UUID uuid = ARMOR_MODIFIER_UUID_PER_TYPE.get(type); - attributes.put(LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), new AttributeModifier(uuid, "Magic Proficiency", 2f, AttributeModifier.Operation.ADDITION)); + attributes.put(LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), new AttributeModifier(uuid, "Magic Proficiency", 0.15f, AttributeModifier.Operation.MULTIPLY_BASE)); return attributes; } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulStainedSteelArmorItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulStainedSteelArmorItem.java index a4675812f..0f27e43a6 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulStainedSteelArmorItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/armor/SoulStainedSteelArmorItem.java @@ -34,6 +34,7 @@ public Multimap createExtraAttributes(Type type) { Multimap attributes = ArrayListMultimap.create(); UUID uuid = ARMOR_MODIFIER_UUID_PER_TYPE.get(type); attributes.put(AttributeRegistry.SOUL_WARD_CAP.get(), new AttributeModifier(uuid, "Soul Ward Cap", 3f, AttributeModifier.Operation.ADDITION)); + attributes.put(AttributeRegistry.SOUL_WARD_RECOVERY_RATE.get(), new AttributeModifier(uuid, "Soul Ward Recovery Rate", 0.15f, AttributeModifier.Operation.MULTIPLY_BASE)); return attributes; } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneHereticItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneHereticItem.java index 102be8cd7..1778d0678 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneHereticItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneHereticItem.java @@ -9,7 +9,7 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import team.lodestar.lodestone.helpers.EntityHelper; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.systems.item.IEventResponderItem; import java.util.function.Consumer; @@ -35,6 +35,6 @@ public void takeDamageEvent(LivingEntity attacker, LivingEntity attacked, ItemSt EntityHelper.amplifyEffect(effect, attacker, 1, 9); EntityHelper.extendEffect(effect, attacker, 60, 600); } - attacked.level().playSound(null, attacked.getX(), attacked.getY(), attacked.getZ(), SoundRegistry.DRAINING_MOTIF.get(), attacked.getSoundSource(), 1f, 1.5f); + SoundHelper.playSound(attacked, SoundRegistry.DRAINING_MOTIF.get(), 1f, 1.5f); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneSpellMasteryItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneSpellMasteryItem.java index 4b6a98c4c..43ef5e19e 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneSpellMasteryItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneSpellMasteryItem.java @@ -17,7 +17,7 @@ public RuneSpellMasteryItem(Properties builder) { @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), uuid -> new AttributeModifier(uuid, - "Curio Magic Proficiency", 2f, AttributeModifier.Operation.ADDITION)); + "Curio Magic Proficiency", 0.1, AttributeModifier.Operation.MULTIPLY_BASE)); addAttributeModifier(map, AttributeRegistry.RESERVE_STAFF_CHARGES.get(), uuid -> new AttributeModifier(uuid, "Curio Reserve Staff Charges", 2f, AttributeModifier.Operation.ADDITION)); } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneToughnessItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneToughnessItem.java index 193551734..a8eea54c3 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneToughnessItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneToughnessItem.java @@ -16,6 +16,6 @@ public RuneToughnessItem(Properties builder) { @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, Attributes.ARMOR_TOUGHNESS, uuid -> new AttributeModifier(uuid, - "Curio Armor Toughness", 3f, AttributeModifier.Operation.ADDITION)); + "Curio Armor Toughness", 0.2f, AttributeModifier.Operation.MULTIPLY_TOTAL)); } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneTwinnedDurationItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneTwinnedDurationItem.java index 2dad2ae3e..000d0e2ca 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneTwinnedDurationItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/madness/RuneTwinnedDurationItem.java @@ -31,9 +31,8 @@ public static void onPotionApplied(MobEffectEvent.Added event) { if (event.getOldEffectInstance() == null && CurioHelper.hasCurioEquipped(entity, ItemRegistry.RUNE_OF_TWINNED_DURATION.get())) { MobEffectInstance effect = event.getEffectInstance(); MobEffect type = effect.getEffect(); - float multiplier = MobEffectRegistry.ALCHEMICAL_PROFICIENCY_MAP.getOrDefault(ForgeRegistries.MOB_EFFECTS.getKey(type), 1f); if (type.isBeneficial()) { - EntityHelper.extendEffect(effect, entity, (int) (effect.getDuration() * multiplier)); + EntityHelper.extendEffect(effect, entity, effect.getDuration()); } } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneAlimentCleansingItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneAlimentCleansingItem.java index f522b3446..8c4bf2d4f 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneAlimentCleansingItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneAlimentCleansingItem.java @@ -32,9 +32,8 @@ public static void onPotionApplied(MobEffectEvent.Added event) { if (event.getOldEffectInstance() == null && CurioHelper.hasCurioEquipped(entity, ItemRegistry.RUNE_OF_ALIMENT_CLEANSING.get())) { MobEffectInstance effect = event.getEffectInstance(); MobEffect type = effect.getEffect(); - float multiplier = MobEffectRegistry.ALCHEMICAL_PROFICIENCY_MAP.getOrDefault(ForgeRegistries.MOB_EFFECTS.getKey(type), 1f); if (type.getCategory().equals(MobEffectCategory.HARMFUL)) { - EntityHelper.shortenEffect(effect, entity, (int) (effect.getDuration() * 0.33f * multiplier)); + EntityHelper.shortenEffect(effect, entity, effect.getDuration() / 4); } } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneCullingItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneCullingItem.java index 7e1eb4016..33a7980e9 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneCullingItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneCullingItem.java @@ -17,6 +17,6 @@ public RuneCullingItem(Properties builder) { @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, LodestoneAttributeRegistry.MAGIC_PROFICIENCY.get(), uuid -> new AttributeModifier(uuid, - "Curio Magic Proficiency", 4f, AttributeModifier.Operation.ADDITION)); + "Curio Magic Proficiency", 0.2, AttributeModifier.Operation.MULTIPLY_BASE)); } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneReinforcementItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneReinforcementItem.java index 2ca50bbe2..0c9ccdec7 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneReinforcementItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/runes/miracle/RuneReinforcementItem.java @@ -17,7 +17,7 @@ public RuneReinforcementItem(Properties builder) { public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, AttributeRegistry.SOUL_WARD_CAP.get(), uuid -> new AttributeModifier(uuid, "Curio Soul Ward Capacity", 6f, AttributeModifier.Operation.ADDITION)); - addAttributeModifier(map, AttributeRegistry.SOUL_WARD_STRENGTH.get(), uuid -> new AttributeModifier(uuid, - "Curio Soul Ward Strength", 1f, AttributeModifier.Operation.ADDITION)); + addAttributeModifier(map, AttributeRegistry.SOUL_WARD_INTEGRITY.get(), uuid -> new AttributeModifier(uuid, + "Curio Soul Ward Strength", 0.25, AttributeModifier.Operation.MULTIPLY_BASE)); } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioAlchemicalRing.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioAlchemicalRing.java index 18b7ef689..c7d5fdd1e 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioAlchemicalRing.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioAlchemicalRing.java @@ -24,15 +24,16 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void pickupSpirit(LivingEntity collector, double arcaneResonance) { - collector.getActiveEffectsMap().forEach((e, i) -> { - float multiplier = MobEffectRegistry.ALCHEMICAL_PROFICIENCY_MAP.getOrDefault(ForgeRegistries.MOB_EFFECTS.getKey(e), 1f); + for (MobEffectInstance instance : collector.getActiveEffectsMap().values()) { + var e = instance.getEffect(); + int durationChange = (int) ((e.isBeneficial() ? 60 : 120) * arcaneResonance); if (e.isBeneficial()) { - int base = 60 + (int) (arcaneResonance * 40); - EntityHelper.extendEffect(i, collector, (int) (base * multiplier), 1200); - } else if (e.getCategory().equals(MobEffectCategory.HARMFUL)) { - int base = 100 + (int) (arcaneResonance * 60); - EntityHelper.shortenEffect(i, collector, (int) (base * multiplier)); + EntityHelper.extendEffect(instance, collector, durationChange, 1200); + continue; } - }); + if (e.getCategory().equals(MobEffectCategory.HARMFUL)) { + EntityHelper.shortenEffect(instance, collector, durationChange); + } + } } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioCurativeRing.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioCurativeRing.java index 1f524643f..5bf9db08d 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioCurativeRing.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioCurativeRing.java @@ -19,6 +19,6 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void pickupSpirit(LivingEntity collector, double arcaneResonance) { - collector.heal(collector.getMaxHealth() * 0.1f + (float) (arcaneResonance * 0.05f)); + collector.heal((float) (collector.getMaxHealth() * 0.05f * arcaneResonance)); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioManaweavingRing.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioManaweavingRing.java new file mode 100644 index 000000000..6fa81e494 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioManaweavingRing.java @@ -0,0 +1,35 @@ +package com.sammy.malum.common.item.curiosities.curios.sets.alchemical; + +import com.sammy.malum.common.capability.*; +import com.sammy.malum.common.item.*; +import com.sammy.malum.common.item.curiosities.curios.*; +import com.sammy.malum.compability.irons_spellbooks.*; +import com.sammy.malum.core.handlers.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; + +import java.util.function.*; + +public class CurioManaweavingRing extends MalumCurioItem implements IMalumEventResponderItem { + public CurioManaweavingRing(Properties builder) { + super(builder, MalumTrinketType.ALCHEMICAL); + } + + @Override + public void addExtraTooltipLines(Consumer consumer) { + consumer.accept(positiveEffect("spirits_weave_mana")); + if (IronsSpellsCompat.LOADED) { + consumer.accept(positiveEffect("spirits_weave_mana_irons_spellbooks")); + } + } + + @Override + public void pickupSpirit(LivingEntity collector, double arcaneResonance) { + if (collector instanceof Player player) { + var handler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; + handler.soulWardProgress -= 2 * SoulWardHandler.getSoulWardCooldown(player) * arcaneResonance; + IronsSpellsCompat.generateMana(collector, 10 * arcaneResonance); + } + } +} diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioRingOfProwess.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioProwessRing.java similarity index 57% rename from src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioRingOfProwess.java rename to src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioProwessRing.java index b3ec7d9a1..b961cceec 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioRingOfProwess.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/alchemical/CurioProwessRing.java @@ -3,14 +3,16 @@ import com.sammy.malum.common.item.IMalumEventResponderItem; import com.sammy.malum.common.item.curiosities.curios.MalumCurioItem; import net.minecraft.network.chat.Component; +import net.minecraft.util.*; import net.minecraft.world.entity.ExperienceOrb; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; +import team.lodestar.lodestone.helpers.*; import java.util.function.Consumer; -public class CurioRingOfProwess extends MalumCurioItem implements IMalumEventResponderItem { - public CurioRingOfProwess(Properties builder) { +public class CurioProwessRing extends MalumCurioItem implements IMalumEventResponderItem { + public CurioProwessRing(Properties builder) { super(builder, MalumTrinketType.ALCHEMICAL); } @@ -21,14 +23,13 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void pickupSpirit(LivingEntity collector, double arcaneResonance) { - Level level = collector.level(); - int floored = (int) Math.floor(arcaneResonance); - int i = 1 + level.random.nextInt(1 + floored) + level.random.nextInt(2 + floored); + var level = collector.level(); + int generatedExperience = (int) Math.round(RandomHelper.randomBetween(level.random, 1, 4) * arcaneResonance); - while (i > 0) { - int j = ExperienceOrb.getExperienceValue(i); - i -= j; - level.addFreshEntity(new ExperienceOrb(level, collector.getX(), collector.getY(), collector.getZ(), j)); + while (generatedExperience > 0) { + int value = ExperienceOrb.getExperienceValue(generatedExperience); + generatedExperience -= value; + level.addFreshEntity(new ExperienceOrb(level, collector.getX(), collector.getY(), collector.getZ(), value)); } } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioHarmonyNecklace.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioHarmonyNecklace.java index 97b707582..c8281fa30 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioHarmonyNecklace.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioHarmonyNecklace.java @@ -26,7 +26,7 @@ public static void preventDetection(LivingEvent.LivingVisibilityEvent event) { if (event.getLookingEntity() instanceof LivingEntity watcher) { LivingEntity target = event.getEntity(); if (CurioHelper.hasCurioEquipped(target, ItemRegistry.NECKLACE_OF_BLISSFUL_HARMONY.get())) { - float visibilityModifier = SpiritHarvestHandler.getSpiritData(watcher).map(data -> 0.5f / (1 + data.dataEntries.stream().map(s -> s.type.equals(SpiritTypeRegistry.WICKED_SPIRIT) ? 1 : 0).count())).orElse(0.5f); + float visibilityModifier = SpiritHarvestHandler.getSpiritData(watcher).map(data -> 0.5f / (1 + data.droppedSpirits.stream().map(s -> s.type.equals(SpiritTypeRegistry.WICKED_SPIRIT) ? 1 : 0).count())).orElse(0.5f); if (target.hasEffect(MobEffects.INVISIBILITY)) { visibilityModifier *= 0.5f; } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioNarrowNecklace.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioNarrowNecklace.java index d62f647f6..6d062fdab 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioNarrowNecklace.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/misc/CurioNarrowNecklace.java @@ -24,6 +24,6 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, AttributeRegistry.SCYTHE_PROFICIENCY.get(), uuid -> new AttributeModifier(uuid, - "Curio Scythe Proficiency", 4f, AttributeModifier.Operation.ADDITION)); + "Curio Scythe Proficiency", 0.5f, AttributeModifier.Operation.MULTIPLY_BASE)); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/rotten/CurioStarvedBelt.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/rotten/CurioStarvedBelt.java index 8826435e7..f85b9e038 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/rotten/CurioStarvedBelt.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/rotten/CurioStarvedBelt.java @@ -26,17 +26,16 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void pickupSpirit(LivingEntity collector, double arcaneResonance) { - MobEffect gluttony = MobEffectRegistry.GLUTTONY.get(); - MobEffectInstance effect = collector.getEffect(gluttony); + var gluttony = MobEffectRegistry.GLUTTONY.get(); + var effect = collector.getEffect(gluttony); if (effect == null) { - collector.addEffect(new MobEffectInstance(gluttony, 600 + (int) (arcaneResonance * 600), 0, true, true, true)); + collector.addEffect(new MobEffectInstance(gluttony, (int) (600 * arcaneResonance), 0, true, true, true)); } else { EntityHelper.amplifyEffect(effect, collector, 1, 9); } - Level level = collector.level(); - collector.playSound(SoundRegistry.HUNGRY_BELT_FEEDS.get(), 0.7f, 1.5f + level.random.nextFloat() * 0.5f); - collector.playSound(SoundEvents.GENERIC_EAT, 0.7f, 0.8f + level.random.nextFloat() * 0.4f); - if (!level.isClientSide) { + SoundHelper.playSound(collector, SoundRegistry.HUNGRY_BELT_FEEDS.get(), 0.7f, RandomHelper.randomBetween(collector.getRandom(), 1.5f, 2f)); + SoundHelper.playSound(collector, SoundEvents.GENERIC_EAT, 0.7f, RandomHelper.randomBetween(collector.getRandom(), 0.8f, 1.2f)); + if (!collector.level().isClientSide) { ConcentratedGluttonyItem.createGluttonyVFX(collector, 0.5f); } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/soulward/CurioMagebaneBelt.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/soulward/CurioMagebaneBelt.java index ab935d887..6e36fe007 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/soulward/CurioMagebaneBelt.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/soulward/CurioMagebaneBelt.java @@ -30,7 +30,7 @@ public void addExtraTooltipLines(Consumer consumer) { } @Override - public void onSoulwardAbsorbDamage(LivingHurtEvent event, Player wardedPlayer, ItemStack stack, float soulwardLost, float damageAbsorbed) { + public void onSoulwardAbsorbDamage(LivingHurtEvent event, Player wardedPlayer, ItemStack stack, double soulwardLost, float damageAbsorbed) { DamageSource source = event.getSource(); if (source.getEntity() != null) { if (source.is(LodestoneDamageTypeTags.IS_MAGIC)) { @@ -43,7 +43,7 @@ public void onSoulwardAbsorbDamage(LivingHurtEvent event, Player wardedPlayer, I @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, AttributeRegistry.SOUL_WARD_RECOVERY_RATE.get(), uuid -> new AttributeModifier(uuid, - "Curio Soul Ward Recovery Speed", 3f, AttributeModifier.Operation.ADDITION)); + "Curio Soul Ward Recovery Rate", 0.4f, AttributeModifier.Operation.MULTIPLY_BASE)); addAttributeModifier(map, AttributeRegistry.SOUL_WARD_CAP.get(), uuid -> new AttributeModifier(uuid, "Curio Soul Ward Capacity", 6f, AttributeModifier.Operation.ADDITION)); } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/spirit/CurioMirrorNecklace.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/spirit/CurioMirrorNecklace.java index 20f07be55..744078d0b 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/spirit/CurioMirrorNecklace.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/spirit/CurioMirrorNecklace.java @@ -16,6 +16,6 @@ public CurioMirrorNecklace(Properties builder) { @Override public void addAttributeModifiers(Multimap map, SlotContext slotContext, ItemStack stack) { addAttributeModifier(map, AttributeRegistry.ARCANE_RESONANCE.get(), uuid -> new AttributeModifier(uuid, - "Curio Arcane Resonance", 1f, AttributeModifier.Operation.ADDITION)); + "Curio Arcane Resonance", 1f, AttributeModifier.Operation.MULTIPLY_BASE)); } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioEchoingArcanaRing.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioEchoingArcanaRing.java new file mode 100644 index 000000000..f019ed86f --- /dev/null +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioEchoingArcanaRing.java @@ -0,0 +1,36 @@ +package com.sammy.malum.common.item.curiosities.curios.sets.weeping; + +import com.sammy.malum.common.item.*; +import com.sammy.malum.common.item.curiosities.curios.*; +import com.sammy.malum.registry.common.*; +import net.minecraft.network.chat.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.*; +import team.lodestar.lodestone.helpers.*; + +import java.util.function.*; + +public class CurioEchoingArcanaRing extends MalumCurioItem implements IVoidItem, IMalumEventResponderItem { + public CurioEchoingArcanaRing(Properties builder) { + super(builder, MalumTrinketType.VOID); + } + + @Override + public void addExtraTooltipLines(Consumer consumer) { + consumer.accept(positiveEffect("spirits_buff_spirit_collection")); + } + + @Override + public void pickupSpirit(LivingEntity collector, double arcaneResonance) { + var arcaneReverberation = MobEffectRegistry.ARCANE_REVERBERATION.get(); + var effect = collector.getEffect(arcaneReverberation); + int addedDuration = (int) (150 * arcaneResonance); + if (effect == null) { + collector.addEffect(new MobEffectInstance(arcaneReverberation, addedDuration*4, 0, true, true, true)); + } else { + EntityHelper.extendEffect(effect, collector, addedDuration, 72000); + EntityHelper.amplifyEffect(effect, collector, 1, 19); + } + collector.playSound(SoundRegistry.ECHOING_RING_ABSORBS.get(), 0.3f, RandomHelper.randomBetween(collector.getRandom(), 1.5f, 2f)); + } +} diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioGrowingFleshRing.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioGrowingFleshRing.java index 09eecbdb7..70bfe9c89 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioGrowingFleshRing.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioGrowingFleshRing.java @@ -11,7 +11,7 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; -import team.lodestar.lodestone.helpers.EntityHelper; +import team.lodestar.lodestone.helpers.*; import java.util.function.Consumer; @@ -27,15 +27,15 @@ public void addExtraTooltipLines(Consumer consumer) { @Override public void pickupSpirit(LivingEntity collector, double arcaneResonance) { - MobEffect cancerousGrowth = MobEffectRegistry.CANCEROUS_GROWTH.get(); - MobEffectInstance effect = collector.getEffect(cancerousGrowth); + var cancerousGrowth = MobEffectRegistry.CANCEROUS_GROWTH.get(); + var effect = collector.getEffect(cancerousGrowth); + int addedDuration = (int) (150 * arcaneResonance); if (effect == null) { - collector.addEffect(new MobEffectInstance(cancerousGrowth, 1200, 0, true, true, true)); + collector.addEffect(new MobEffectInstance(cancerousGrowth, addedDuration*4, 0, true, true, true)); } else { - EntityHelper.extendEffect(effect, collector, (int) (300+arcaneResonance*300), 72000); + EntityHelper.extendEffect(effect, collector, addedDuration, 72000); EntityHelper.amplifyEffect(effect, collector, 1, 19); } - Level level = collector.level(); - level.playSound(null, collector.blockPosition(), SoundRegistry.FLESH_RING_ABSORBS.get(), SoundSource.PLAYERS, 0.3f, 1.5f + level.random.nextFloat() * 0.5f); + collector.playSound(SoundRegistry.FLESH_RING_ABSORBS.get(), 0.3f, RandomHelper.randomBetween(collector.getRandom(), 1.5f, 2f)); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioHiddenBladeNecklace.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioHiddenBladeNecklace.java index fdd784dde..f0ea89c23 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioHiddenBladeNecklace.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioHiddenBladeNecklace.java @@ -1,19 +1,44 @@ package com.sammy.malum.common.item.curiosities.curios.sets.weeping; -import com.sammy.malum.common.item.IMalumEventResponderItem; -import com.sammy.malum.common.item.IVoidItem; +import com.mojang.blaze3d.systems.*; +import com.sammy.malum.*; +import com.sammy.malum.common.capability.*; +import com.sammy.malum.common.entity.hidden_blade.*; +import com.sammy.malum.common.item.*; import com.sammy.malum.common.item.curiosities.curios.MalumCurioItem; -import com.sammy.malum.registry.common.MobEffectRegistry; +import com.sammy.malum.core.handlers.*; +import com.sammy.malum.core.helpers.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.registry.common.item.*; +import net.minecraft.client.*; +import net.minecraft.client.gui.*; +import net.minecraft.client.player.*; import net.minecraft.network.chat.Component; +import net.minecraft.resources.*; +import net.minecraft.server.level.*; +import net.minecraft.util.*; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.client.gui.overlay.*; +import net.minecraftforge.event.*; +import net.minecraftforge.event.entity.living.*; +import org.lwjgl.opengl.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.registry.client.*; +import team.lodestar.lodestone.registry.common.*; +import team.lodestar.lodestone.systems.rendering.*; +import team.lodestar.lodestone.systems.rendering.shader.*; import java.util.function.Consumer; public class CurioHiddenBladeNecklace extends MalumCurioItem implements IMalumEventResponderItem, IVoidItem { + + public static final int COOLDOWN_DURATION = 200; + public CurioHiddenBladeNecklace(Properties builder) { super(builder, MalumTrinketType.VOID); } @@ -21,17 +46,179 @@ public CurioHiddenBladeNecklace(Properties builder) { @Override public void addExtraTooltipLines(Consumer consumer) { consumer.accept(positiveEffect("scythe_counterattack")); + consumer.accept(negativeEffect("pacifist_recharge")); consumer.accept(negativeEffect("no_sweep")); } @Override public void takeDamageEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity attacked, ItemStack stack) { - float amount = event.getAmount(); - int amplifier = (int) Math.ceil(amount / 4f); - if (amplifier >= 6) { - amplifier *= amplifier / 6f; + if (attacked.level().isClientSide()) { + return; + } + MalumLivingEntityDataCapability.getCapabilityOptional(attacked).ifPresent(c -> { + if (c.hiddenBladeCounterCooldown == 0) { + float damage = event.getAmount(); + int amplifier = 1 + Mth.ceil(damage * 0.6f); + MobEffect effect = MobEffectRegistry.WICKED_INTENT.get(); + attacked.addEffect(new MobEffectInstance(effect, 60, amplifier)); + SoundHelper.playSound(attacked, SoundRegistry.HIDDEN_BLADE_PRIMED.get(), 1f, RandomHelper.randomBetween(attacked.level().getRandom(), 1.4f, 1.6f)); + } + }); + } + + @Override + public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { + var source = event.getSource(); + var level = attacker.level(); + if (level.isClientSide()) { + return; + } + if (!source.is(DamageTypeTagRegistry.IS_SCYTHE_MELEE)) { + return; + } + if (CurioHelper.hasCurioEquipped(attacker, ItemRegistry.NECKLACE_OF_THE_HIDDEN_BLADE.get())) { + MalumLivingEntityDataCapability.getCapabilityOptional(attacker).ifPresent(c -> { + var random = level.getRandom(); + if (c.hiddenBladeCounterCooldown != 0) { + if (c.hiddenBladeCounterCooldown <= COOLDOWN_DURATION) { + SoundHelper.playSound(attacker, SoundRegistry.HIDDEN_BLADE_DISRUPTED.get(), 1f, RandomHelper.randomBetween(random, 0.7f, 0.8f)); + } + c.hiddenBladeCounterCooldown = (int) (COOLDOWN_DURATION * 1.5); + MalumLivingEntityDataCapability.syncSelf((ServerPlayer) attacker); + return; + } + var effect = attacker.getEffect(MobEffectRegistry.WICKED_INTENT.get()); + if (effect == null) { + return; + } + int duration = 25; + var attributes = attacker.getAttributes(); + float multiplier = (float) Mth.clamp(attributes.getValue(Attributes.ATTACK_SPEED), 0, 1) * 2; + float baseDamage = (float) (attributes.getValue(Attributes.ATTACK_DAMAGE) / duration) * multiplier * effect.amplifier; + float magicDamage = (float) (attributes.getValue(LodestoneAttributeRegistry.MAGIC_DAMAGE.get()) / duration) * multiplier; + var center = attacker.position().add(attacker.getLookAngle().scale(4)); + var entity = new HiddenBladeDelayedImpactEntity(level, center.x, center.y - 3f + attacker.getBbHeight() / 2f, center.z); + entity.setData(attacker, baseDamage, magicDamage, duration); + entity.setItem(stack); + level.addFreshEntity(entity); + attacker.removeEffect(effect.getEffect()); + c.hiddenBladeCounterCooldown = 200; + for (int i = 0; i < 3; i++) { + SoundHelper.playSound(attacker, SoundRegistry.HIDDEN_BLADE_UNLEASHED.get(), 3f, RandomHelper.randomBetween(random, 0.75f, 1.25f)); + } + var particle = ParticleHelper.createSlashingEffect(ParticleEffectTypeRegistry.HIDDEN_BLADE_COUNTER_FLURRY); + final ItemStack scytheWeapon = SoulDataHandler.getScytheWeapon(source, attacker); + if (scytheWeapon.getItem() instanceof ISpiritAffiliatedItem spiritAffiliatedItem) { + particle.setSpiritType(spiritAffiliatedItem); + } + particle.setRandomSlashAngle(random) + .mirrorRandomly(random) + .spawnForwardSlashingParticle(attacker); + MalumLivingEntityDataCapability.syncSelf((ServerPlayer) attacker); + event.setCanceled(true); + }); + } + } + public static void entityTick(LivingEvent.LivingTickEvent event) { + var entity = event.getEntity(); + var level = entity.level(); + MalumLivingEntityDataCapability.getCapabilityOptional(entity).ifPresent(c -> { + if (c.hiddenBladeCounterCooldown > 0) { + c.hiddenBladeCounterCooldown--; + if (!level.isClientSide()) { + if (c.hiddenBladeCounterCooldown == 0) { + SoundHelper.playSound(entity, SoundRegistry.HIDDEN_BLADE_CHARGED.get(), 1f, RandomHelper.randomBetween(level.getRandom(), 1.0f, 1.2f)); + } + } + } + }); + } + + public static class ClientOnly { + + public static int fadeOut; + + public static void tick(TickEvent.ClientTickEvent event) { + final LocalPlayer player = Minecraft.getInstance().player; + if (player != null) { + var cooldown = MalumLivingEntityDataCapability.getCapability(player).hiddenBladeCounterCooldown; + if (cooldown == 0) { + if (player.hasEffect(MobEffectRegistry.WICKED_INTENT.get())) { + if (fadeOut > 30) { + fadeOut = 30; + } + fadeOut -= 2; + return; + } + else if (fadeOut < 0) { + fadeOut = 20; + } + if (fadeOut < 80) { + fadeOut++; + } + } else { + fadeOut = 0; + } + } + } + + public static void renderHiddenBladeCooldown(ForgeGui gui, GuiGraphics guiGraphics, int width, int height) { + var minecraft = Minecraft.getInstance(); + var poseStack = guiGraphics.pose(); + if (!minecraft.options.hideGui && gui.shouldDrawSurvivalElements()) { + var player = minecraft.player; + if (!player.isCreative() && !player.isSpectator()) { + var cooldown = MalumLivingEntityDataCapability.getCapability(player).hiddenBladeCounterCooldown; + if (cooldown > 0 || fadeOut <= 80) { + int left = width / 2 - 8; + int top = height - 52; + poseStack.pushPose(); + gui.setupOverlayRenderState(true, false); + RenderSystem.setShaderTexture(0, getTexture()); + RenderSystem.depthMask(true); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + ExtendedShaderInstance shaderInstance = (ExtendedShaderInstance) LodestoneShaderRegistry.DISTORTED_TEXTURE.getInstance().get(); + shaderInstance.safeGetUniform("YFrequency").set(15f); + shaderInstance.safeGetUniform("XFrequency").set(15f); + shaderInstance.safeGetUniform("Speed").set(550f); + shaderInstance.safeGetUniform("Intensity").set(120f); + var builder = VFXBuilders.createScreen() + .setPosColorTexDefaultFormat() + .setShader(() -> shaderInstance); + + float size = 16; + double delta = Mth.clamp((COOLDOWN_DURATION-cooldown) / (float)COOLDOWN_DURATION, 0, 1); + delta -= 0.125f; + final boolean secondRow = delta >= 0.5f; + int xOffset = 16*(Mth.floor(delta*8)) - (secondRow ? 64 : 0); + int yOffset = secondRow ? 16 : 0; + + if (fadeOut > 20) { + final boolean hasEffect = player.hasEffect(MobEffectRegistry.WICKED_INTENT.get()); + builder.setAlpha((80 - fadeOut) / (hasEffect ? 10f : 60f)); + } + builder.setPosColorTexDefaultFormat() + .setPositionWithWidth(left, top, size, size) + .setUVWithWidth(xOffset, yOffset, 16, 16, 64) + .draw(poseStack); + if (fadeOut > 0 && fadeOut < 20) { + float glow = (10 - Math.abs(10 - fadeOut)) / 10f; + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + + builder.setAlpha(glow).draw(poseStack); + } + + shaderInstance.setUniformDefaults(); + RenderSystem.disableBlend(); + poseStack.popPose(); + } + } + } + } + + public static ResourceLocation getTexture() { + return MalumMod.malumPath("textures/gui/hud/hidden_blade.png"); } - MobEffect effect = MobEffectRegistry.WICKED_INTENT.get(); - attacked.addEffect(new MobEffectInstance(effect, 40, amplifier + 1)); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioLimitlessBelt.java b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioLimitlessBelt.java index ce42c01c1..d24b695c7 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioLimitlessBelt.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/curios/sets/weeping/CurioLimitlessBelt.java @@ -35,10 +35,10 @@ public void addAttributeModifiers(Multimap map, Sl } @Override - public float overrideSoulwardDamageAbsorbPercentage(LivingHurtEvent event, LivingEntity wardedEntity, ItemStack stack, float original) { + public float adjustSoulWardDamageAbsorption(LivingHurtEvent event, LivingEntity wardedEntity, ItemStack stack, float original) { if (!event.getSource().is(LodestoneDamageTypeTags.IS_MAGIC)) { return CommonConfig.SOUL_WARD_MAGIC.getConfigValue().floatValue(); } - return IMalumEventResponderItem.super.overrideSoulwardDamageAbsorbPercentage(event, wardedEntity, stack, original); + return IMalumEventResponderItem.super.adjustSoulWardDamageAbsorption(event, wardedEntity, stack, original); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/TyrvingItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/TyrvingItem.java index 2ae9c2c4f..399e47577 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/TyrvingItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/TyrvingItem.java @@ -1,22 +1,19 @@ package com.sammy.malum.common.item.curiosities.weapons; import com.sammy.malum.common.item.*; -import com.sammy.malum.common.packets.particle.curiosities.rite.generic.*; import com.sammy.malum.core.handlers.*; +import com.sammy.malum.core.helpers.*; import com.sammy.malum.registry.common.*; -import net.minecraft.sounds.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.level.*; import net.minecraftforge.common.*; import net.minecraftforge.event.entity.living.*; -import net.minecraftforge.network.*; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.registry.common.tag.*; import team.lodestar.lodestone.systems.item.tools.*; -import static com.sammy.malum.registry.common.PacketRegistry.*; - public class TyrvingItem extends LodestoneSwordItem implements IMalumEventResponderItem { public TyrvingItem(Tier material, int attackDamage, float attackSpeed, Properties properties) { super(material, attackDamage, attackSpeed, properties); @@ -24,23 +21,28 @@ public TyrvingItem(Tier material, int attackDamage, float attackSpeed, Propertie @Override public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { + final Level level = attacker.level(); + if (level.isClientSide) { + return; + } if (event.getSource().is(LodestoneDamageTypeTags.IS_MAGIC)) { return; } - final Level level = attacker.level(); - if (!level.isClientSide) { - float damage = SpiritHarvestHandler.getSpiritData(target).map(d -> d.totalSpirits).orElse(0) * 2f; - if (target instanceof Player) { - damage = 4 * Math.max(1, (1 + target.getArmorValue() / 12f) * (1 + (1 - 1 / (float) target.getArmorValue())) / 12f); - } + float damage = SpiritHarvestHandler.getSpiritData(target).map(d -> d.totalSpirits).orElse(0) * 2f; + if (target instanceof Player) { + damage = 4 * Math.max(1, (1 + target.getArmorValue() / 12f) * (1 + (1 - 1 / (float) target.getArmorValue())) / 12f); + } - if (target.isAlive()) { - target.invulnerableTime = 0; - target.hurt(DamageTypeRegistry.create(level, DamageTypeRegistry.VOODOO, attacker), damage); - } - level.playSound(null, target.blockPosition(), SoundRegistry.VOID_SLASH.get(), SoundSource.PLAYERS, 1, 1f + level.random.nextFloat() * 0.25f); - MALUM_CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> target), new MajorEntityEffectParticlePacket(SpiritTypeRegistry.ELDRITCH_SPIRIT.getPrimaryColor(), target.getX(), target.getY() + target.getBbHeight() / 2, target.getZ())); + if (target.isAlive()) { + target.invulnerableTime = 0; + target.hurt(DamageTypeHelper.create(level, DamageTypeRegistry.VOODOO, attacker), damage); } + + SoundHelper.playSound(attacker, SoundRegistry.TYRVING_SLASH.get(), 1, RandomHelper.randomBetween(attacker.getRandom(), 1f, 1.5f)); + ParticleHelper.createSlashingEffect(ParticleEffectTypeRegistry.TYRVING_SLASH) + .setSpiritType(SpiritTypeRegistry.WICKED_SPIRIT) + .setVerticalSlashAngle() + .spawnForwardSlashingParticle(attacker); } @Override diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/WeightOfWorldsItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/WeightOfWorldsItem.java index 365e7945b..eb263616d 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/WeightOfWorldsItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/WeightOfWorldsItem.java @@ -1,14 +1,12 @@ package com.sammy.malum.common.item.curiosities.weapons; -import com.sammy.malum.common.item.curiosities.weapons.scythe.*; -import com.sammy.malum.registry.client.*; +import com.sammy.malum.core.helpers.*; import com.sammy.malum.registry.common.*; import net.minecraft.world.effect.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import net.minecraft.world.level.*; import net.minecraftforge.event.entity.living.*; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.systems.item.*; import team.lodestar.lodestone.systems.item.tools.*; @@ -17,7 +15,6 @@ public WeightOfWorldsItem(Tier material, int attackDamage, float attackSpeed, Pr super(material, attackDamage, attackSpeed, properties); } - @Override public void killEvent(LivingDeathEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { attacker.addEffect(new MobEffectInstance(MobEffectRegistry.GRIM_CERTAINTY.get(), 200)); @@ -25,20 +22,23 @@ public void killEvent(LivingDeathEvent event, LivingEntity attacker, LivingEntit @Override public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { - if (attacker != null) { - if (attacker instanceof Player player) { - MalumScytheItem.spawnSweepParticles(player, ParticleRegistry.SCYTHE_CUT_PARTICLE.get()); - } - final Level level = attacker.level(); - level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.WEIGHT_OF_WORLDS_SLASH.get(), attacker.getSoundSource(), 1, 0.5f); - final MobEffect effect = MobEffectRegistry.GRIM_CERTAINTY.get(); - if (attacker.hasEffect(effect) || level.random.nextFloat() < 0.25f) { - event.setAmount(event.getAmount()*2); - level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.MALIGNANT_METAL_RESONATES.get(), attacker.getSoundSource(), 2, 0.5f); - level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.MALIGNANT_METAL_RESONATES.get(), attacker.getSoundSource(), 2, 1.5f); - level.playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.DRAINING_MOTIF.get(), attacker.getSoundSource(), 2, 0.5f); - attacker.removeEffect(effect); - } + var level = attacker.level(); + if (level.isClientSide()) { + return; + } + var particleEffectType = ParticleEffectTypeRegistry.SCYTHE_SLASH; + var effect = MobEffectRegistry.GRIM_CERTAINTY.get(); + if (attacker.hasEffect(effect) || level.random.nextFloat() < 0.25f) { + event.setAmount(event.getAmount() * 2); + SoundHelper.playSound(target, SoundRegistry.MALIGNANT_METAL_MOTIF.get(), 2f, 0.75f); + SoundHelper.playSound(target, SoundRegistry.MALIGNANT_METAL_MOTIF.get(), 3f, 1.25f); + SoundHelper.playSound(target, SoundRegistry.MALIGNANT_METAL_MOTIF.get(), 3f, 1.75f); + particleEffectType = ParticleEffectTypeRegistry.WEIGHT_OF_WORLDS_CRIT; + attacker.removeEffect(effect); } + ParticleHelper.createSlashingEffect(particleEffectType) + .setVertical() + .spawnForwardSlashingParticle(attacker); + SoundHelper.playSound(target, SoundRegistry.WEIGHT_OF_WORLDS_CUT.get(), 2f, 0.75f); } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/EdgeOfDeliveranceItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/EdgeOfDeliveranceItem.java new file mode 100644 index 000000000..51022ca4a --- /dev/null +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/EdgeOfDeliveranceItem.java @@ -0,0 +1,53 @@ +package com.sammy.malum.common.item.curiosities.weapons.scythe; + +import com.sammy.malum.core.helpers.*; +import com.sammy.malum.registry.common.*; +import net.minecraft.sounds.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.*; +import net.minecraftforge.event.entity.living.*; +import team.lodestar.lodestone.helpers.*; + +public class EdgeOfDeliveranceItem extends MalumScytheItem { + + public EdgeOfDeliveranceItem(Tier tier, float attackDamageIn, float attackSpeedIn, Properties builderIn) { + super(tier, attackDamageIn, attackSpeedIn, builderIn); + } + + @Override + public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { + super.hurtEvent(event, attacker, target, stack); + var level = attacker.level(); + if (level.isClientSide()) { + return; + } + var source = event.getSource(); + if (source.is(DamageTypeTagRegistry.IS_SCYTHE)) { + var effect = MobEffectRegistry.IMMINENT_DELIVERANCE.get(); + if (target.hasEffect(effect)) { + event.setAmount(event.getAmount() * 2); + SoundHelper.playSound(target, SoundRegistry.MALIGNANT_METAL_MOTIF.get(), 2f, 1.25f); + SoundHelper.playSound(target, SoundRegistry.MALIGNANT_METAL_MOTIF.get(), 3f, 1.75f); + var particle = ParticleHelper.createSlashingEffect(ParticleEffectTypeRegistry.EDGE_OF_DELIVERANCE_CRIT); + if (!canSweep(attacker)) { + particle.setVertical(); + } + particle.spawnTargetBoundSlashingParticle(attacker, target); + target.removeEffect(effect); + } + else { + event.setAmount(event.getAmount() * 0.5f); + if (source.is(DamageTypeRegistry.HIDDEN_BLADE_COUNTER) && attacker.getRandom().nextFloat() >= 0.4f) { + return; + } + target.addEffect(new MobEffectInstance(MobEffectRegistry.IMMINENT_DELIVERANCE.get(), 60)); + } + } + } + + @Override + public SoundEvent getScytheSound(boolean canSweep) { + return canSweep ? SoundRegistry.EDGE_OF_DELIVERANCE_SWEEP.get() : SoundRegistry.EDGE_OF_DELIVERANCE_CUT.get(); + } +} diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MagicScytheItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MagicScytheItem.java index 84381f2c7..6157ee346 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MagicScytheItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MagicScytheItem.java @@ -1,12 +1,15 @@ package com.sammy.malum.common.item.curiosities.weapons.scythe; import com.google.common.collect.ImmutableMultimap; +import com.sammy.malum.common.item.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.registry.common.*; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Tier; import team.lodestar.lodestone.registry.common.LodestoneAttributeRegistry; -public class MagicScytheItem extends MalumScytheItem { +public class MagicScytheItem extends MalumScytheItem implements ISpiritAffiliatedItem { public final float magicDamage; @@ -21,4 +24,9 @@ public ImmutableMultimap.Builder createExtraAttrib builder.put(LodestoneAttributeRegistry.MAGIC_DAMAGE.get(), new AttributeModifier(LodestoneAttributeRegistry.UUIDS.get(LodestoneAttributeRegistry.MAGIC_DAMAGE), "Weapon magic damage", magicDamage, AttributeModifier.Operation.ADDITION)); return builder; } + + @Override + public MalumSpiritType getDefiningSpiritType() { + return SpiritTypeRegistry.WICKED_SPIRIT; + } } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MalumScytheItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MalumScytheItem.java index 4eb9fc334..3d6dd28dd 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MalumScytheItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/scythe/MalumScytheItem.java @@ -1,17 +1,13 @@ package com.sammy.malum.common.item.curiosities.weapons.scythe; -import com.sammy.malum.common.entity.boomerang.*; import com.sammy.malum.common.item.*; -import com.sammy.malum.registry.client.*; +import com.sammy.malum.core.helpers.*; +import com.sammy.malum.core.systems.spirit.*; import com.sammy.malum.registry.common.*; import com.sammy.malum.registry.common.item.*; -import net.minecraft.core.particles.*; -import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.util.*; -import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; import net.minecraftforge.event.entity.living.*; @@ -19,66 +15,65 @@ import team.lodestar.lodestone.registry.common.tag.*; import team.lodestar.lodestone.systems.item.*; +import javax.annotation.*; + public class MalumScytheItem extends ModCombatItem implements IMalumEventResponderItem { - public MalumScytheItem(Tier tier, float attackDamageIn, float attackSpeedIn, Properties builderIn) { - super(tier, attackDamageIn + 3 + tier.getAttackDamageBonus(), attackSpeedIn - 3.2f, builderIn); + public MalumScytheItem(Tier tier, float damage, float speed, Properties builderIn) { + super(tier, damage + 3 + tier.getAttackDamageBonus(), speed - 3.2f, builderIn); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment.equals(Enchantments.SWEEPING_EDGE)) { + return true; + } + return super.canApplyAtEnchantingTable(stack, enchantment); } @Override public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { - //TODO: convert this to a ToolAction, or something alike - boolean canSweep = !CurioHelper.hasCurioEquipped(attacker, ItemRegistry.NECKLACE_OF_THE_NARROW_EDGE.get()) && !CurioHelper.hasCurioEquipped(attacker, ItemRegistry.NECKLACE_OF_THE_HIDDEN_BLADE.get()); var level = attacker.level(); - if (attacker instanceof Player player) { - SoundEvent sound; - if (canSweep) { - spawnSweepParticles(player, ParticleRegistry.SCYTHE_SWEEP_PARTICLE.get()); - sound = SoundEvents.PLAYER_ATTACK_SWEEP; - } else { - spawnSweepParticles(player, ParticleRegistry.SCYTHE_CUT_PARTICLE.get()); - sound = SoundRegistry.SCYTHE_CUT.get(); - } - level.playSound(null, target.getX(), target.getY(), target.getZ(), sound, attacker.getSoundSource(), 1, 1); + if (level.isClientSide()) { + return; + } + if (!event.getSource().is(DamageTypeRegistry.SCYTHE_MELEE)) { + return; } + boolean canSweep = canSweep(attacker); + var particle = ParticleHelper.createSlashingEffect(ParticleEffectTypeRegistry.SCYTHE_SLASH); - if (!canSweep || event.getSource().is(LodestoneDamageTypeTags.IS_MAGIC) || event.getSource().getMsgId().equals(DamageTypeRegistry.SCYTHE_SWEEP_IDENTIFIER)) { + if (!canSweep) { + SoundHelper.playSound(attacker, getScytheSound(false), 1, 0.75f); + particle.setVertical().spawnForwardSlashingParticle(attacker); return; } + SoundHelper.playSound(attacker, getScytheSound(true), 1, 1); + particle.mirrorRandomly(attacker.getRandom()).spawnForwardSlashingParticle(attacker); + int sweeping = EnchantmentHelper.getEnchantmentLevel(Enchantments.SWEEPING_EDGE, attacker); float damage = event.getAmount() * (0.5f + EnchantmentHelper.getSweepingDamageRatio(attacker)); - level.getEntities(attacker, target.getBoundingBox().inflate(1 + sweeping * 0.25f)).forEach(e -> { + float radius = 1 + sweeping * 0.25f; + level.getEntities(attacker, target.getBoundingBox().inflate(radius)).forEach(e -> { if (e instanceof LivingEntity livingEntity) { if (livingEntity.isAlive()) { - livingEntity.hurt((DamageTypeRegistry.create(level, DamageTypeRegistry.SCYTHE_SWEEP, attacker)), damage); - livingEntity.knockback(0.4F, Mth.sin(attacker.getYRot() * ((float) Math.PI / 180F)), (-Mth.cos(attacker.getYRot() * ((float) Math.PI / 180F)))); + livingEntity.hurt((DamageTypeHelper.create(level, DamageTypeRegistry.SCYTHE_SWEEP, attacker)), damage); + livingEntity.knockback(0.4F, + Mth.sin(attacker.getYRot() * ((float) Math.PI / 180F)), + (-Mth.cos(attacker.getYRot() * ((float) Math.PI / 180F)))); } } }); } - public static void spawnSweepParticles(Player player, SimpleParticleType type) { - double d0 = (-Mth.sin(player.getYRot() * ((float) Math.PI / 180F))); - double d1 = Mth.cos(player.getYRot() * ((float) Math.PI / 180F)); - if (player.level() instanceof ServerLevel serverLevel) { - serverLevel.sendParticles(type, player.getX() + d0, player.getY(0.5D), player.getZ() + d1, 0, d0, 0.0D, d1, 0.0D); - } + public SoundEvent getScytheSound(boolean canSweep) { + return canSweep ? SoundRegistry.SCYTHE_SWEEP.get() : SoundRegistry.SCYTHE_CUT.get(); } - public static ItemStack getScytheItemStack(DamageSource source, LivingEntity attacker) { - ItemStack stack = attacker.getMainHandItem(); - - if (source.getDirectEntity() instanceof ScytheBoomerangEntity scytheBoomerang) { - stack = scytheBoomerang.getItem(); - } - return stack.getItem() instanceof MalumScytheItem ? stack : ItemStack.EMPTY; + public static boolean canSweep(LivingEntity attacker) { + //TODO: convert this to a ToolAction, or something alike + return !CurioHelper.hasCurioEquipped(attacker, ItemRegistry.NECKLACE_OF_THE_NARROW_EDGE.get()) && + !CurioHelper.hasCurioEquipped(attacker, ItemRegistry.NECKLACE_OF_THE_HIDDEN_BLADE.get()); } - @Override - public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { - if (enchantment.equals(Enchantments.SWEEPING_EDGE)) { - return true; - } - return super.canApplyAtEnchantingTable(stack, enchantment); - } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AbstractStaffItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AbstractStaffItem.java index fe761a8d1..2e33dd121 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AbstractStaffItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AbstractStaffItem.java @@ -8,6 +8,8 @@ import com.sammy.malum.common.item.curiosities.weapons.scythe.*; import com.sammy.malum.registry.client.*; import com.sammy.malum.registry.common.*; +import net.minecraft.core.particles.*; +import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.stats.*; import net.minecraft.util.*; @@ -57,7 +59,7 @@ public ImmutableMultimap.Builder createExtraAttrib public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { if (attacker instanceof Player player && !(event.getSource().getDirectEntity() instanceof AbstractBoltProjectileEntity)) { Level level = player.level(); - MalumScytheItem.spawnSweepParticles(player, ParticleRegistry.STAFF_SLAM_PARTICLE.get()); + spawnSweepParticles(player, ParticleRegistry.STAFF_SLAM_PARTICLE.get()); level.playSound(null, target.blockPosition(), SoundRegistry.STAFF_STRIKES.get(), attacker.getSoundSource(), 0.75f, Mth.nextFloat(level.random, 0.5F, 1F)); if (event.getSource().is(LodestoneDamageTypeTags.IS_MAGIC)) { ReplenishingEnchantment.replenishStaffCooldown(attacker, stack); @@ -153,6 +155,13 @@ public UseAnim getUseAnimation(ItemStack pStack) { return UseAnim.BOW; } + public static void spawnSweepParticles(Player player, SimpleParticleType type) { + double d0 = (-Mth.sin(player.getYRot() * ((float) Math.PI / 180F))); + double d1 = Mth.cos(player.getYRot() * ((float) Math.PI / 180F)); + if (player.level() instanceof ServerLevel serverLevel) { + serverLevel.sendParticles(type, player.getX() + d0, player.getY(0.5D), player.getZ() + d1, 0, d0, 0.0D, d1, 0.0D); + } + } public Vec3 getProjectileSpawnPos(LivingEntity player, InteractionHand hand, float distance, float spread) { int angle = hand == InteractionHand.MAIN_HAND ? 225 : 90; double radians = Math.toRadians(angle - player.yHeadRot); diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AuricFlameStaffItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AuricFlameStaffItem.java index b91a75af5..476c75a4e 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AuricFlameStaffItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/AuricFlameStaffItem.java @@ -35,7 +35,7 @@ public AuricFlameStaffItem(Tier tier, float magicDamage, Properties builderIn) { public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity target, ItemStack stack) { if (!(event.getSource().getDirectEntity() instanceof AbstractBoltProjectileEntity)) { target.setSecondsOnFire(4); - attacker.level().playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.AURIC_FLAME_MOTIF.get(), attacker.getSoundSource(), 1, 1.25f); + SoundHelper.playSound(target, SoundRegistry.AURIC_FLAME_MOTIF.get(), attacker.getSoundSource(), 1, 1.25f); } super.hurtEvent(event, attacker, target, stack); } diff --git a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/ErosionScepterItem.java b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/ErosionScepterItem.java index 4ca2b999b..f549b26d8 100644 --- a/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/ErosionScepterItem.java +++ b/src/main/java/com/sammy/malum/common/item/curiosities/weapons/staff/ErosionScepterItem.java @@ -47,7 +47,7 @@ public void hurtEvent(LivingHurtEvent event, LivingEntity attacker, LivingEntity EntityHelper.amplifyEffect(effect, target, 2, 9); EntityHelper.extendEffect(effect, target, 60, 600); } - attacker.level().playSound(null, target.getX(), target.getY(), target.getZ(), SoundRegistry.DRAINING_MOTIF.get(), attacker.getSoundSource(), 1, 1.25f); + SoundHelper.playSound(target, SoundRegistry.DRAINING_MOTIF.get(), attacker.getSoundSource(), 1, 1.25f); } super.hurtEvent(event, attacker, target, stack); } diff --git a/src/main/java/com/sammy/malum/common/item/food/ConcentratedGluttonyItem.java b/src/main/java/com/sammy/malum/common/item/food/ConcentratedGluttonyItem.java index d24f2a4b1..805fcf989 100644 --- a/src/main/java/com/sammy/malum/common/item/food/ConcentratedGluttonyItem.java +++ b/src/main/java/com/sammy/malum/common/item/food/ConcentratedGluttonyItem.java @@ -25,7 +25,7 @@ public ConcentratedGluttonyItem(Properties builder) { public ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pEntityLiving) { final MobEffectInstance gluttonyEffect = createGluttonyEffect(pEntityLiving); pEntityLiving.addEffect(gluttonyEffect); - pEntityLiving.playSound(SoundRegistry.CONCENTRATED_GLUTTONY_DRINK.get(), 1f, RandomHelper.randomBetween(pLevel.random, 1.5f, 2f)); + SoundHelper.playSound(pEntityLiving, SoundRegistry.CONCENTRATED_GLUTTONY_DRINK.get(), 1f, RandomHelper.randomBetween(pLevel.random, 1.5f, 2f)); if (!pLevel.isClientSide) { createGluttonyVFX(pEntityLiving, gluttonyEffect.amplifier); } diff --git a/src/main/java/com/sammy/malum/common/packets/malignant_conversion/SyncMalignantConversionPacket.java b/src/main/java/com/sammy/malum/common/packets/malignant_conversion/SyncMalignantConversionPacket.java new file mode 100644 index 000000000..53ced6f06 --- /dev/null +++ b/src/main/java/com/sammy/malum/common/packets/malignant_conversion/SyncMalignantConversionPacket.java @@ -0,0 +1,46 @@ +package com.sammy.malum.common.packets.malignant_conversion; + +import com.sammy.malum.common.capability.*; +import com.sammy.malum.core.handlers.*; +import net.minecraft.client.*; +import net.minecraft.client.player.*; +import net.minecraft.core.registries.*; +import net.minecraft.network.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraftforge.api.distmarker.*; +import net.minecraftforge.network.*; +import net.minecraftforge.network.simple.*; +import team.lodestar.lodestone.systems.network.*; + +import java.util.*; +import java.util.function.*; + +public class SyncMalignantConversionPacket extends LodestoneClientPacket { + + private final Attribute attribute; + private final UUID uuid; + + public SyncMalignantConversionPacket(Attribute attribute, UUID uuid) { + this.attribute = attribute; + this.uuid = uuid; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeId(BuiltInRegistries.ATTRIBUTE, attribute); + buf.writeUUID(uuid); + } + + @OnlyIn(Dist.CLIENT) + public void execute(Supplier context) { + final LocalPlayer player = Minecraft.getInstance().player; + MalignantConversionHandler.syncPositiveUUIDS(player, attribute, uuid); + } + + public static void register(SimpleChannel instance, int index) { + instance.registerMessage(index, SyncMalignantConversionPacket.class, SyncMalignantConversionPacket::encode, SyncMalignantConversionPacket::decode, SyncMalignantConversionPacket::handle); + } + + public static SyncMalignantConversionPacket decode(FriendlyByteBuf buf) { + return new SyncMalignantConversionPacket(buf.readById(BuiltInRegistries.ATTRIBUTE), buf.readUUID()); + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/common/spiritrite/arcane/WickedRiteType.java b/src/main/java/com/sammy/malum/common/spiritrite/arcane/WickedRiteType.java index 1c7a27e3f..22d5db0e4 100644 --- a/src/main/java/com/sammy/malum/common/spiritrite/arcane/WickedRiteType.java +++ b/src/main/java/com/sammy/malum/common/spiritrite/arcane/WickedRiteType.java @@ -14,6 +14,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; +import team.lodestar.lodestone.helpers.*; import static com.sammy.malum.registry.common.SpiritTypeRegistry.ARCANE_SPIRIT; import static com.sammy.malum.registry.common.SpiritTypeRegistry.WICKED_SPIRIT; @@ -29,7 +30,7 @@ public TotemicRiteEffect getNaturalRiteEffect() { @Override public void doRiteEffect(TotemBaseBlockEntity totemBase, ServerLevel level) { getNearbyEntities(totemBase, LivingEntity.class, e -> !(e instanceof Player)).forEach(e -> { - final DamageSource damageSource = DamageTypeRegistry.create(e.level(), DamageTypeRegistry.VOODOO); + final DamageSource damageSource = DamageTypeHelper.create(e.level(), DamageTypeRegistry.VOODOO); if (e.getHealth() > 2.5f && !e.isInvulnerableTo(damageSource)) { ParticleEffectTypeRegistry.HEXING_SMOKE.createEntityEffect(e, new ColorEffectData(WICKED_SPIRIT.getPrimaryColor())); e.hurt(damageSource, 2); diff --git a/src/main/java/com/sammy/malum/common/spiritrite/eldritch/EldritchWickedRiteType.java b/src/main/java/com/sammy/malum/common/spiritrite/eldritch/EldritchWickedRiteType.java index b4f109e68..23a5fd5e9 100644 --- a/src/main/java/com/sammy/malum/common/spiritrite/eldritch/EldritchWickedRiteType.java +++ b/src/main/java/com/sammy/malum/common/spiritrite/eldritch/EldritchWickedRiteType.java @@ -10,6 +10,7 @@ import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.PacketDistributor; +import team.lodestar.lodestone.helpers.*; import java.util.*; import java.util.stream.Collectors; @@ -28,9 +29,9 @@ public TotemicRiteEffect getNaturalRiteEffect() { @Override public void doRiteEffect(TotemBaseBlockEntity totemBase, ServerLevel level) { getNearbyEntities(totemBase, LivingEntity.class, e -> !(e instanceof Player)).forEach(e -> { - if (e.getHealth() <= 2.5f && !e.isInvulnerableTo(DamageTypeRegistry.create(e.level(), DamageTypeRegistry.VOODOO))) { + if (e.getHealth() <= 2.5f && !e.isInvulnerableTo(DamageTypeHelper.create(e.level(), DamageTypeRegistry.VOODOO))) { MALUM_CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> e), new MajorEntityEffectParticlePacket(getIdentifyingSpirit().getPrimaryColor(), e.getX(), e.getY() + e.getBbHeight() / 2f, e.getZ())); - e.hurt(DamageTypeRegistry.create(e.level(), DamageTypeRegistry.VOODOO), 10f); + e.hurt(DamageTypeHelper.create(e.level(), DamageTypeRegistry.VOODOO), 10f); } }); } @@ -42,7 +43,7 @@ public TotemicRiteEffect getCorruptedEffect() { return new TotemicRiteEffect(TotemicRiteEffect.MalumRiteEffectCategory.LIVING_ENTITY_EFFECT) { @Override public void doRiteEffect(TotemBaseBlockEntity totemBase, ServerLevel level) { - Map, List> animalMap = getNearbyEntities(totemBase, Animal.class, e -> e.getAge() > 0 && !e.isInvulnerableTo(DamageTypeRegistry.create(e.level(), DamageTypeRegistry.VOODOO))).collect(Collectors.groupingBy(Animal::getClass)); + Map, List> animalMap = getNearbyEntities(totemBase, Animal.class, e -> e.getAge() > 0 && !e.isInvulnerableTo(DamageTypeHelper.create(e.level(), DamageTypeRegistry.VOODOO))).collect(Collectors.groupingBy(Animal::getClass)); for (List animals : animalMap.values()) { if (animals.size() < 20) { return; @@ -50,7 +51,7 @@ public void doRiteEffect(TotemBaseBlockEntity totemBase, ServerLevel level) { int maxKills = animals.size() - 20; animals.removeIf(Animal::isInLove); for (Animal entity : animals) { - entity.hurt(DamageTypeRegistry.create(entity.level(), DamageTypeRegistry.VOODOO), entity.getMaxHealth()); + entity.hurt(DamageTypeHelper.create(entity.level(), DamageTypeRegistry.VOODOO), entity.getMaxHealth()); MALUM_CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), new MajorEntityEffectParticlePacket(WICKED_SPIRIT.getPrimaryColor(), entity.getX(), entity.getY() + entity.getBbHeight() / 2f, entity.getZ())); if (maxKills-- <= 0) { return; diff --git a/src/main/java/com/sammy/malum/compability/attributelib/AttributeLibCompat.java b/src/main/java/com/sammy/malum/compability/attributelib/AttributeLibCompat.java new file mode 100644 index 000000000..3dbb1b46b --- /dev/null +++ b/src/main/java/com/sammy/malum/compability/attributelib/AttributeLibCompat.java @@ -0,0 +1,23 @@ +package com.sammy.malum.compability.attributelib; + +import dev.shadowsoffire.attributeslib.client.*; +import net.minecraftforge.fml.*; + +public class AttributeLibCompat { + + public static boolean LOADED; + + public static void init() { + LOADED = ModList.get().isLoaded("attributeslib"); + if (LOADED) { + LoadedOnly.init(); + } + } + + public static class LoadedOnly { + + public static void init() { + ModifierSourceType.register(new MalignantConversionModifierSourceType()); + } + } +} diff --git a/src/main/java/com/sammy/malum/compability/attributelib/MalignantConversionModifierSourceType.java b/src/main/java/com/sammy/malum/compability/attributelib/MalignantConversionModifierSourceType.java new file mode 100644 index 000000000..667a8694b --- /dev/null +++ b/src/main/java/com/sammy/malum/compability/attributelib/MalignantConversionModifierSourceType.java @@ -0,0 +1,47 @@ +package com.sammy.malum.compability.attributelib; + +import com.mojang.datafixers.util.*; +import com.sammy.malum.common.capability.*; +import com.sammy.malum.core.handlers.*; +import com.sammy.malum.core.listeners.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.registry.common.item.*; +import dev.shadowsoffire.attributeslib.client.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.item.*; + +import java.util.*; +import java.util.function.*; + +public class MalignantConversionModifierSourceType extends ModifierSourceType { + + @Override + public void extract(LivingEntity livingEntity, BiConsumer> map) { + for (MalignantConversionReloadListener.MalignantConversionData data : MalignantConversionReloadListener.CONVERSION_DATA.values()) { + var sourceAttribute = data.sourceAttribute(); + var sourceInstance = livingEntity.getAttribute(sourceAttribute); + if (sourceInstance != null) { + var modifier = sourceInstance.getModifier(MalignantConversionHandler.NEGATIVE_MODIFIER_UUID); + if (modifier != null) { + map.accept(modifier, new ModifierSource.ItemModifierSource(ItemRegistry.MALIGNANT_PEWTER_PLATING.get().getDefaultInstance())); + } + } + for (Pair target : data.targetAttributes()) { + var targetAttribute = target.getFirst(); + var targetInstance = livingEntity.getAttribute(targetAttribute); + if (targetInstance != null) { + var modifier = targetInstance.getModifier(MalignantConversionHandler.POSITIVE_MODIFIER_UUIDS.get(targetAttribute)); + if (modifier != null) { + map.accept(modifier, new ModifierSource.ItemModifierSource(ItemRegistry.MALIGNANT_PEWTER_PLATING.get().getDefaultInstance())); + } + } + } + } + } + + @Override + public int getPriority() { + return 50; + } +} diff --git a/src/main/java/com/sammy/malum/compability/irons_spellbooks/IronsSpellsCompat.java b/src/main/java/com/sammy/malum/compability/irons_spellbooks/IronsSpellsCompat.java new file mode 100644 index 000000000..9c3eb9e59 --- /dev/null +++ b/src/main/java/com/sammy/malum/compability/irons_spellbooks/IronsSpellsCompat.java @@ -0,0 +1,41 @@ +package com.sammy.malum.compability.irons_spellbooks; + +import com.sammy.malum.config.*; +import com.sammy.malum.core.handlers.*; +import io.redspace.ironsspellbooks.api.events.*; +import io.redspace.ironsspellbooks.api.magic.*; +import io.redspace.ironsspellbooks.api.util.*; +import net.minecraft.server.level.*; +import net.minecraft.world.entity.*; +import net.minecraftforge.common.*; +import net.minecraftforge.fml.*; + +public class IronsSpellsCompat { + + public static boolean LOADED; + + public static void init() { + LOADED = ModList.get().isLoaded("irons_spellbooks"); + } + + public static void generateMana(LivingEntity collector, double amount) { + generateMana(collector, (float) amount); + } + + public static void generateMana(LivingEntity collector, float amount) { + if (LOADED) { + LoadedOnly.generateMana(collector, amount); + } + } + + public static class LoadedOnly { + + public static void generateMana(LivingEntity collector, float amount) { + var magicData = MagicData.getPlayerMagicData(collector); + magicData.addMana(amount); + if (collector instanceof ServerPlayer serverPlayer) { + UpdateClient.SendManaUpdate(serverPlayer, magicData); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/compability/tetra/TetraCompat.java b/src/main/java/com/sammy/malum/compability/tetra/TetraCompat.java index 6f0bcd91a..eeeff6f33 100644 --- a/src/main/java/com/sammy/malum/compability/tetra/TetraCompat.java +++ b/src/main/java/com/sammy/malum/compability/tetra/TetraCompat.java @@ -1,5 +1,6 @@ package com.sammy.malum.compability.tetra; +import com.sammy.malum.core.handlers.*; import com.sammy.malum.registry.common.item.EnchantmentRegistry; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Arrow; @@ -18,6 +19,16 @@ public static void init() { LOADED = ModList.get().isLoaded("tetra"); } + public static boolean hasSoulStrikeModifier(ItemStack stack) { + return LOADED && LoadedOnly.hasSoulStrikeModifier(stack); + } + + public static void onEntityJoin(EntityJoinLevelEvent event) { + if (LOADED) { + LoadedOnly.fireArrow(event); + } + } + public static class LoadedOnly { private static final ItemEffect SHATTERS_SOULS = ItemEffect.get("malum.shatters_souls"); @@ -28,7 +39,7 @@ public static class LoadedOnly { TetraEnchantmentHelper.registerMapping(SOUL_HUNTER_TOOL, new TetraEnchantmentHelper.EnchantmentRules("additions/malum_something", "exclusions/malum_something", EnchantmentRegistry.SOUL_HUNTER_WEAPON)); } - public static boolean hasSoulStrike(ItemStack stack) { + public static boolean hasSoulStrikeModifier(ItemStack stack) { if (stack.getItem() instanceof ModularItem modularItem) { return modularItem.getEffectLevel(stack, SHATTERS_SOULS) > 0; } @@ -38,8 +49,8 @@ public static boolean hasSoulStrike(ItemStack stack) { public static void fireArrow(EntityJoinLevelEvent event) { if (event.getEntity() instanceof Arrow arrow) { if (arrow.getOwner() instanceof Player player) { - if (hasSoulStrike(player.getUseItem())) { - arrow.addTag("malum:soul_arrow"); + if (hasSoulStrikeModifier(player.getUseItem())) { + arrow.addTag(SoulDataHandler.SOUL_SHATTER_ENTITY_TAG); } } } diff --git a/src/main/java/com/sammy/malum/config/CommonConfig.java b/src/main/java/com/sammy/malum/config/CommonConfig.java index 3925e4b3a..7a3e6ee5a 100644 --- a/src/main/java/com/sammy/malum/config/CommonConfig.java +++ b/src/main/java/com/sammy/malum/config/CommonConfig.java @@ -38,6 +38,11 @@ public class CommonConfig extends LodestoneConfig { builder.comment("Base time in ticks it takes for one point of soul ward to recover.") .define("soulWardRate", 100))); + + public static ConfigValueHolder IRONS_SPELLBOOKS_SOUL_SHATTER = new ConfigValueHolder<>(MALUM, "common/compat/irons_spellbooks", (builder -> + builder.comment("If set to true, and Iron's Spellbooks is installed, spells and scrolls from the mod will function as soul hunter weapons.") + .define("spellsLootSpirits", true))); + public CommonConfig(ForgeConfigSpec.Builder builder) { super(MALUM, "common", builder); } diff --git a/src/main/java/com/sammy/malum/core/events/ClientRuntimeEvents.java b/src/main/java/com/sammy/malum/core/events/ClientRuntimeEvents.java index 5b448c6bd..ab66a6c0a 100644 --- a/src/main/java/com/sammy/malum/core/events/ClientRuntimeEvents.java +++ b/src/main/java/com/sammy/malum/core/events/ClientRuntimeEvents.java @@ -2,6 +2,8 @@ import com.sammy.malum.client.renderer.block.*; import com.sammy.malum.common.item.augment.*; +import com.sammy.malum.common.item.curiosities.curios.sets.weeping.*; +import com.sammy.malum.core.handlers.*; import net.minecraftforge.api.distmarker.*; import net.minecraftforge.client.event.*; import net.minecraftforge.event.*; @@ -23,6 +25,8 @@ public static void lateRenderTick(TickEvent.RenderTickEvent event) { @SubscribeEvent public static void clientTickEvent(TickEvent.ClientTickEvent event) { SpiritCrucibleRenderer.checkForTuningFork(event); + CurioHiddenBladeNecklace.ClientOnly.tick(event); + SoulWardHandler.ClientOnly.tick(event); TotemBaseRenderer.checkForTotemicStaff(event); } diff --git a/src/main/java/com/sammy/malum/core/events/ClientSetupEvents.java b/src/main/java/com/sammy/malum/core/events/ClientSetupEvents.java index 3065aefc4..4c4b244e4 100644 --- a/src/main/java/com/sammy/malum/core/events/ClientSetupEvents.java +++ b/src/main/java/com/sammy/malum/core/events/ClientSetupEvents.java @@ -1,5 +1,6 @@ package com.sammy.malum.core.events; +import com.sammy.malum.common.item.curiosities.curios.sets.weeping.*; import com.sammy.malum.core.handlers.*; import com.sammy.malum.registry.client.*; import net.minecraftforge.api.distmarker.*; @@ -14,8 +15,10 @@ public class ClientSetupEvents { @SubscribeEvent public static void registerOverlays(RegisterGuiOverlaysEvent event) { - event.registerAbove(VanillaGuiOverlay.ARMOR_LEVEL.id(), "soul_ward", (gui, poseStack, partialTick, width, height) -> + event.registerAbove(VanillaGuiOverlay.FOOD_LEVEL.id(), "soul_ward", (gui, poseStack, partialTick, width, height) -> SoulWardHandler.ClientOnly.renderSoulWard(gui, poseStack, width, height)); + event.registerAboveAll("hidden_blade_cooldown", (gui, poseStack, partialTick, width, height) -> + CurioHiddenBladeNecklace.ClientOnly.renderHiddenBladeCooldown(gui, poseStack, width, height)); event.registerAbove(VanillaGuiOverlay.PLAYER_LIST.id(), "touch_of_darkness", (gui, poseStack, partialTick, width, height) -> TouchOfDarknessHandler.ClientOnly.renderDarknessVignette(poseStack)); } diff --git a/src/main/java/com/sammy/malum/core/events/RuntimeEvents.java b/src/main/java/com/sammy/malum/core/events/RuntimeEvents.java index cccfe1d1b..43a27203d 100644 --- a/src/main/java/com/sammy/malum/core/events/RuntimeEvents.java +++ b/src/main/java/com/sammy/malum/core/events/RuntimeEvents.java @@ -7,7 +7,6 @@ import com.sammy.malum.common.enchantment.*; import com.sammy.malum.common.entity.nitrate.*; import com.sammy.malum.common.item.cosmetic.curios.*; -import com.sammy.malum.common.item.curiosities.*; import com.sammy.malum.common.item.curiosities.curios.runes.madness.*; import com.sammy.malum.common.item.curiosities.curios.runes.miracle.*; import com.sammy.malum.common.item.curiosities.curios.sets.misc.*; @@ -49,9 +48,7 @@ public static void onEntityJoin(EntityJoinLevelEvent event) { MalumPlayerDataCapability.playerJoin(event); CurioTokenOfGratitude.giveItem(event); SoulDataHandler.updateAi(event); - if (TetraCompat.LOADED) { - TetraCompat.LoadedOnly.fireArrow(event); - } + TetraCompat.onEntityJoin(event); } @@ -72,12 +69,6 @@ public static void playerLeftClick(PlayerInteractEvent.LeftClickBlock event) { } } - @SubscribeEvent - public static void anvilUpdate(AnvilUpdateEvent event) { - CatalystFlingerItem.anvilUpdate(event); - } - - @SubscribeEvent public static void onEntityJoin(MobSpawnEvent.PositionCheck event) { SoulDataHandler.markAsSpawnerSpawned(event); @@ -105,10 +96,11 @@ public static void onLivingVisibility(LivingEvent.LivingVisibilityEvent event) { @SubscribeEvent public static void onLivingTick(LivingEvent.LivingTickEvent event) { - SoulDataHandler.manageSoul(event); + SoulDataHandler.livingTick(event); MalignantConversionHandler.checkForAttributeChanges(event); TouchOfDarknessHandler.entityTick(event); CurioWatcherNecklace.entityTick(event); + CurioHiddenBladeNecklace.entityTick(event); } @SubscribeEvent @@ -131,7 +123,7 @@ public static void onPlayerBreakSpeed(PlayerEvent.BreakSpeed event) { @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { ReserveStaffChargeHandler.recoverStaffCharges(event); - SoulWardHandler.recoverSoulWard(event); + SoulWardHandler.playerTick(event); } @SubscribeEvent @@ -189,23 +181,18 @@ public static void onHurt(LivingHurtEvent event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onLateHurt(LivingHurtEvent event) { - SoulWardHandler.shieldPlayer(event); - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onLateDamage(LivingDamageEvent event) { - WickedIntentEffect.removeWickedIntent(event); + SoulWardHandler.livingHurt(event); } @SubscribeEvent public static void onDeath(LivingDeathEvent event) { - EsotericReapingHandler.tryCreateReapingDrops(event); - SpiritHarvestHandler.shatterSoul(event); + EsotericReapingHandler.onDeath(event); + SpiritHarvestHandler.spawnSpiritsOnDeath(event); } @SubscribeEvent public static void onDrops(LivingDropsEvent event) { - SpiritHarvestHandler.modifyDroppedItems(event); + SpiritHarvestHandler.primeItemForShatter(event); } @SubscribeEvent diff --git a/src/main/java/com/sammy/malum/core/handlers/EsotericReapingHandler.java b/src/main/java/com/sammy/malum/core/handlers/EsotericReapingHandler.java index 35683cf0d..892b19f48 100644 --- a/src/main/java/com/sammy/malum/core/handlers/EsotericReapingHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/EsotericReapingHandler.java @@ -21,7 +21,7 @@ public class EsotericReapingHandler { - public static void tryCreateReapingDrops(LivingDeathEvent event) { + public static void onDeath(LivingDeathEvent event) { if (event.isCanceled()) { return; } diff --git a/src/main/java/com/sammy/malum/core/handlers/MalignantConversionHandler.java b/src/main/java/com/sammy/malum/core/handlers/MalignantConversionHandler.java index 4d68d93c4..eb778cd18 100644 --- a/src/main/java/com/sammy/malum/core/handlers/MalignantConversionHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/MalignantConversionHandler.java @@ -2,20 +2,25 @@ import com.mojang.datafixers.util.*; import com.sammy.malum.common.capability.*; +import com.sammy.malum.common.packets.malignant_conversion.*; import com.sammy.malum.core.listeners.*; import com.sammy.malum.registry.common.*; import net.minecraft.network.chat.*; -import net.minecraft.util.*; +import net.minecraft.server.level.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.*; +import net.minecraft.world.entity.player.*; import net.minecraftforge.event.entity.living.*; +import net.minecraftforge.network.*; import java.util.*; +import static com.sammy.malum.registry.common.PacketRegistry.MALUM_CHANNEL; + public class MalignantConversionHandler { - private static final UUID MALIGNANT_CONVERSION_UUID = UUID.fromString("ff803d68-a615-4279-a59a-d847db2481d7"); - public static final HashMap MODIFIER_UUIDS = new HashMap<>(); + public static final UUID NEGATIVE_MODIFIER_UUID = UUID.fromString("ff803d68-a615-4279-a59a-d847db2481d7"); + public static final HashMap POSITIVE_MODIFIER_UUIDS = new HashMap<>(); public final HashMap cachedAttributeValues = new HashMap<>(); public boolean skipConversionLogic; @@ -34,19 +39,19 @@ public static void checkForAttributeChanges(LivingEvent.LivingTickEvent event) { handler.skipConversionLogic = false; } var conversionData = MalignantConversionReloadListener.CONVERSION_DATA; - for (MalignantConversionReloadListener.MalignantConversionData data : conversionData.values()) { + for (MalignantConversionReloadListener.MalignantConversionData data : conversionData.values()) { //check for any changed attributes, and apply malignant conversion to them if they've been updated Attribute attribute = data.sourceAttribute(); AttributeInstance instance = livingEntity.getAttribute(attribute); if (instance != null) { if (handler.cachedAttributeValues.containsKey(attribute)) { - convertAttribute(livingEntity, data.sourceAttribute(), data.consumptionRatio(), data.targetAttributes()); + convertAttribute(handler, livingEntity, data.sourceAttribute(), data.consumptionRatio(), data.ignoreBaseValue(), data.targetAttributes(), false); } } } - if (handler.cachedAttributeValues.containsKey(conversionAttribute)) { + if (handler.cachedAttributeValues.containsKey(conversionAttribute)) { //update attributes when malignant conversion changes if (handler.cachedAttributeValues.get(conversionAttribute) != conversionInstance.getValue()) { for (MalignantConversionReloadListener.MalignantConversionData data : conversionData.values()) { - convertAttribute(livingEntity, data.sourceAttribute(), data.consumptionRatio(), data.targetAttributes(), true); + convertAttribute(handler, livingEntity, data.sourceAttribute(), data.consumptionRatio(), data.ignoreBaseValue(), data.targetAttributes(), true); } } } @@ -58,46 +63,57 @@ public static void checkForAttributeChanges(LivingEvent.LivingTickEvent event) { } } - private static void convertAttribute(LivingEntity livingEntity, Attribute sourceAttribute, double consumptionRatio, List> targetAttributes) { - convertAttribute(livingEntity, sourceAttribute, consumptionRatio, targetAttributes, false); - } - private static void convertAttribute(LivingEntity livingEntity, Attribute sourceAttribute, double consumptionRatio, List> targetAttributes, boolean skipCacheComparison) { + private static void convertAttribute(MalignantConversionHandler handler, LivingEntity livingEntity, Attribute sourceAttribute, double consumptionRatio, boolean ignoreBaseValue, List> targetAttributes, boolean skipCacheComparison) { var attributes = livingEntity.getAttributes(); double malignantConversion = attributes.getValue(AttributeRegistry.MALIGNANT_CONVERSION.get()); - final AttributeInstance sourceInstance = livingEntity.getAttribute(sourceAttribute); + var sourceInstance = livingEntity.getAttribute(sourceAttribute); if (sourceInstance != null) { - var handler = MalumLivingEntityDataCapability.getCapability(livingEntity).malignantConversionHandler; - final AttributeModifier originalModifier = sourceInstance.getModifier(MALIGNANT_CONVERSION_UUID); + var originalModifier = sourceInstance.getModifier(NEGATIVE_MODIFIER_UUID); if (originalModifier != null) { sourceInstance.removeModifier(originalModifier); } + boolean hasMalignantConversion = malignantConversion > 0; if (skipCacheComparison || handler.cachedAttributeValues.get(sourceAttribute) != sourceInstance.getValue()) { - double cachedValue = sourceInstance.getValue(); + double cachedValue = sourceInstance.getValue() - (ignoreBaseValue ? sourceInstance.getBaseValue() : 0); for (Pair target : targetAttributes) { - final Attribute targetAttribute = target.getFirst(); - final AttributeInstance targetInstance = livingEntity.getAttribute(targetAttribute); + var targetAttribute = target.getFirst(); + var targetInstance = livingEntity.getAttribute(targetAttribute); if (targetInstance != null) { - final UUID uuid = MODIFIER_UUIDS.computeIfAbsent(sourceAttribute, a -> Mth.createInsecureUUID(RandomSource.createNewThreadLocalInstance())); + var uuid = POSITIVE_MODIFIER_UUIDS.computeIfAbsent(sourceAttribute, MalignantConversionHandler::createPositiveModifierUUID); targetInstance.removeModifier(uuid); - final double bonus = cachedValue * malignantConversion * target.getSecond(); + double bonus = cachedValue * malignantConversion * target.getSecond(); if (bonus > 0) { - targetInstance.addTransientModifier( - new AttributeModifier(uuid, "Malignant Conversion: " + Component.translatable(targetAttribute.getDescriptionId()), - bonus, AttributeModifier.Operation.ADDITION)); + var modifier = new AttributeModifier(uuid, "Malignant Conversion: " + Component.translatable(targetAttribute.getDescriptionId()), + bonus, AttributeModifier.Operation.ADDITION); + targetInstance.addTransientModifier(modifier); + if (livingEntity instanceof ServerPlayer serverPlayer) { + MALUM_CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new SyncMalignantConversionPacket(targetAttribute, uuid)); + } } } } handler.cachedAttributeValues.put(sourceAttribute, sourceInstance.getValue()); - if (malignantConversion > 0) { - sourceInstance.addTransientModifier( - new AttributeModifier(MALIGNANT_CONVERSION_UUID, "Malignant Conversion: " + Component.translatable(sourceAttribute.getDescriptionId()), - -malignantConversion*consumptionRatio, AttributeModifier.Operation.MULTIPLY_TOTAL)); + if (hasMalignantConversion) { + var modifier = new AttributeModifier(NEGATIVE_MODIFIER_UUID, "Malignant Conversion: " + Component.translatable(sourceAttribute.getDescriptionId()), + -malignantConversion * consumptionRatio, AttributeModifier.Operation.MULTIPLY_TOTAL); + sourceInstance.addTransientModifier(modifier); } } - if (originalModifier != null && sourceInstance.getModifier(MALIGNANT_CONVERSION_UUID) == null && malignantConversion > 0) { + if (originalModifier != null && sourceInstance.getModifier(NEGATIVE_MODIFIER_UUID) == null && hasMalignantConversion) { sourceInstance.addTransientModifier(originalModifier); } } } + + public static void syncPositiveUUIDS(Player player, Attribute attribute, UUID uuid) { + var target = player.getAttribute(attribute); + if (target != null) { + POSITIVE_MODIFIER_UUIDS.put(attribute, uuid); + } + } + + private static UUID createPositiveModifierUUID(Attribute attribute) { //Generates a new UUID that will remain uniform for each individual attribute + return UUID.nameUUIDFromBytes(attribute.getDescriptionId().getBytes()); + } } diff --git a/src/main/java/com/sammy/malum/core/handlers/MalumAttributeEventHandler.java b/src/main/java/com/sammy/malum/core/handlers/MalumAttributeEventHandler.java index d67d390b9..5f51c6090 100644 --- a/src/main/java/com/sammy/malum/core/handlers/MalumAttributeEventHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/MalumAttributeEventHandler.java @@ -1,7 +1,7 @@ package com.sammy.malum.core.handlers; import com.sammy.malum.common.item.curiosities.weapons.scythe.MalumScytheItem; -import com.sammy.malum.registry.common.AttributeRegistry; +import com.sammy.malum.registry.common.*; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.LivingEntity; @@ -18,17 +18,18 @@ public static void processAttributes(LivingHurtEvent event) { DamageSource source = event.getSource(); if (source.getEntity() instanceof LivingEntity attacker) { float amount = event.getAmount(); - ItemStack stack = MalumScytheItem.getScytheItemStack(source, attacker); + var stack = SoulDataHandler.getScytheWeapon(source, attacker); if (stack.isEmpty()) { return; } if (source.is(DamageTypes.THORNS)) { return; } - if (!event.getSource().is(LodestoneDamageTypeTags.IS_MAGIC)) { - AttributeInstance scytheProficiency = attacker.getAttribute(AttributeRegistry.SCYTHE_PROFICIENCY.get()); - if (scytheProficiency != null && scytheProficiency.getValue() > 0) { - event.setAmount((float) (amount + scytheProficiency.getValue() * 0.5f)); + if (event.getSource().is(DamageTypeTagRegistry.IS_SCYTHE)) { + var scytheProficiency = attacker.getAttribute(AttributeRegistry.SCYTHE_PROFICIENCY.get()); + if (scytheProficiency != null) { + final float amount1 = (float) (amount * scytheProficiency.getValue()); + event.setAmount(amount1); } } } diff --git a/src/main/java/com/sammy/malum/core/handlers/SoulDataHandler.java b/src/main/java/com/sammy/malum/core/handlers/SoulDataHandler.java index ec1aa1704..bfb007cdf 100644 --- a/src/main/java/com/sammy/malum/core/handlers/SoulDataHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/SoulDataHandler.java @@ -2,6 +2,7 @@ import com.sammy.malum.common.capability.*; import com.sammy.malum.common.entity.boomerang.*; +import com.sammy.malum.common.item.curiosities.weapons.scythe.*; import com.sammy.malum.compability.tetra.*; import com.sammy.malum.registry.common.item.*; import net.minecraft.nbt.*; @@ -14,6 +15,8 @@ public class SoulDataHandler { + public static final String SOUL_SHATTER_ENTITY_TAG = "malum:can_shatter_souls"; + public float exposedSoulDuration; public boolean soulless; public boolean spawnerSpawned; @@ -74,19 +77,24 @@ public static void exposeSoul(LivingHurtEvent event) { } LivingEntity target = event.getEntity(); DamageSource source = event.getSource(); - SoulDataHandler soulData = MalumLivingEntityDataCapability.getCapability(target).soulData; if (source.getEntity() instanceof LivingEntity attacker) { ItemStack stack = getSoulHunterWeapon(source, attacker); - if (stack.is(ItemTagRegistry.SOUL_HUNTER_WEAPON) || (TetraCompat.LOADED && TetraCompat.LoadedOnly.hasSoulStrike(stack))) { - soulData.exposedSoulDuration = 200; + if (stack.is(ItemTagRegistry.SOUL_HUNTER_WEAPON) || TetraCompat.hasSoulStrikeModifier(stack)) { + exposeSoul(target); } } - if (source.getDirectEntity() != null && source.getDirectEntity().getTags().contains("malum:soul_arrow")) { - soulData.exposedSoulDuration = 200; + var directEntity = source.getDirectEntity(); + if (directEntity != null && directEntity.getTags().contains(SOUL_SHATTER_ENTITY_TAG)) { + exposeSoul(target); } } + public static void exposeSoul(LivingEntity entity) { + SoulDataHandler soulData = MalumLivingEntityDataCapability.getCapability(entity).soulData; + soulData.exposedSoulDuration = 200; + + } - public static void manageSoul(LivingEvent.LivingTickEvent event) { + public static void livingTick(LivingEvent.LivingTickEvent event) { LivingEntity entity = event.getEntity(); SoulDataHandler soulData = MalumLivingEntityDataCapability.getCapability(entity).soulData; if (soulData.exposedSoulDuration > 0) { @@ -98,6 +106,11 @@ public static void removeSentience(Mob mob) { mob.goalSelector.getAvailableGoals().removeIf(g -> g.getGoal() instanceof LookAtPlayerGoal || g.getGoal() instanceof MeleeAttackGoal || g.getGoal() instanceof SwellGoal || g.getGoal() instanceof PanicGoal || g.getGoal() instanceof RandomLookAroundGoal || g.getGoal() instanceof AvoidEntityGoal); } + public static ItemStack getScytheWeapon(DamageSource source, LivingEntity attacker) { + var soulHunterWeapon = getSoulHunterWeapon(source, attacker); + return soulHunterWeapon.getItem() instanceof MalumScytheItem ? soulHunterWeapon : ItemStack.EMPTY; + } + public static ItemStack getSoulHunterWeapon(DamageSource source, LivingEntity attacker) { ItemStack stack = attacker.getMainHandItem(); diff --git a/src/main/java/com/sammy/malum/core/handlers/SoulWardHandler.java b/src/main/java/com/sammy/malum/core/handlers/SoulWardHandler.java index 092847610..50463d531 100644 --- a/src/main/java/com/sammy/malum/core/handlers/SoulWardHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/SoulWardHandler.java @@ -1,22 +1,18 @@ package com.sammy.malum.core.handlers; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import com.sammy.malum.MalumMod; -import com.sammy.malum.common.capability.MalumPlayerDataCapability; +import com.sammy.malum.common.capability.*; import com.sammy.malum.config.CommonConfig; import com.sammy.malum.common.item.IMalumEventResponderItem; -import com.sammy.malum.registry.common.AttributeRegistry; -import com.sammy.malum.registry.common.SoundRegistry; +import com.sammy.malum.registry.common.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.player.*; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.*; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -24,7 +20,8 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import org.joml.Vector4f; -import team.lodestar.lodestone.helpers.ItemHelper; +import org.lwjgl.opengl.*; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.registry.client.*; import team.lodestar.lodestone.registry.common.tag.*; import team.lodestar.lodestone.systems.rendering.VFXBuilders; @@ -32,131 +29,149 @@ public class SoulWardHandler { - public float soulWard; - public float soulWardProgress; + public double soulWard; + public double soulWardProgress; public CompoundTag serializeNBT() { CompoundTag tag = new CompoundTag(); - tag.putFloat("soulWard", soulWard); - tag.putFloat("soulWardProgress", soulWardProgress); + tag.putDouble("soulWard", soulWard); + tag.putDouble("soulWardProgress", soulWardProgress); return tag; } public void deserializeNBT(CompoundTag tag) { - soulWard = tag.getFloat("soulWard"); - soulWardProgress = tag.getFloat("soulWardProgress"); + soulWard = tag.getDouble("soulWard"); + soulWardProgress = tag.getDouble("soulWardProgress"); } - public static void recoverSoulWard(TickEvent.PlayerTickEvent event) { - Player player = event.player; + public static void playerTick(TickEvent.PlayerTickEvent event) { + var player = event.player; if (!player.level().isClientSide) { - SoulWardHandler soulWardHandler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; - AttributeInstance soulWardCap = player.getAttribute(AttributeRegistry.SOUL_WARD_CAP.get()); - if (soulWardCap != null) { - if (soulWardHandler.soulWard < soulWardCap.getValue() && soulWardHandler.soulWardProgress <= 0) { - soulWardHandler.soulWard++; - if (!player.isCreative()) { - SoundEvent sound = soulWardHandler.soulWard >= soulWardCap.getValue() ? SoundRegistry.SOUL_WARD_CHARGE.get() : SoundRegistry.SOUL_WARD_GROW.get(); - float pitch = 1f + (soulWardHandler.soulWard / (float) soulWardCap.getValue()) * 0.5f + (Mth.ceil(soulWardHandler.soulWard) % 3) * 0.25f; - player.level().playSound(null, player.blockPosition(), sound, SoundSource.PLAYERS, 0.25f, pitch); + var handler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; + var capacity = player.getAttribute(AttributeRegistry.SOUL_WARD_CAP.get()); + if (capacity != null) { + if (handler.soulWard < capacity.getValue()) { + if (handler.soulWardProgress <= 0) { + handler.recoverSoulWard(player); + } else { + handler.soulWardProgress--; } - soulWardHandler.soulWardProgress = getSoulWardCooldown(player); - MalumPlayerDataCapability.syncTrackingAndSelf(player); - } else { - soulWardHandler.soulWardProgress--; } - if (soulWardHandler.soulWard > soulWardCap.getValue()) { - soulWardHandler.soulWard = (float) soulWardCap.getValue(); + if (handler.soulWard > capacity.getValue()) { + handler.soulWard = (float) capacity.getValue(); MalumPlayerDataCapability.syncTrackingAndSelf(player); } } } } - public static void shieldPlayer(LivingHurtEvent event) { + public static void livingHurt(LivingHurtEvent event) { + if (event.getEntity().level().isClientSide()) { + return; + } if (event.isCanceled() || event.getAmount() <= 0) { return; } if (event.getEntity() instanceof Player player) { - if (!player.level().isClientSide) { - SoulWardHandler soulWardHandler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; - soulWardHandler.soulWardProgress = getSoulWardCooldown(0) + getSoulWardCooldown(player); - if (soulWardHandler.soulWard > 0) { - DamageSource source = event.getSource(); - - float amount = event.getAmount(); - float multiplier = source.is(LodestoneDamageTypeTags.IS_MAGIC) ? CommonConfig.SOUL_WARD_MAGIC.getConfigValue().floatValue() : CommonConfig.SOUL_WARD_PHYSICAL.getConfigValue().floatValue(); - - for (ItemStack s : ItemHelper.getEventResponders(player)) { - if (s.getItem() instanceof IMalumEventResponderItem eventItem) { - multiplier = eventItem.overrideSoulwardDamageAbsorbPercentage(event, player, s, multiplier); - break; - } - } - float result = amount * multiplier; - float absorbed = amount - result; - double strength = 1+player.getAttributeValue(AttributeRegistry.SOUL_WARD_STRENGTH.get()); - float soulwardLost = (float) (soulWardHandler.soulWard - (absorbed / strength)); - if (strength != 0) { - soulWardHandler.soulWard = Math.max(0, soulwardLost); - } else { - soulwardLost = soulWardHandler.soulWard; - soulWardHandler.soulWard = 0; + SoulWardHandler soulWardHandler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; + soulWardHandler.soulWardProgress = getSoulWardCooldown(1) + getSoulWardCooldown(player); + if (soulWardHandler.soulWard > 0) { + DamageSource source = event.getSource(); + + float amount = event.getAmount(); + float multiplier = source.is(LodestoneDamageTypeTags.IS_MAGIC) ? CommonConfig.SOUL_WARD_MAGIC.getConfigValue().floatValue() : CommonConfig.SOUL_WARD_PHYSICAL.getConfigValue().floatValue(); + + for (ItemStack s : ItemHelper.getEventResponders(player)) { + if (s.getItem() instanceof IMalumEventResponderItem eventItem) { + multiplier = eventItem.adjustSoulWardDamageAbsorption(event, player, s, multiplier); + break; } - for (ItemStack s : ItemHelper.getEventResponders(player)) { - if (s.getItem() instanceof IMalumEventResponderItem eventItem) { - eventItem.onSoulwardAbsorbDamage(event, player, s, soulwardLost, absorbed); - } + } + float result = amount * multiplier; + float absorbed = amount - result; + double strength = player.getAttributeValue(AttributeRegistry.SOUL_WARD_INTEGRITY.get()); + double soulwardLost = soulWardHandler.soulWard - (absorbed / strength); + if (strength != 0) { + soulWardHandler.soulWard = Math.max(0, soulwardLost); + } else { + soulwardLost = soulWardHandler.soulWard; + soulWardHandler.soulWard = 0; + } + for (ItemStack s : ItemHelper.getEventResponders(player)) { + if (s.getItem() instanceof IMalumEventResponderItem eventItem) { + eventItem.onSoulwardAbsorbDamage(event, player, s, soulwardLost, absorbed); } - SoundEvent sound = soulWardHandler.soulWard == 0 ? SoundRegistry.SOUL_WARD_DEPLETE.get() : SoundRegistry.SOUL_WARD_HIT.get(); - player.level().playSound(null, player.blockPosition(), sound, player.getSoundSource(), 1, Mth.nextFloat(player.getRandom(), 1f, 1.5f)); - event.setAmount(result); - - MalumPlayerDataCapability.syncTrackingAndSelf(player); } + var sound = soulWardHandler.soulWard == 0 ? SoundRegistry.SOUL_WARD_DEPLETE.get() : SoundRegistry.SOUL_WARD_HIT.get(); + SoundHelper.playSound(player, sound, 1, Mth.nextFloat(player.getRandom(), 1f, 1.5f)); + event.setAmount(result); + MalumPlayerDataCapability.syncTrackingAndSelf(player); + } + } + } + + public void recoverSoulWard(Player player) { + soulWard++; + if (!player.isCreative()) { + var capacity = player.getAttribute(AttributeRegistry.SOUL_WARD_CAP.get()); + if (capacity != null) { + var sound = soulWard >= capacity.getValue() ? SoundRegistry.SOUL_WARD_CHARGE.get() : SoundRegistry.SOUL_WARD_GROW.get(); + double pitchOffset = (soulWard / capacity.getValue()) * 0.5f + (Mth.ceil(soulWard) % 3) * 0.25f; + SoundHelper.playSound(player, sound, 0.25f, (float) (1f + pitchOffset)); } } + soulWardProgress += getSoulWardCooldown(player); + MalumPlayerDataCapability.syncTrackingAndSelf(player); } - public static int getSoulWardCooldown(Player player) { + public static float getSoulWardCooldown(Player player) { return getSoulWardCooldown(player.getAttributeValue(AttributeRegistry.SOUL_WARD_RECOVERY_RATE.get())); } - public static int getSoulWardCooldown(double recoverySpeed) { - int baseValue = CommonConfig.SOUL_WARD_RATE.getConfigValue(); - if (recoverySpeed == 0) { - return baseValue; - } - float n = 0.6f; - double exponent = 1 + (Math.pow(recoverySpeed * 0.25f + 1, 1 - n) - 1) / (1 - n); - return (int) (baseValue * (1 / exponent)); + public static float getSoulWardCooldown(double recoverySpeed) { + return Mth.floor(CommonConfig.SOUL_WARD_RATE.getConfigValue() / recoverySpeed); } public static class ClientOnly { + public static int fadeOut; + public static void tick(TickEvent.ClientTickEvent event) { + final LocalPlayer player = Minecraft.getInstance().player; + if (player != null) { + var handler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; + if (handler.soulWard >= player.getAttributeValue(AttributeRegistry.SOUL_WARD_CAP.get())) { + if (fadeOut < 80) { + fadeOut++; + } + } else { + fadeOut = Mth.clamp(fadeOut-2, 0, 30); + } + } + } + public static void renderSoulWard(ForgeGui gui, GuiGraphics guiGraphics, int width, int height) { - Minecraft minecraft = Minecraft.getInstance(); - PoseStack poseStack = guiGraphics.pose(); + var minecraft = Minecraft.getInstance(); + var poseStack = guiGraphics.pose(); if (!minecraft.options.hideGui && gui.shouldDrawSurvivalElements()) { - gui.setupOverlayRenderState(true, false); - LocalPlayer player = minecraft.player; + var player = minecraft.player; if (!player.isCreative() && !player.isSpectator()) { - SoulWardHandler soulWardHandler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; - final float soulWard = soulWardHandler.soulWard; + var handler = MalumPlayerDataCapability.getCapability(player).soulWardHandler; + double soulWard = handler.soulWard; if (soulWard > 0) { float absorb = Mth.ceil(player.getAbsorptionAmount()); float maxHealth = (float) player.getAttribute(Attributes.MAX_HEALTH).getValue(); float armor = (float) player.getAttribute(Attributes.ARMOR).getValue(); int left = width / 2 - 91; - int top = height - gui.leftHeight; + int top = height - 66; if (armor == 0) { - top += 4; + top += 10; } int healthRows = Mth.ceil((maxHealth + absorb) / 2.0F / 10.0F); int rowHeight = Math.max(10 - (healthRows - 2), 3); poseStack.pushPose(); + gui.setupOverlayRenderState(true, false); RenderSystem.setShaderTexture(0, getSoulWardTexture()); RenderSystem.depthMask(true); RenderSystem.enableBlend(); @@ -166,9 +181,13 @@ public static void renderSoulWard(ForgeGui gui, GuiGraphics guiGraphics, int wid shaderInstance.safeGetUniform("XFrequency").set(15f); shaderInstance.safeGetUniform("Speed").set(550f); shaderInstance.safeGetUniform("Intensity").set(120f); - VFXBuilders.ScreenVFXBuilder builder = VFXBuilders.createScreen() + var builder = VFXBuilders.createScreen() .setPosColorTexDefaultFormat() .setShader(() -> shaderInstance); + if (fadeOut > 20) { + final boolean isDamaged = soulWard < player.getAttributeValue(AttributeRegistry.SOUL_WARD_CAP.get()); + builder.setAlpha((80 - fadeOut) / (isDamaged ? 10f : 60f)); + } int size = 13; boolean forceDisplay = soulWard <= 1; @@ -186,9 +205,14 @@ public static void renderSoulWard(ForgeGui gui, GuiGraphics guiGraphics, int wid builder.setPositionWithWidth(x - 2, y - 2, size, size) .setUVWithWidth(xTextureOffset, 0, size, size, 45) .draw(poseStack); + if (fadeOut > 0 && fadeOut < 20) { + float glow = (10 - Math.abs(10 - fadeOut)) / 10f; + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + builder.setAlpha(glow).draw(poseStack).setAlpha(1); + RenderSystem.defaultBlendFunc(); + } } shaderInstance.setUniformDefaults(); - RenderSystem.depthMask(true); RenderSystem.disableBlend(); poseStack.popPose(); } @@ -197,7 +221,7 @@ public static void renderSoulWard(ForgeGui gui, GuiGraphics guiGraphics, int wid } public static ResourceLocation getSoulWardTexture() { - return MalumMod.malumPath("textures/gui/soul_ward/default.png"); + return MalumMod.malumPath("textures/gui/hud/soul_ward.png"); } } } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/core/handlers/SpiritHarvestHandler.java b/src/main/java/com/sammy/malum/core/handlers/SpiritHarvestHandler.java index d7601804c..a95c31ba1 100644 --- a/src/main/java/com/sammy/malum/core/handlers/SpiritHarvestHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/SpiritHarvestHandler.java @@ -16,13 +16,11 @@ import net.minecraft.server.level.*; import net.minecraft.sounds.*; import net.minecraft.util.*; -import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.*; import net.minecraft.world.entity.item.*; import net.minecraft.world.entity.player.*; import net.minecraft.world.item.*; -import net.minecraft.world.item.crafting.*; import net.minecraft.world.level.*; import net.minecraft.world.phys.*; import net.minecraftforge.event.entity.item.*; @@ -39,59 +37,48 @@ public class SpiritHarvestHandler { - public static void shatterSoul(LivingDeathEvent event) { + public static void spawnSpiritsOnDeath(LivingDeathEvent event) { if (event.isCanceled()) { return; } - DamageSource source = event.getSource(); - LivingEntity target = event.getEntity(); - LivingEntity attacker = null; - if (event.getSource().getEntity() instanceof LivingEntity directAttacker) { - attacker = directAttacker; + var target = event.getEntity(); + if (target instanceof Player) { + return; } - if (attacker == null) { - attacker = target.getLastHurtByMob(); + var soulData = MalumLivingEntityDataCapability.getCapability(target).soulData; + if (soulData.soulless) { + return; } - if (attacker == null && source.is(DamageTypeTagRegistry.SOUL_SHATTER_DAMAGE)) { - spawnSpirits(event.getEntity()); + if (CommonConfig.SOULLESS_SPAWNERS.getConfigValue() && soulData.spawnerSpawned) { return; } - if (attacker != null) { - ItemStack stack = SoulDataHandler.getSoulHunterWeapon(source, attacker); - if (!(target instanceof Player)) { - SoulDataHandler soulData = MalumLivingEntityDataCapability.getCapability(target).soulData; - if (CommonConfig.SOULLESS_SPAWNERS.getConfigValue() && soulData.spawnerSpawned) { - return; - } - if (soulData.exposedSoulDuration > 0 && !soulData.soulless) { - spawnSpirits(target, attacker, stack); - soulData.soulless = true; - } + var source = event.getSource(); + var attacker = source.getEntity() instanceof LivingEntity living ? living : target.getLastHurtByMob(); + if (source.is(DamageTypeTagRegistry.SOUL_SHATTER_DAMAGE) || soulData.exposedSoulDuration > 0) { + if (attacker == null) { + spawnSpirits(event.getEntity()); + } + else { + ItemStack stack = SoulDataHandler.getSoulHunterWeapon(source, attacker); + spawnSpirits(target, attacker, stack); } + soulData.soulless = true; } } - public static void modifyDroppedItems(LivingDropsEvent event) { + public static void primeItemForShatter(LivingDropsEvent event) { if (event.isCanceled()) { return; } - LivingEntity entityLiving = event.getEntity(); - MalumLivingEntityDataCapability capability = MalumLivingEntityDataCapability.getCapability(entityLiving); + var entityLiving = event.getEntity(); + var capability = MalumLivingEntityDataCapability.getCapability(entityLiving); if (capability.soulsToApplyToDrops != null) { getSpiritData(entityLiving).ifPresent(spiritData -> { - Ingredient spiritItem = spiritData.spiritItem; + var spiritItem = spiritData.spiritItem; if (spiritItem != null) { for (ItemEntity itemEntity : event.getDrops()) { if (spiritItem.test(itemEntity.getItem())) { - MalumItemDataCapability.getCapabilityOptional(itemEntity).ifPresent((e) -> { - e.soulsToDrop = capability.soulsToApplyToDrops.stream().map(ItemStack::copy).collect(Collectors.toList()); - e.attackerForSouls = capability.killerUUID; - e.totalSoulCount = spiritData.totalSpirits; - }); - itemEntity.setNeverPickUp(); - itemEntity.age = itemEntity.lifespan - 20; - itemEntity.setNoGravity(true); - itemEntity.setDeltaMovement(itemEntity.getDeltaMovement().multiply(1, 0.5, 1)); + primeItemForShatter(itemEntity, capability); } } } @@ -99,11 +86,21 @@ public static void modifyDroppedItems(LivingDropsEvent event) { } } + public static void primeItemForShatter(ItemEntity entity, MalumLivingEntityDataCapability data) { + MalumItemDataCapability.getCapabilityOptional(entity).ifPresent((e) -> { + e.soulsToDrop = data.soulsToApplyToDrops.stream().map(ItemStack::copy).collect(Collectors.toList()); + e.attackerForSouls = data.killerUUID; + }); + entity.setNeverPickUp(); + entity.age = entity.lifespan - 20; + entity.setNoGravity(true); + entity.setDeltaMovement(entity.getDeltaMovement().multiply(1, 0.5, 1)); + } + public static void shatterItem(ItemExpireEvent event) { if (event.isCanceled()) { return; } - ItemEntity entity = event.getEntity(); if (entity.level() instanceof ServerLevel level) { MalumItemDataCapability.getCapabilityOptional(entity).ifPresent((e) -> { @@ -119,7 +116,7 @@ public static void shatterItem(ItemExpireEvent event) { for (int i = 0; i < entity.getItem().getCount(); i++) { e.soulsToDrop.stream().map(ItemStack::copy).forEach(stacks::add); } - createSpiritEntities(level, stacks, entity.position(), e.totalSoulCount, attacker); + createSpiritEntities(level, stacks, entity.position(), attacker); } }); } @@ -139,8 +136,10 @@ public static void pickupSpirit(LivingEntity collector, ItemStack stack) { ItemInventory inventory = SpiritPouchItem.getInventory(item); ItemStack result = inventory.addItem(stack); if (result.isEmpty()) { - Level level = player.level(); - level.playSound(null, player.getX(), player.getY() + 0.5, player.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, 0.2F, ((level.random.nextFloat() - level.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); + var random = collector.getRandom(); + float pitch = ((random.nextFloat() - random.nextFloat()) * 0.7F + 1.0F) * 2.0F; //this kinda smells but we want it to match vanilla + + player.playSound(SoundEvents.ITEM_PICKUP, 0.2F, pitch); if (player.containerMenu instanceof SpiritPouchContainer pouchMenu) { pouchMenu.update(inventory); } @@ -184,7 +183,11 @@ public static void spawnItemAsSpirit(ItemStack spirit, LivingEntity target, Livi } public static void spawnItemsAsSpirits(Collection spirits, LivingEntity target, LivingEntity attacker) { - createSpiritEntities(target.level(), spirits, target.position().add(0, target.getBbHeight() / 2f, 0), spirits.stream().mapToInt(ItemStack::getCount).sum(), attacker); + createSpiritEntities(target.level(), spirits, target.position().add(0, target.getBbHeight() / 2f, 0), attacker); + } + + public static void createSpiritEntities(Level level, Collection spirits, Vec3 position, @Nullable LivingEntity attacker) { + createSpiritEntities(level, spirits, position, spirits.stream().mapToInt(ItemStack::getCount).sum(), attacker); } private static void createSpiritEntities(Level level, Collection spirits, Vec3 position, float totalCount, @Nullable LivingEntity attacker) { @@ -233,7 +236,7 @@ public static List applySpiritLootBonuses(List spirits, Li } int spiritBonus = 0; if (attacker.getAttribute(AttributeRegistry.SPIRIT_SPOILS.get()) != null) { - spiritBonus += attacker.getAttributeValue(AttributeRegistry.SPIRIT_SPOILS.get()); + spiritBonus += Mth.ceil(attacker.getAttributeValue(AttributeRegistry.SPIRIT_SPOILS.get())); } if (!weapon.isEmpty()) { final int spiritPlunder = weapon.getEnchantmentLevel(EnchantmentRegistry.SPIRIT_PLUNDER.get()); @@ -254,7 +257,7 @@ public static List getSpiritDropsRaw(LivingEntity entity) { } public static List getSpiritDropsRaw(EntitySpiritDropData data) { - return data != null ? data.dataEntries.stream().map(SpiritWithCount::getStack).collect(Collectors.toList()) : (Collections.emptyList()); + return data != null ? data.droppedSpirits.stream().map(SpiritWithCount::getStack).collect(Collectors.toList()) : (Collections.emptyList()); } public static Optional getSpiritData(LivingEntity entity) { diff --git a/src/main/java/com/sammy/malum/core/handlers/TouchOfDarknessHandler.java b/src/main/java/com/sammy/malum/core/handlers/TouchOfDarknessHandler.java index fc056e503..db1112c0e 100644 --- a/src/main/java/com/sammy/malum/core/handlers/TouchOfDarknessHandler.java +++ b/src/main/java/com/sammy/malum/core/handlers/TouchOfDarknessHandler.java @@ -32,7 +32,7 @@ import net.minecraftforge.common.ForgeMod; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.network.PacketDistributor; -import team.lodestar.lodestone.helpers.BlockHelper; +import team.lodestar.lodestone.helpers.*; import team.lodestar.lodestone.systems.easing.Easing; import team.lodestar.lodestone.systems.rendering.VFXBuilders; import team.lodestar.lodestone.systems.rendering.shader.ExtendedShaderInstance; @@ -150,7 +150,7 @@ public static void entityTick(LivingEvent.LivingTickEvent event) { handler.progressToRejection++; if (!level.isClientSide) { if (livingEntity instanceof Player && level.getGameTime() % 6L == 0) { - level.playSound(null, livingEntity.blockPosition(), SoundRegistry.SONG_OF_THE_VOID.get(), SoundSource.HOSTILE, 0.5f + handler.progressToRejection * 0.02f, 0.5f + handler.progressToRejection * 0.03f); + SoundHelper.playSound(livingEntity, SoundRegistry.SONG_OF_THE_VOID.get(), SoundSource.HOSTILE, 0.5f + handler.progressToRejection * 0.02f, 0.5f + handler.progressToRejection * 0.03f); } if (handler.rejection == 0 && handler.progressToRejection > 60) { handler.reject(livingEntity); @@ -201,7 +201,7 @@ public void reject(LivingEntity livingEntity) { ParticleEffectTypeRegistry.WEEPING_WELL_REACTS.createEntityEffect(livingEntity); } if (!player.isCreative()) { - livingEntity.hurt(DamageTypeRegistry.create(level, DamageTypeRegistry.VOODOO), 4); + livingEntity.hurt(DamageTypeHelper.create(level, DamageTypeRegistry.VOODOO), 4); } if (!playerDataCapability.hasBeenRejected) { SpiritHarvestHandler.spawnItemAsSpirit(ItemRegistry.UMBRAL_SPIRIT.get().getDefaultInstance(), player, player); diff --git a/src/main/java/com/sammy/malum/core/helpers/ParticleHelper.java b/src/main/java/com/sammy/malum/core/helpers/ParticleHelper.java new file mode 100644 index 000000000..f67cd7420 --- /dev/null +++ b/src/main/java/com/sammy/malum/core/helpers/ParticleHelper.java @@ -0,0 +1,127 @@ +package com.sammy.malum.core.helpers; + +import com.sammy.malum.common.item.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.visual_effects.networked.*; +import com.sammy.malum.visual_effects.networked.data.*; +import com.sammy.malum.visual_effects.networked.slash.*; +import net.minecraft.util.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import team.lodestar.lodestone.helpers.*; + +public class ParticleHelper { + + public static SlashParticleEffectBuilder createSlashingEffect(ParticleEffectType effectType) { + return new SlashParticleEffectBuilder(effectType); + } + + public static class SlashParticleEffectBuilder { + + public final ParticleEffectType effectType; + public float horizontalOffset; + public float slashAngle; + public boolean isMirrored; + public MalumSpiritType spiritType; + + public SlashParticleEffectBuilder(ParticleEffectType effectType) { + this.effectType = effectType; + } + + public SlashParticleEffectBuilder setVertical() { + return setVerticalSlashAngle().setHorizontalOffset(0.4f); + } + + public SlashParticleEffectBuilder setHorizontalOffset(float horizontalOffset) { + this.horizontalOffset = horizontalOffset; + return this; + } + + public SlashParticleEffectBuilder setVerticalSlashAngle() { + return setSlashAngle(1.57f); + } + + public SlashParticleEffectBuilder setRandomSlashAngle(RandomSource randomSource) { + return setSlashAngle(randomSource.nextFloat() * 3.14f); + } + + public SlashParticleEffectBuilder setSlashAngle(float slashAngle) { + this.slashAngle = slashAngle; + return this; + } + + public SlashParticleEffectBuilder mirrorRandomly(RandomSource randomSource) { + return setMirrored(randomSource.nextBoolean()); + } + + public SlashParticleEffectBuilder setMirrored(boolean isMirrored) { + this.isMirrored = isMirrored; + return this; + } + + public SlashParticleEffectBuilder setSpiritType(ISpiritAffiliatedItem spiritAffiliatedItem) { + this.spiritType = spiritAffiliatedItem.getDefiningSpiritType(); + return this; + } + + public SlashParticleEffectBuilder setSpiritType(MalumSpiritType spiritType) { + this.spiritType = spiritType; + return this; + } + + public void spawnForwardSlashingParticle(LivingEntity attacker) { + var direction = attacker.getLookAngle(); + float yRot = ((float) (Mth.atan2(direction.x, direction.z) * (double) (180F / (float) Math.PI))); + float yaw = (float) Math.toRadians(yRot); + var left = new Vec3(-Math.cos(yaw), 0, Math.sin(yaw)); + var up = left.cross(direction); + + var offset = direction.scale(0.4f).add(up.scale(-0.3f)); + if (horizontalOffset != 0) { + offset = offset.add(left.scale(horizontalOffset)); + } + spawnForwardSlashingParticle(attacker, offset, direction); + } + + public void spawnForwardSlashingParticle(LivingEntity attacker, Vec3 slashOffset, Vec3 slashDirection) { + double xOffset = slashOffset.x; + double yOffset = slashOffset.y + attacker.getBbHeight() * 0.5f; + double zOffset = slashOffset.z; + var position = attacker.position().add(xOffset, yOffset, zOffset); + spawnSlashingParticle(attacker.level(), position, slashDirection); + } + + public void spawnTargetBoundSlashingParticle(LivingEntity attacker, LivingEntity target) { + var direction = attacker.getLookAngle(); + var random = attacker.getRandom(); + float yRot = ((float) (Mth.atan2(direction.x, direction.z) * (double) (180F / (float) Math.PI))); + float yaw = (float) Math.toRadians(yRot); + var left = new Vec3(-Math.cos(yaw), 0, Math.sin(yaw)); + var up = left.cross(direction); + + var slashDirection = target.position().subtract(attacker.position()).normalize(); + var offset = direction.scale(-1.4f).add(up.scale(-0.2f)).subtract(slashDirection.scale(0.5f + random.nextFloat() * 0.5f)); + if (horizontalOffset != 0) { + offset = offset.add(left.scale(horizontalOffset)); + } + spawnTargetBoundSlashingParticle(attacker, target, offset, slashDirection); + } + + public void spawnTargetBoundSlashingParticle(LivingEntity attacker, LivingEntity target, Vec3 slashOffset, Vec3 slashDirection) { + double xOffset = slashOffset.x; + double yOffset = slashOffset.y + attacker.getBbHeight() * 0.5f; + double zOffset = slashOffset.z; + var position = target.position().add(xOffset, yOffset, zOffset); + spawnSlashingParticle(attacker.level(), position, slashDirection); + } + + public void spawnSlashingParticle(Level level, Vec3 slashPosition, Vec3 slashDirection) { + effectType.createPositionedEffect(level, new PositionEffectData(slashPosition), SlashAttackParticleEffect.createData(slashDirection, isMirrored, slashAngle, spiritType)); + } + + public interface SlashEffectDataSupplier { + NBTEffectData createData(Vec3 slashPosition, boolean isMirrored, float slashAngle); + } + } +} diff --git a/src/main/java/com/sammy/malum/core/listeners/MalignantConversionReloadListener.java b/src/main/java/com/sammy/malum/core/listeners/MalignantConversionReloadListener.java index 79dbb29a9..cb1e1fce5 100644 --- a/src/main/java/com/sammy/malum/core/listeners/MalignantConversionReloadListener.java +++ b/src/main/java/com/sammy/malum/core/listeners/MalignantConversionReloadListener.java @@ -29,27 +29,41 @@ protected void apply(Map objectIn, ResourceManage for (int i = 0; i < objectIn.size(); i++) { ResourceLocation location = (ResourceLocation) objectIn.keySet().toArray()[i]; JsonObject object = objectIn.get(location).getAsJsonObject(); - String name = object.getAsJsonPrimitive("source_attribute").getAsString(); - ResourceLocation sourceAttribute = new ResourceLocation(name); - if (!ForgeRegistries.ATTRIBUTES.containsKey(sourceAttribute)) { - continue; + ArrayList sourceAttributeNames = new ArrayList<>(); + if (object.has("source_attribute")) { + String name = object.getAsJsonPrimitive("source_attribute").getAsString(); + sourceAttributeNames.add(name); } - double consumptionRatio = object.has("ratio") ? object.getAsJsonPrimitive("ratio").getAsDouble() : 1; - JsonArray targetAttributes = object.getAsJsonArray("target_attributes"); - List> attributeList = new ArrayList<>(); - for (JsonElement attribute : targetAttributes) { - JsonObject attributeObject = attribute.getAsJsonObject(); - ResourceLocation attributeName = new ResourceLocation(attributeObject.getAsJsonPrimitive("attribute").getAsString()); - if (!ForgeRegistries.ATTRIBUTES.containsKey(attributeName)) { + else if (object.has("source_attributes")) { + JsonArray sourceAttributes = object.getAsJsonArray("source_attributes"); + for (JsonElement sourceAttribute : sourceAttributes) { + sourceAttributeNames.add(sourceAttribute.getAsString()); + } + } + + for (String name : sourceAttributeNames) { + ResourceLocation sourceAttribute = new ResourceLocation(name); + if (!ForgeRegistries.ATTRIBUTES.containsKey(sourceAttribute)) { continue; } - double ratio = attributeObject.getAsJsonPrimitive("ratio").getAsDouble(); - attributeList.add(Pair.of(ForgeRegistries.ATTRIBUTES.getValue(attributeName), ratio)); + double consumptionRatio = object.has("ratio") ? object.getAsJsonPrimitive("ratio").getAsDouble() : 1; + boolean ignoreBaseValue = object.has("ignore_base_value") && object.getAsJsonPrimitive("ignore_base_value").getAsBoolean(); + JsonArray targetAttributes = object.getAsJsonArray("target_attributes"); + List> attributeList = new ArrayList<>(); + for (JsonElement attribute : targetAttributes) { + JsonObject attributeObject = attribute.getAsJsonObject(); + ResourceLocation attributeName = new ResourceLocation(attributeObject.getAsJsonPrimitive("attribute").getAsString()); + if (!ForgeRegistries.ATTRIBUTES.containsKey(attributeName)) { + continue; + } + double ratio = attributeObject.getAsJsonPrimitive("ratio").getAsDouble(); + attributeList.add(Pair.of(ForgeRegistries.ATTRIBUTES.getValue(attributeName), ratio)); + } + CONVERSION_DATA.put(sourceAttribute, new MalignantConversionData(ForgeRegistries.ATTRIBUTES.getValue(sourceAttribute), consumptionRatio, ignoreBaseValue, attributeList)); } - CONVERSION_DATA.put(sourceAttribute, new MalignantConversionData(ForgeRegistries.ATTRIBUTES.getValue(sourceAttribute), consumptionRatio, attributeList)); } } - public record MalignantConversionData(Attribute sourceAttribute, double consumptionRatio, List> targetAttributes) { + public record MalignantConversionData(Attribute sourceAttribute, double consumptionRatio, boolean ignoreBaseValue, List> targetAttributes) { } } diff --git a/src/main/java/com/sammy/malum/core/systems/spirit/EntitySpiritDropData.java b/src/main/java/com/sammy/malum/core/systems/spirit/EntitySpiritDropData.java index c5d73fd74..400b67894 100644 --- a/src/main/java/com/sammy/malum/core/systems/spirit/EntitySpiritDropData.java +++ b/src/main/java/com/sammy/malum/core/systems/spirit/EntitySpiritDropData.java @@ -8,18 +8,19 @@ import java.util.*; public class EntitySpiritDropData { - public static final String SOUL_DATA = "soul_data"; + public static final EntitySpiritDropData EMPTY = new EntitySpiritDropData(SpiritTypeRegistry.SACRED_SPIRIT, new ArrayList<>(), null); + public final MalumSpiritType primaryType; public final int totalSpirits; - public final List dataEntries; + public final List droppedSpirits; @Nullable public final Ingredient spiritItem; - public EntitySpiritDropData(MalumSpiritType primaryType, List dataEntries, @Nullable Ingredient spiritItem) { + public EntitySpiritDropData(MalumSpiritType primaryType, List droppedSpirits, @Nullable Ingredient spiritItem) { this.primaryType = primaryType; - this.totalSpirits = dataEntries.stream().mapToInt(d -> d.count).sum(); - this.dataEntries = dataEntries; + this.totalSpirits = droppedSpirits.stream().mapToInt(d -> d.count).sum(); + this.droppedSpirits = droppedSpirits; this.spiritItem = spiritItem; } diff --git a/src/main/java/com/sammy/malum/data/MalumDamageTypeTags.java b/src/main/java/com/sammy/malum/data/MalumDamageTypeTags.java index 7c585b7cd..f3c999721 100644 --- a/src/main/java/com/sammy/malum/data/MalumDamageTypeTags.java +++ b/src/main/java/com/sammy/malum/data/MalumDamageTypeTags.java @@ -1,10 +1,12 @@ package com.sammy.malum.data; import com.sammy.malum.*; +import com.sammy.malum.compability.irons_spellbooks.*; import com.sammy.malum.registry.common.*; import net.minecraft.core.HolderLookup.*; import net.minecraft.data.*; import net.minecraft.data.tags.*; +import net.minecraft.resources.*; import net.minecraftforge.common.data.*; import team.lodestar.lodestone.registry.common.tag.*; @@ -18,7 +20,22 @@ public MalumDamageTypeTags(PackOutput pOutput, CompletableFuture pProv @Override protected void addTags(Provider pProvider) { + tag(LodestoneDamageTypeTags.CAN_TRIGGER_MAGIC).add(DamageTypeRegistry.SCYTHE_MELEE, DamageTypeRegistry.SCYTHE_SWEEP); tag(LodestoneDamageTypeTags.IS_MAGIC).add(DamageTypeRegistry.VOODOO); - tag(DamageTypeTagRegistry.SOUL_SHATTER_DAMAGE).add(DamageTypeRegistry.VOODOO, DamageTypeRegistry.SCYTHE_SWEEP); + tag(DamageTypeTagRegistry.SOUL_SHATTER_DAMAGE).add(DamageTypeRegistry.SCYTHE_MELEE, DamageTypeRegistry.VOODOO, DamageTypeRegistry.SCYTHE_SWEEP, DamageTypeRegistry.HIDDEN_BLADE_COUNTER); + tag(DamageTypeTagRegistry.IS_SCYTHE).add(DamageTypeRegistry.SCYTHE_MELEE, DamageTypeRegistry.SCYTHE_SWEEP, DamageTypeRegistry.HIDDEN_BLADE_COUNTER); + tag(DamageTypeTagRegistry.IS_SCYTHE_MELEE).add(DamageTypeRegistry.SCYTHE_MELEE, DamageTypeRegistry.SCYTHE_SWEEP); + + tag(DamageTypeTagRegistry.SOUL_SHATTER_DAMAGE) + .addOptional(new ResourceLocation("irons_spellbooks:blood_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:eldritch_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:ender_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:evocation_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:fire_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:holy_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:ice_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:lightning_magic")) + .addOptional(new ResourceLocation("irons_spellbooks:nature_magic")); + } } diff --git a/src/main/java/com/sammy/malum/data/MalumLang.java b/src/main/java/com/sammy/malum/data/MalumLang.java index 023a7bcb1..988f592d9 100644 --- a/src/main/java/com/sammy/malum/data/MalumLang.java +++ b/src/main/java/com/sammy/malum/data/MalumLang.java @@ -195,7 +195,10 @@ protected void addTranslations() { add("malum.gui.curio.effect.spirits_heal", "Spirit Collection Replenishes Health"); add("malum.gui.curio.effect.spirits_xp", "Spirit Collection Generates Experience Points"); add("malum.gui.curio.effect.spirits_extend_effect", "Spirit Collection Aids Potion Durations"); + add("malum.gui.curio.effect.spirits_weave_mana", "Spirit Collection Recovers Soul Ward"); + add("malum.gui.curio.effect.spirits_weave_mana_irons_spellbooks", "Also Recovers Iron's Spellbooks' Mana"); add("malum.gui.curio.effect.spirits_add_health", "Spirit Collection Grants Extra Hearts"); + add("malum.gui.curio.effect.spirits_buff_spirit_collection", "Spirit Collection Generates Arcane Resonance"); add("malum.gui.curio.effect.hunger_drain", "Actively Drains Hunger"); add("malum.gui.curio.effect.eat_rotten", "Rotten Foods are Tastier"); add("malum.gui.curio.effect.growing_gluttony", "Eating Rotten Foods Extends Gluttony"); @@ -207,6 +210,7 @@ protected void addTranslations() { add("malum.gui.curio.effect.soul_ward_magic_resilience", "Soul Ward Magic Resilience"); add("malum.gui.curio.effect.rotten_gluttony", "Eating Rotten Food Generates Gluttony"); add("malum.gui.curio.effect.scythe_counterattack", "Powerful Scythe Counterattack When Struck"); + add("malum.gui.curio.effect.pacifist_recharge", "Cooldown Extends if the Scythe is Used"); add("malum.gui.curio.effect.full_health_fake_collection", "Striking Full Health Targets Triggers Spirit Collection Effects"); add("malum.gui.curio.effect.soul_ward_physical_absorption", "Soul Ward Absorbs Physical Damage Equally to Magic Damage"); add("malum.gui.curio.effect.spirits_gluttony", "Spirit Collection Generates Gluttony"); @@ -381,6 +385,11 @@ protected void addTranslations() { "Harnessing the reality-corroding properties of Malignant Pewter is easy. What fits the revocation of progress better than a crude weapon? An axe, which I named the Weight of Worlds in a fit of pique. It is slow, it is clumsy, it is physical... and it is " + italic("powerful") + " beyond measure.", "Rarely, the Weight seems to lend its approval to my slaughter, doubling the force I strike with, with no seeming source. I believe slaughter is the key because of the resonance I feel when I take a life with it - that resonance seems to expend itself when I swing next, guaranteeing that doubling of force."); + addSimpleEntryHeader("void.edge_of_deliverance", "The Edge of Deliverance", "A mad screamer's melody"); + addPages("void.edge_of_deliverance", + "Progress can be revoked, and crude can overcome grand. But progress can be undone by progress, can it not? A scythe, familiar in ways the axe was not, which I name the Edge of Deliverance. It is the true opposite - where the Weight of Worlds is sharp and heavy, the Edge is thin and winding.", + "This focuses the inconsistent force of the Weight of Worlds, seeking slaughter to wet the blade. Instead, a single attack's taste of blood empowers the scythe, creating an alternating pattern of killing strength."); + addSimpleEntryHeader("void.erosion_scepter", "Erosion Scepter", "May mages fear my might"); addPages("void.erosion_scepter", "A new false arcana has been created, using Malignant Pewter as a focus. In its corrosive reversal, the metal serves entropy - and so Eldritch answers its call. Like other uses of the metal, the resulting crystal in its Void Salt suspension seeks to unwind what humanity has wrought.", @@ -392,6 +401,10 @@ protected void addTranslations() { addPages("void.ring_of_growing_flesh", "I have overclocked the Ring of Curative Talent, creating a ring that does not simply heal, but overheal, granting additional health instead of regeneration whenever I collect a spirit crystal."); + addSimpleEntryHeader("void.ring_of_echoing_arcana", "Ring of Echoing Arcana", "I can see see the future " + italic("future future")); + addPages("void.ring_of_echoing_arcana", + "Overclocking the Ring of Curative Talent created a useful ring, so I have applied that principle to another ring, Manaweaving, to not only bind, but create resonance in magic. The Ring of Echoing Arcana grants Arcane Resonance whenever I collect a spirit crystal, empowering all my other spirit-collection effects."); + addEntryHeader("void.ring_of_gruesome_concentration", "Ring of Gruesome Concentration", "Consume and incorporate"); addHeadline("void.ring_of_gruesome_concentration", "Gruesome Concentration"); addPages("void.ring_of_gruesome_concentration", @@ -404,8 +417,9 @@ protected void addTranslations() { addEntryHeader("void.necklace_of_the_hidden_blade", "Necklace of the Hidden Blade", "A knife at their backs"); addHeadline("void.necklace_of_the_hidden_blade", "The Hidden Blade"); addPages("void.necklace_of_the_hidden_blade", - "The Narrow Edge concentrates my scythe's edge, but the Hidden Blade goes further, inverting the edge and making it hunger. I lose the sweeping attack, yes, but as I am harmed, the blade drinks of my pain, intensifying my next strike."); - + "The Narrow Edge concentrates my scythe's edge, but the Hidden Blade goes further, inverting the edge and making it hunger. I lose the sweeping attack, yes, but as I am harmed, the blade drinks of my pain- feeding upon it to enable a seemingly impossible flurry of cuts and slashes.", + "Upon activation, the necklace remains inert for a total of ten seconds, requiring rest and concentration in order to recover it's effect. Attacking at any point in this state will prolong this absence of function.", + "The counterattack's nature is a strange one, one I have not fully identified. It is as though the blade asserts its existence in multiple places at once, demanding reality make it so."); addSimpleEntryHeader("introduction", "Introduction", "On the nature of souls"); addPages("introduction", @@ -675,6 +689,9 @@ protected void addTranslations() { addHeadline("reactive_trinkets.ring_of_alchemical_mastery", "Ring of Alchemical Mastery"); addPages("reactive_trinkets.ring_of_alchemical_mastery", "This ring, through alchemical trickery, is able to manipulate the potions running through my blood. Whenever I collect arcana, the ring will partially filter out negative effects, while at the same time prolonging positive ones."); + addHeadline("reactive_trinkets.ring_of_manaweaving", "Ring of Manaweaving"); + addPages("reactive_trinkets.ring_of_manaweaving", + "Soul Ward is a powerful barrier, but in it's current state it leaves much to be desired. One of it's glaring issues is the burdensome recovery time. To combat this, I've created a ring that in reaction to spirit arcana accelerates the recovery process of Soul Ward"); addHeadline("reactive_trinkets.ring_of_prowess", "Ring of Prowess"); addPages("reactive_trinkets.ring_of_prowess", "Brilliance is attached to the soul, but isn't an impulse like the arcana. It is accumulated knowledge, and so is not inherently tied to the soul that learned it. Even strikes which pass through the soul harmlessly are capable of dislodging it.", @@ -1081,20 +1098,20 @@ protected void addTranslations() { add("death.attack." + DamageTypeRegistry.SCYTHE_SWEEP_IDENTIFIER, "%s was sliced in half"); add("death.attack." + DamageTypeRegistry.SCYTHE_SWEEP_IDENTIFIER + ".player", "%s was sliced in half by %s"); - addEffectDescription(MobEffectRegistry.GAIAS_BULWARK, "You are protected by an earthen bulwark, increasing your armor."); - addEffectDescription(MobEffectRegistry.EARTHEN_MIGHT, "Your fists and tools are reinforced with earth, increasing your overall damage."); - addEffectDescription(MobEffectRegistry.MINERS_RAGE, "Your tools are bolstered with radiance, increasing your mining and attack speed."); - addEffectDescription(MobEffectRegistry.IFRITS_EMBRACE, "The warm embrace of fire coats your soul, mending your seared scars."); - addEffectDescription(MobEffectRegistry.ZEPHYRS_COURAGE, "The zephyr propels you forward, increasing your movement speed."); - addEffectDescription(MobEffectRegistry.AETHERS_CHARM, "The heavens call for you, increasing jump height and decreasing gravity."); - addEffectDescription(MobEffectRegistry.POSEIDONS_GRASP, "You reach out for further power, increasing your reach and item pickup distance."); - addEffectDescription(MobEffectRegistry.ANGLERS_LURE, "Let any fish who meets my gaze learn the true meaning of fear; for I am the harbinger of death. The bane of creatures sub-aqueous, my rod is true and unwavering as I cast into the aquatic abyss. A man, scorned by this uncaring Earth, finds solace in the sea. My only friend, the worm upon my hook. Wriggling, writhing, struggling to surmount the mortal pointlessness that permeates this barren world. I am alone. I am empty. And yet, I fish."); - - addEffectDescription(MobEffectRegistry.GLUTTONY, "You feed on the vulnerable, increasing scythe proficiency and gradually restoring lost hunger."); - addEffectDescription(MobEffectRegistry.CANCEROUS_GROWTH, "You are emboldened by uncontrolled growth, increasing maximum health."); - addEffectDescription(MobEffectRegistry.WICKED_INTENT, "You bring forth a powerful counter attack, increasing scythe proficiency for just one strike."); - addEffectDescription(MobEffectRegistry.SILENCED, "You are silenced, leaving your magical capabilities neutered."); - addEffectDescription(MobEffectRegistry.GRIM_CERTAINTY, "The Weight of Worlds oscillates, sealing the next strike as a critical blow."); + addJEEDEffectDescription(MobEffectRegistry.GAIAS_BULWARK, "You are protected by an earthen bulwark, increasing your armor."); + addJEEDEffectDescription(MobEffectRegistry.EARTHEN_MIGHT, "Your fists and tools are reinforced with earth, increasing your overall damage."); + addJEEDEffectDescription(MobEffectRegistry.MINERS_RAGE, "Your tools are bolstered with radiance, increasing your mining and attack speed."); + addJEEDEffectDescription(MobEffectRegistry.IFRITS_EMBRACE, "The warm embrace of fire coats your soul, mending your seared scars."); + addJEEDEffectDescription(MobEffectRegistry.ZEPHYRS_COURAGE, "The zephyr propels you forward, increasing your movement speed."); + addJEEDEffectDescription(MobEffectRegistry.AETHERS_CHARM, "The heavens call for you, increasing jump height and decreasing gravity."); + addJEEDEffectDescription(MobEffectRegistry.POSEIDONS_GRASP, "You reach out for further power, increasing your reach and item pickup distance."); + addJEEDEffectDescription(MobEffectRegistry.ANGLERS_LURE, "Let any fish who meets my gaze learn the true meaning of fear; for I am the harbinger of death. The bane of creatures sub-aqueous, my rod is true and unwavering as I cast into the aquatic abyss. A man, scorned by this uncaring Earth, finds solace in the sea. My only friend, the worm upon my hook. Wriggling, writhing, struggling to surmount the mortal pointlessness that permeates this barren world. I am alone. I am empty. And yet, I fish."); + + addJEEDEffectDescription(MobEffectRegistry.GLUTTONY, "You feed on the vulnerable, increasing scythe proficiency and gradually restoring lost hunger."); + addJEEDEffectDescription(MobEffectRegistry.CANCEROUS_GROWTH, "You are emboldened by uncontrolled growth, increasing maximum health."); + addJEEDEffectDescription(MobEffectRegistry.WICKED_INTENT, "You bring forth a powerful counter attack, increasing scythe proficiency for just one strike."); + addJEEDEffectDescription(MobEffectRegistry.SILENCED, "You are silenced, leaving your magical capabilities neutered."); + addJEEDEffectDescription(MobEffectRegistry.GRIM_CERTAINTY, "The Weight of Worlds oscillates, sealing the next strike as a critical blow."); addTetraMaterial("soul_stained_steel", "Soulstained Steel"); addTetraMaterial("hallowed_gold", "Hallowed Gold"); @@ -1104,7 +1121,19 @@ protected void addTranslations() { addTetraMaterial("twisted_rock", "Twisted Rock"); addTetraMaterial("spirit_fabric", "Spirit Fabric"); - addTetraImprovement("malum.soul_strike", "Soul Strike", "Allows your item to shatter souls."); + addTetraImprovement("malum.soul_strike", "Soul Strike", "The item's material allows it to strike the soul."); + + addAttributeLibAttributeDescription(AttributeRegistry.SCYTHE_PROFICIENCY, "Damage multiplier for Scythes"); + addAttributeLibAttributeDescription(AttributeRegistry.SPIRIT_SPOILS, "Flat increase to spirits looted from slain foes"); + addAttributeLibAttributeDescription(AttributeRegistry.ARCANE_RESONANCE, "Bonus potency for spirit-collection effects"); + + addAttributeLibAttributeDescription(AttributeRegistry.SOUL_WARD_INTEGRITY, "A percentile increase in durability for Soul Ward"); + addAttributeLibAttributeDescription(AttributeRegistry.SOUL_WARD_RECOVERY_RATE, "A percentile increase in recovery rate for Soul Ward"); + addAttributeLibAttributeDescription(AttributeRegistry.SOUL_WARD_CAP, "The capacity for Soul Ward"); + + addAttributeLibAttributeDescription(AttributeRegistry.RESERVE_STAFF_CHARGES, "A capacity for extra staff charges, replenished overtime, consumed when casting."); + addAttributeLibAttributeDescription(AttributeRegistry.MALIGNANT_CONVERSION, "A percentile conversion rate in which certain magical attributes are converted into armor, armor toughness and magic resistance"); + } @Override @@ -1141,11 +1170,6 @@ public String underline(String s) { return "$u" + s + "/$"; } - public void addTetraMaterial(String identifier, String name) { - add("tetra.material." + identifier, name); - add("tetra.material." + identifier + ".prefix", name); - } - public void addRite(TotemicRiteType riteType, String basicName, String corruptName) { add(riteType.translationIdentifier(false), basicName); add(riteType.translationIdentifier(true), corruptName); @@ -1155,11 +1179,6 @@ public void addRiteEffectCategory(TotemicRiteEffect.MalumRiteEffectCategory cate add(category.getTranslationKey(), DataHelper.toTitleCase(category.name().toLowerCase(), "_")); } - public void addTetraImprovement(String identifier, String name, String description) { - add("tetra.improvement." + identifier + ".name", name); - add("tetra.improvement." + identifier + ".description", description); - } - public void addRiteEntry(String identifier, String riteDescription, String riteHoverDescription) { add("malum.gui.book.entry.page.text." + identifier, riteDescription); add("malum.gui.book.entry.page.text." + identifier + ".hover", riteHoverDescription); @@ -1194,19 +1213,25 @@ public void addHeadline(String identifier, String tooltip) { add("malum.gui.book.entry.page.headline." + identifier, tooltip); } - public void addTooltip(String identifier, String tooltip) { - add("malum.tooltip." + identifier, tooltip); + public void addTetraMaterial(String identifier, String name) { + add("tetra.material." + identifier, name); + add("tetra.material." + identifier + ".prefix", name); } - public void addEffectDescription(Supplier mobEffectSupplier, String description) { - add(mobEffectSupplier.get().getDescriptionId() + ".description", description); + public void addTetraImprovement(String identifier, String name, String description) { + add("tetra.improvement." + identifier + ".name", name); + add("tetra.improvement." + identifier + ".description", description); } - public void addDamageTypeDeathDescription(String identifier, String description) { - add("death.attack." + identifier, "%s " + description); - add("death.attack." + identifier + ".player", "%s " + description + " by %s"); + public void addAttributeLibAttributeDescription(RegistryObject attribute, String desc) { + add("attribute.name.malum." + attribute.getId().getPath() + ".desc", desc); } + public void addJEEDEffectDescription(Supplier mobEffectSupplier, String description) { + add(mobEffectSupplier.get().getDescriptionId() + ".description", description); + } + + public String correctSoundName(String name) { if ((name.endsWith("_step"))) { return "footsteps"; diff --git a/src/main/java/com/sammy/malum/data/item/MalumItemTags.java b/src/main/java/com/sammy/malum/data/item/MalumItemTags.java index 367bc8274..9066033f0 100644 --- a/src/main/java/com/sammy/malum/data/item/MalumItemTags.java +++ b/src/main/java/com/sammy/malum/data/item/MalumItemTags.java @@ -129,6 +129,11 @@ protected void addTags(HolderLookup.Provider pProvider) { safeCopy(BlockTagRegistry.TWISTED_WALLS, ItemTagRegistry.TWISTED_WALLS); safeCopy(BlockTagRegistry.TWISTED_BLOCKS, ItemTagRegistry.TWISTED_BLOCKS); + tag(ItemTagRegistry.ASPECTED_SPIRITS).add( + SACRED_SPIRIT.get(), WICKED_SPIRIT.get(), ARCANE_SPIRIT.get(), ELDRITCH_SPIRIT.get(), + AERIAL_SPIRIT.get(), AQUEOUS_SPIRIT.get(), EARTHEN_SPIRIT.get(), INFERNAL_SPIRIT.get()); + tag(ItemTagRegistry.SPIRITS).addTag(ItemTagRegistry.ASPECTED_SPIRITS).add(UMBRAL_SPIRIT.get()); + tag(ItemTagRegistry.SCYTHE).add(CRUDE_SCYTHE.get(), SOUL_STAINED_STEEL_SCYTHE.get(), CREATIVE_SCYTHE.get()); tag(ItemTagRegistry.STAFF).add(MNEMONIC_HEX_STAFF.get(), STAFF_OF_THE_AURIC_FLAME.get(), EROSION_SCEPTER.get()); @@ -186,7 +191,7 @@ protected void addTags(HolderLookup.Provider pProvider) { RUNE_OF_UNNATURAL_STAMINA.get(), RUNE_OF_TWINNED_DURATION.get(), RUNE_OF_TOUGHNESS.get(), RUNE_OF_IGNEOUS_SOLACE.get()) // Trinkets - .add(RING_OF_THE_ENDLESS_WELL.get(), RING_OF_GROWING_FLESH.get(), + .add(RING_OF_THE_ENDLESS_WELL.get(), RING_OF_GROWING_FLESH.get(), RING_OF_ECHOING_ARCANA.get(), RING_OF_GRUESOME_CONCENTRATION.get(), NECKLACE_OF_THE_HIDDEN_BLADE.get(), NECKLACE_OF_THE_WATCHER.get(), BELT_OF_THE_LIMITLESS.get()) // Augments diff --git a/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipeReplacements.java b/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipeReplacements.java index 55a330943..9d464c583 100644 --- a/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipeReplacements.java +++ b/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipeReplacements.java @@ -35,11 +35,13 @@ protected void buildRecipes(Consumer pWriter) { replace(Items.QUARTZ, Tags.Items.GEMS_QUARTZ); replace(Items.SLIME_BALL, Tags.Items.SLIMEBALLS); - super.buildRecipes(vanilla -> { - FinishedRecipe modified = enhance(vanilla); - if (modified != null) - pWriter.accept(modified); - }); + + //this fucker literally for no reason makes datagen not work, 1.20 is close to it's end, we're just gonna figure it out in 1.21 +// super.buildRecipes(vanilla -> { +// FinishedRecipe modified = enhance(vanilla); +// if (modified != null) +// pWriter.accept(modified); +// }); } diff --git a/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipes.java b/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipes.java index 93c4ed0e6..e121febc1 100644 --- a/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipes.java +++ b/src/main/java/com/sammy/malum/data/recipe/MalumVanillaRecipes.java @@ -258,11 +258,11 @@ private static void nodeSmelting(Consumer recipeConsumer, Regist } private static void etherBrazier(Consumer recipeConsumer, ItemLike output, ItemLike rock, ItemLike ether) { - NBTCarryRecipeBuilder.shapedRecipe(output, 2, Ingredient.of(ether)).key('#', rock).key('S', Ingredient.of(Tags.Items.RODS_WOODEN)).key('X', ether).patternLine("#X#").patternLine("S#S").addCriterion("has_ether", has(ItemRegistry.ETHER.get())).build(recipeConsumer, ForgeRegistries.ITEMS.getKey(output.asItem()).getPath()); + NBTCarryRecipeBuilder.shapedRecipe(output, 2, Ingredient.of(ether)).key('#', rock).key('S', Ingredient.of(Tags.Items.RODS_WOODEN)).key('X', ether).patternLine("#X#").patternLine("S#S").addCriterion("has_ether", has(ItemRegistry.ETHER.get())).build(recipeConsumer, MalumMod.malumPath(ForgeRegistries.ITEMS.getKey(output.asItem()).getPath())); } private static void etherTorch(Consumer recipeConsumer, ItemLike output, ItemLike ether) { - NBTCarryRecipeBuilder.shapedRecipe(output, 4, Ingredient.of(ether)).key('#', Ingredient.of(Tags.Items.RODS_WOODEN)).key('X', ether).patternLine("X").patternLine("#").addCriterion("has_ether", has(ItemRegistry.ETHER.get())).build(recipeConsumer, ForgeRegistries.ITEMS.getKey(output.asItem()).getPath() + "_alternative"); + NBTCarryRecipeBuilder.shapedRecipe(output, 4, Ingredient.of(ether)).key('#', Ingredient.of(Tags.Items.RODS_WOODEN)).key('X', ether).patternLine("X").patternLine("#").addCriterion("has_ether", has(ItemRegistry.ETHER.get())).build(recipeConsumer, MalumMod.malumPath(ForgeRegistries.ITEMS.getKey(output.asItem()).getPath() + "_alternative")); } private static void shapelessPlanks(Consumer recipeConsumer, ItemLike planks, TagKey input) { diff --git a/src/main/java/com/sammy/malum/data/recipe/infusion/CurioSpiritInfusionRecipes.java b/src/main/java/com/sammy/malum/data/recipe/infusion/CurioSpiritInfusionRecipes.java index 529774f75..4f96af0fc 100644 --- a/src/main/java/com/sammy/malum/data/recipe/infusion/CurioSpiritInfusionRecipes.java +++ b/src/main/java/com/sammy/malum/data/recipe/infusion/CurioSpiritInfusionRecipes.java @@ -34,12 +34,6 @@ public static void buildRecipes(Consumer consumer) { .addSpirit(ELDRITCH_SPIRIT, 2) .build(consumer); - new SpiritInfusionRecipeBuilder(ItemRegistry.GILDED_RING.get(), 1, ItemRegistry.RING_OF_ARCANE_PROWESS.get(), 1) - .addExtraItem(ItemRegistry.CLUSTER_OF_BRILLIANCE.get(), 4) - .addExtraItem(ItemRegistry.ALCHEMICAL_CALX.get(), 4) - .addSpirit(ARCANE_SPIRIT, 32) - .build(consumer); - new SpiritInfusionRecipeBuilder(ItemRegistry.GILDED_RING.get(), 1, ItemRegistry.RING_OF_CURATIVE_TALENT.get(), 1) .addExtraItem(ItemRegistry.LIVING_FLESH.get(), 4) .addExtraItem(ItemRegistry.ALCHEMICAL_CALX.get(), 4) @@ -57,6 +51,19 @@ public static void buildRecipes(Consumer consumer) { .addSpirit(AQUEOUS_SPIRIT, 16) .build(consumer); + new SpiritInfusionRecipeBuilder(ItemRegistry.GILDED_RING.get(), 1, ItemRegistry.RING_OF_MANAWEAVING.get(), 1) + .addExtraItem(ItemRegistry.SOUL_STAINED_STEEL_PLATING.get(), 6) + .addExtraItem(ItemRegistry.PROCESSED_SOULSTONE.get(), 4) + .addSpirit(ARCANE_SPIRIT, 16) + .addSpirit(EARTHEN_SPIRIT, 16) + .build(consumer); + + new SpiritInfusionRecipeBuilder(ItemRegistry.GILDED_RING.get(), 1, ItemRegistry.RING_OF_ARCANE_PROWESS.get(), 1) + .addExtraItem(ItemRegistry.CLUSTER_OF_BRILLIANCE.get(), 4) + .addExtraItem(ItemRegistry.ALCHEMICAL_CALX.get(), 4) + .addSpirit(ARCANE_SPIRIT, 32) + .build(consumer); + new SpiritInfusionRecipeBuilder(ItemRegistry.ORNATE_NECKLACE.get(), 1, ItemRegistry.NECKLACE_OF_TIDAL_AFFINITY.get(), 1) .addExtraItem(ItemRegistry.GOLD_NODE.get(), 6) .addExtraItem(Items.HEART_OF_THE_SEA, 1) @@ -149,7 +156,7 @@ public static void buildRecipes(Consumer consumer) { .build(consumer); new SpiritInfusionRecipeBuilder(ItemRegistry.RING_OF_ESOTERIC_SPOILS.get(), 1, ItemRegistry.RING_OF_THE_ENDLESS_WELL.get(), 1) - .addExtraItem(ItemRegistry.NULL_SLATE.get(), 8) + .addExtraItem(ItemRegistry.NULL_SLATE.get(), 16) .addExtraItem(ItemRegistry.MNEMONIC_FRAGMENT.get(), 8) .addSpirit(WICKED_SPIRIT, 32) .addSpirit(ARCANE_SPIRIT, 16) @@ -163,7 +170,7 @@ public static void buildRecipes(Consumer consumer) { .addSpirit(SACRED_SPIRIT, 16) .addSpirit(WICKED_SPIRIT, 16) .addSpirit(ARCANE_SPIRIT, 16) - .addSpirit(ELDRITCH_SPIRIT, 16) + .addSpirit(ELDRITCH_SPIRIT, 8) .build(consumer); new SpiritInfusionRecipeBuilder(ItemRegistry.RING_OF_CURATIVE_TALENT.get(), 1, ItemRegistry.RING_OF_GROWING_FLESH.get(), 1) @@ -172,7 +179,16 @@ public static void buildRecipes(Consumer consumer) { .addSpirit(SACRED_SPIRIT, 16) .addSpirit(WICKED_SPIRIT, 16) .addSpirit(ARCANE_SPIRIT, 16) - .addSpirit(ELDRITCH_SPIRIT, 16) + .addSpirit(ELDRITCH_SPIRIT, 8) + .build(consumer); + + new SpiritInfusionRecipeBuilder(ItemRegistry.RING_OF_MANAWEAVING.get(), 1, ItemRegistry.RING_OF_ECHOING_ARCANA.get(), 1) + .addExtraItem(ItemRegistry.NULL_SLATE.get(), 16) + .addExtraItem(ItemRegistry.MNEMONIC_FRAGMENT.get(), 8) + .addSpirit(AQUEOUS_SPIRIT, 32) + .addSpirit(ARCANE_SPIRIT, 16) + .addSpirit(WICKED_SPIRIT, 16) + .addSpirit(ELDRITCH_SPIRIT, 8) .build(consumer); new SpiritInfusionRecipeBuilder(ItemRegistry.NECKLACE_OF_THE_NARROW_EDGE.get(), 1, ItemRegistry.NECKLACE_OF_THE_HIDDEN_BLADE.get(), 1) @@ -198,8 +214,8 @@ public static void buildRecipes(Consumer consumer) { .addExtraItem(ItemRegistry.VOID_SALTS.get(), 16) .addExtraItem(ItemRegistry.NULL_SLATE.get(), 8) .addExtraItem(ItemRegistry.MNEMONIC_FRAGMENT.get(), 4) + .addSpirit(ARCANE_SPIRIT, 64) .addSpirit(WICKED_SPIRIT, 32) - .addSpirit(ARCANE_SPIRIT, 32) .addSpirit(ELDRITCH_SPIRIT, 16) .build(consumer); } diff --git a/src/main/java/com/sammy/malum/data/recipe/infusion/GearSpiritInfusionRecipes.java b/src/main/java/com/sammy/malum/data/recipe/infusion/GearSpiritInfusionRecipes.java index 680162a5f..3f2f5269a 100644 --- a/src/main/java/com/sammy/malum/data/recipe/infusion/GearSpiritInfusionRecipes.java +++ b/src/main/java/com/sammy/malum/data/recipe/infusion/GearSpiritInfusionRecipes.java @@ -31,6 +31,13 @@ public static void buildRecipes(Consumer consumer) { .addSpirit(ELDRITCH_SPIRIT, 16) .build(consumer); + new SpiritInfusionRecipeBuilder(ItemRegistry.SOUL_STAINED_STEEL_SCYTHE.get(), 1, ItemRegistry.EDGE_OF_DELIVERANCE.get(), 1) + .addExtraItem(ItemRegistry.MALIGNANT_PEWTER_INGOT.get(), 2) + .addSpirit(EARTHEN_SPIRIT, 32) + .addSpirit(WICKED_SPIRIT, 32) + .addSpirit(ELDRITCH_SPIRIT, 16) + .build(consumer); + new SpiritInfusionRecipeBuilder(ItemRegistry.TOTEMIC_STAFF.get(), 1, ItemRegistry.MNEMONIC_HEX_STAFF.get(), 1) .addExtraItem(ItemRegistry.MNEMONIC_FRAGMENT.get(), 8) .addExtraItem(ItemRegistry.SOUL_STAINED_STEEL_INGOT.get(), 4) diff --git a/src/main/java/com/sammy/malum/data/worldgen/PlacedFeatures.java b/src/main/java/com/sammy/malum/data/worldgen/PlacedFeatures.java index 9562b6a37..3979890aa 100644 --- a/src/main/java/com/sammy/malum/data/worldgen/PlacedFeatures.java +++ b/src/main/java/com/sammy/malum/data/worldgen/PlacedFeatures.java @@ -19,15 +19,15 @@ public static void bootstrap(BootstapContext context) { context.register(PlacedFeatureRegistry.ORE_BRILLIANT, addOreFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_BRILLIANT_ORE), -64, 40, 3)); context.register(PlacedFeatureRegistry.ORE_NATURAL_QUARTZ, addOreFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_NATURAL_QUARTZ_ORE), -64, 10, 2)); context.register(PlacedFeatureRegistry.ORE_BLAZING_QUARTZ, addOreFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_BLAZING_QUARTZ_ORE), -16, 112, 16)); - context.register(PlacedFeatureRegistry.ORE_CTHONIC_GOLD, addOreFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_CTHONIC_GOLD_ORE_FEATURE), -48, -0, 1, RarityFilter.onAverageOnceEvery(3))); + context.register(PlacedFeatureRegistry.ORE_CTHONIC_GOLD, addOreFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_CTHONIC_GOLD_ORE_FEATURE), -48, -0, 1, RarityFilter.onAverageOnceEvery(2))); context.register(PlacedFeatureRegistry.RUNEWOOD_TREE, new PlacedFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_RUNEWOOD_TREE), ImmutableList.builder().add( PlacementUtils.HEIGHTMAP, - RarityFilter.onAverageOnceEvery(8), + RarityFilter.onAverageOnceEvery(12), InSquarePlacement.spread(), - CountPlacement.of(3) + CountPlacement.of(2) ).build() ) ); @@ -35,7 +35,7 @@ public static void bootstrap(BootstapContext context) { new PlacedFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_RUNEWOOD_TREE), ImmutableList.builder().add( PlacementUtils.HEIGHTMAP, - RarityFilter.onAverageOnceEvery(16), + RarityFilter.onAverageOnceEvery(20), InSquarePlacement.spread(), CountPlacement.of(3) ).build() @@ -46,7 +46,7 @@ public static void bootstrap(BootstapContext context) { new PlacedFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_AZURE_RUNEWOOD_TREE), ImmutableList.builder().add( PlacementUtils.HEIGHTMAP, - RarityFilter.onAverageOnceEvery(12), + RarityFilter.onAverageOnceEvery(16), InSquarePlacement.spread(), CountPlacement.of(3) ).build() @@ -56,7 +56,7 @@ public static void bootstrap(BootstapContext context) { new PlacedFeature(features.getOrThrow(ConfiguredFeatureRegistry.CONFIGURED_AZURE_RUNEWOOD_TREE), ImmutableList.builder().add( PlacementUtils.HEIGHTMAP, - RarityFilter.onAverageOnceEvery(20), + RarityFilter.onAverageOnceEvery(24), InSquarePlacement.spread(), CountPlacement.of(3) ).build() diff --git a/src/main/java/com/sammy/malum/mixin/PlayerMixin.java b/src/main/java/com/sammy/malum/mixin/PlayerMixin.java index 7b4456322..8c777ae3a 100644 --- a/src/main/java/com/sammy/malum/mixin/PlayerMixin.java +++ b/src/main/java/com/sammy/malum/mixin/PlayerMixin.java @@ -1,11 +1,15 @@ package com.sammy.malum.mixin; import com.sammy.malum.common.effect.aura.AqueousAura; +import com.sammy.malum.common.item.curiosities.weapons.scythe.*; +import com.sammy.malum.registry.common.*; +import net.minecraft.world.damagesource.*; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; +import team.lodestar.lodestone.helpers.*; @Mixin(Player.class) public class PlayerMixin { @@ -15,4 +19,13 @@ public class PlayerMixin { Player player = (Player) (Object) this; return AqueousAura.growBoundingBox(player, aabb); } + + @ModifyArg(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z")) + private DamageSource malum$attack(DamageSource pSource) { + Player player = (Player) (Object) this; + if (player.getMainHandItem().getItem() instanceof MalumScytheItem) { + return DamageTypeHelper.create(player.level(), DamageTypeRegistry.SCYTHE_MELEE, player); + } + return pSource; + } } diff --git a/src/main/java/com/sammy/malum/registry/client/ParticleRegistry.java b/src/main/java/com/sammy/malum/registry/client/ParticleRegistry.java index 49629e385..f6efaf9e4 100644 --- a/src/main/java/com/sammy/malum/registry/client/ParticleRegistry.java +++ b/src/main/java/com/sammy/malum/registry/client/ParticleRegistry.java @@ -36,6 +36,10 @@ public class ParticleRegistry { public static RegistryObject SQUARE = PARTICLES.register("square", LodestoneWorldParticleType::new); public static RegistryObject SAW = PARTICLES.register("saw", LodestoneWorldParticleType::new); + public static RegistryObject SLASH = PARTICLES.register("slash", LodestoneWorldParticleType::new); + public static RegistryObject HEAVY_SLASH = PARTICLES.register("heavy_slash", LodestoneWorldParticleType::new); + + public static RegistryObject SCYTHE_CUT_PARTICLE = PARTICLES.register("scythe_cut", () -> new SimpleParticleType(true)); public static RegistryObject SCYTHE_SWEEP_PARTICLE = PARTICLES.register("scythe_sweep", () -> new SimpleParticleType(true)); public static RegistryObject STAFF_SLAM_PARTICLE = PARTICLES.register("staff_slam", () -> new SimpleParticleType(true)); @@ -60,6 +64,9 @@ public static void registerParticleFactory(RegisterParticleProvidersEvent event) Minecraft.getInstance().particleEngine.register(SQUARE.get(), LodestoneWorldParticleType.Factory::new); Minecraft.getInstance().particleEngine.register(SAW.get(), LodestoneWorldParticleType.Factory::new); + Minecraft.getInstance().particleEngine.register(SLASH.get(), LodestoneWorldParticleType.Factory::new); + Minecraft.getInstance().particleEngine.register(HEAVY_SLASH.get(), LodestoneWorldParticleType.Factory::new); + Minecraft.getInstance().particleEngine.register(SCYTHE_CUT_PARTICLE.get(), ScytheAttackParticle.Factory::new); Minecraft.getInstance().particleEngine.register(SCYTHE_SWEEP_PARTICLE.get(), ScytheAttackParticle.Factory::new); Minecraft.getInstance().particleEngine.register(STAFF_SLAM_PARTICLE.get(), ScytheAttackParticle.Factory::new); diff --git a/src/main/java/com/sammy/malum/registry/common/AttributeRegistry.java b/src/main/java/com/sammy/malum/registry/common/AttributeRegistry.java index ee1ec9525..dd13c8b22 100644 --- a/src/main/java/com/sammy/malum/registry/common/AttributeRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/AttributeRegistry.java @@ -1,7 +1,6 @@ package com.sammy.malum.registry.common; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.RangedAttribute; +import net.minecraft.world.entity.ai.attributes.*; import net.minecraftforge.event.entity.EntityAttributeModificationEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -15,12 +14,12 @@ @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class AttributeRegistry { public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, MALUM); - public static final RegistryObject SCYTHE_PROFICIENCY = registerAttribute(ATTRIBUTES, MALUM, "scythe_proficiency", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2048.0D).setSyncable(true)); + public static final RegistryObject SCYTHE_PROFICIENCY = registerAttribute(ATTRIBUTES, MALUM, "scythe_proficiency", (id) -> new RangedAttribute(id, 1D, 0.0D, 2048.0D).setSyncable(true)); public static final RegistryObject SPIRIT_SPOILS = registerAttribute(ATTRIBUTES, MALUM, "spirit_spoils", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2048.0D).setSyncable(true)); - public static final RegistryObject ARCANE_RESONANCE = registerAttribute(ATTRIBUTES, MALUM, "arcane_resonance", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2048.0D).setSyncable(true)); + public static final RegistryObject ARCANE_RESONANCE = registerAttribute(ATTRIBUTES, MALUM, "arcane_resonance", (id) -> new RangedAttribute(id, 1.0D, 0.0D, 2048.0D).setSyncable(true)); - public static final RegistryObject SOUL_WARD_STRENGTH = registerAttribute(ATTRIBUTES, MALUM, "soul_ward_strength", (id) -> new RangedAttribute(id, 0.0D, 0.0D, 2048.0D).setSyncable(true)); - public static final RegistryObject SOUL_WARD_RECOVERY_RATE = registerAttribute(ATTRIBUTES, MALUM, "soul_ward_recovery_rate", (id) -> new RangedAttribute(id, 0D, 0.0D, 2048.0D).setSyncable(true)); + public static final RegistryObject SOUL_WARD_INTEGRITY = registerAttribute(ATTRIBUTES, MALUM, "soul_ward_integrity", (id) -> new RangedAttribute(id, 1D, 0.0D, 2048.0D).setSyncable(true)); + public static final RegistryObject SOUL_WARD_RECOVERY_RATE = registerAttribute(ATTRIBUTES, MALUM, "soul_ward_recovery_rate", (id) -> new RangedAttribute(id, 1D, 0.0D, 2048.0D).setSyncable(true)); public static final RegistryObject SOUL_WARD_CAP = registerAttribute(ATTRIBUTES, MALUM, "soul_ward_capacity", (id) -> new RangedAttribute(id, 0D, 0.0D, 2048.0D).setSyncable(true)); public static final RegistryObject RESERVE_STAFF_CHARGES = registerAttribute(ATTRIBUTES, MALUM, "reserve_staff_charges", (id) -> new RangedAttribute(id, 0D, 0.0D, 2048.0D).setSyncable(true)); @@ -33,7 +32,7 @@ public static void modifyEntityAttributes(EntityAttributeModificationEvent event event.add(e, SPIRIT_SPOILS.get()); event.add(e, ARCANE_RESONANCE.get()); - event.add(e, SOUL_WARD_STRENGTH.get()); + event.add(e, SOUL_WARD_INTEGRITY.get()); event.add(e, SOUL_WARD_RECOVERY_RATE.get()); event.add(e, SOUL_WARD_CAP.get()); event.add(e, RESERVE_STAFF_CHARGES.get()); diff --git a/src/main/java/com/sammy/malum/registry/common/DamageTypeRegistry.java b/src/main/java/com/sammy/malum/registry/common/DamageTypeRegistry.java index c5b92a38e..d684b79cd 100644 --- a/src/main/java/com/sammy/malum/registry/common/DamageTypeRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/DamageTypeRegistry.java @@ -16,17 +16,8 @@ public class DamageTypeRegistry { public static final String SCYTHE_SWEEP_IDENTIFIER = "scythe_sweep"; public static final ResourceKey VOODOO = ResourceKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath("voodoo")); - public static final ResourceKey SCYTHE_SWEEP = ResourceKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath("scythe_sweep")); - - public static DamageSource create(Level level, ResourceKey damageType) { - return create(level, damageType, null, null); - } - public static DamageSource create(Level level, ResourceKey damageType, @Nullable Entity source) { - return create(level, damageType, null, source); - } - - public static DamageSource create(Level level, ResourceKey damageType, @Nullable Entity projectile, @Nullable Entity source) { - return new DamageSource(level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(damageType), projectile, source); - } + public static final ResourceKey SCYTHE_MELEE = ResourceKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath("scythe_melee")); + public static final ResourceKey SCYTHE_SWEEP = ResourceKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath("scythe_sweep")); + public static final ResourceKey HIDDEN_BLADE_COUNTER = ResourceKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath("hidden_blade_counter")); } \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/registry/common/DamageTypeTagRegistry.java b/src/main/java/com/sammy/malum/registry/common/DamageTypeTagRegistry.java index 0f1ec3663..0c9f65a9f 100644 --- a/src/main/java/com/sammy/malum/registry/common/DamageTypeTagRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/DamageTypeTagRegistry.java @@ -10,12 +10,14 @@ public class DamageTypeTagRegistry { public static final TagKey SOUL_SHATTER_DAMAGE = malumTag("can_soul_shatter"); + public static final TagKey IS_SCYTHE = malumTag("is_scythe"); + public static final TagKey IS_SCYTHE_MELEE = malumTag("is_scythe_melee"); - private static TagKey modTag(String path) { + public static TagKey modTag(String path) { return TagKey.create(Registries.DAMAGE_TYPE, new ResourceLocation(path)); } - private static TagKey malumTag(String path) { + public static TagKey malumTag(String path) { return TagKey.create(Registries.DAMAGE_TYPE, MalumMod.malumPath(path)); } diff --git a/src/main/java/com/sammy/malum/registry/common/MobEffectRegistry.java b/src/main/java/com/sammy/malum/registry/common/MobEffectRegistry.java index de185fe4b..65ce99bfa 100644 --- a/src/main/java/com/sammy/malum/registry/common/MobEffectRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/MobEffectRegistry.java @@ -20,7 +20,6 @@ @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class MobEffectRegistry { - public static final Map ALCHEMICAL_PROFICIENCY_MAP = new HashMap<>(); public static final DeferredRegister EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, MalumMod.MALUM); public static final RegistryObject GAIAS_BULWARK = EFFECTS.register("gaias_bulwark", EarthenAura::new); @@ -38,19 +37,16 @@ public class MobEffectRegistry { public static final RegistryObject REACTIVE_SHIELDING = EFFECTS.register("reactive_shielding", ReactiveShieldingEffect::new); public static final RegistryObject SACRIFICIAL_EMPOWERMENT = EFFECTS.register("sacrificial_empowerment", SacrificialEmpowermentEffect::new); - public static final RegistryObject GLUTTONY = attachAlchemicalProficiency(EFFECTS.register("gluttony", GluttonyEffect::new), 0.5f); + public static final RegistryObject GLUTTONY = EFFECTS.register("gluttony", GluttonyEffect::new); public static final RegistryObject CANCEROUS_GROWTH = EFFECTS.register("cancerous_growth", GrowingFleshEffect::new); - public static final RegistryObject WICKED_INTENT = attachAlchemicalProficiency(EFFECTS.register("wicked_intent", WickedIntentEffect::new), 0.2f); + public static final RegistryObject ARCANE_REVERBERATION = EFFECTS.register("arcane_reverberation", EchoingArcanaEffect::new); + public static final RegistryObject WICKED_INTENT = EFFECTS.register("wicked_intent", WickedIntentEffect::new); public static final RegistryObject SILENCED = EFFECTS.register("silenced", SilencedEffect::new); public static final RegistryObject GRIM_CERTAINTY = EFFECTS.register("grim_certainty", GrimCertaintyEffect::new); + public static final RegistryObject IMMINENT_DELIVERANCE = EFFECTS.register("imminent_deliverance", ImminentDeliveranceEffect::new); public static final RegistryObject REJECTED = EFFECTS.register("rejected", RejectedEffect::new); - public static RegistryObject attachAlchemicalProficiency(RegistryObject effect, float proficiency) { - ALCHEMICAL_PROFICIENCY_MAP.put(effect.getId(), proficiency); - return effect; - } - @SubscribeEvent public static void addPotionRecipes(FMLCommonSetupEvent event) { PotionBrewing.addMix(Potions.WATER, ItemRegistry.ROTTING_ESSENCE.get(), Potions.MUNDANE); diff --git a/src/main/java/com/sammy/malum/registry/common/PacketRegistry.java b/src/main/java/com/sammy/malum/registry/common/PacketRegistry.java index 56679f593..af295d55b 100644 --- a/src/main/java/com/sammy/malum/registry/common/PacketRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/PacketRegistry.java @@ -2,6 +2,7 @@ import com.sammy.malum.MalumMod; import com.sammy.malum.common.packets.*; +import com.sammy.malum.common.packets.malignant_conversion.*; import com.sammy.malum.common.packets.particle.curiosities.blight.BlightMistParticlePacket; import com.sammy.malum.common.packets.particle.curiosities.blight.BlightTransformItemParticlePacket; import com.sammy.malum.common.packets.particle.curiosities.rite.*; @@ -27,6 +28,7 @@ public static void registerNetworkStuff(FMLCommonSetupEvent event) { //functionality VoidRejectionPacket.register(MALUM_CHANNEL, index++); SyncStaffCooldownChangesPacket.register(MALUM_CHANNEL, index++); + SyncMalignantConversionPacket.register(MALUM_CHANNEL, index++); ParticleEffectPacket.register(MALUM_CHANNEL, index++); diff --git a/src/main/java/com/sammy/malum/registry/common/ParticleEffectTypeRegistry.java b/src/main/java/com/sammy/malum/registry/common/ParticleEffectTypeRegistry.java index bff6775a5..0382b52d7 100644 --- a/src/main/java/com/sammy/malum/registry/common/ParticleEffectTypeRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/ParticleEffectTypeRegistry.java @@ -9,6 +9,7 @@ import com.sammy.malum.visual_effects.networked.nitrate.*; import com.sammy.malum.visual_effects.networked.pylon.*; import com.sammy.malum.visual_effects.networked.ritual.*; +import com.sammy.malum.visual_effects.networked.slash.*; import com.sammy.malum.visual_effects.networked.spirit_mote.*; import com.sammy.malum.visual_effects.networked.staff.*; import com.sammy.malum.visual_effects.networked.totem.*; @@ -47,6 +48,13 @@ public class ParticleEffectTypeRegistry { public static final ParticleEffectType RITUAL_PLINTH_CHANGES_TIER = new RitualPlinthChangeTierParticleEffect("ritual_plinth_changes_tier"); public static final ParticleEffectType RITUAL_PLINTH_FAILURE = new RitualPlinthFailureParticleEffect("ritual_plinth_failure"); + //Slash Effects + public static final ParticleEffectType SCYTHE_SLASH = new SlashAttackParticleEffect("scythe_slash"); + public static final ParticleEffectType TYRVING_SLASH = new TyrvingSlashParticleEffect("tyrving_slash"); + public static final ParticleEffectType WEIGHT_OF_WORLDS_CRIT = new WeightOfWorldsCritParticleEffect("weight_of_worlds_crit"); + public static final ParticleEffectType EDGE_OF_DELIVERANCE_CRIT = new EdgeOfDeliveranceCritParticleEffect("weight_of_worlds_crit"); + public static final ParticleEffectType HIDDEN_BLADE_COUNTER_FLURRY = new HiddenBladeCounterParticleEffect("hidden_blade_counter_flurry"); + //Wand public static final ParticleEffectType HEX_BOLT_IMPACT = new HexBoltImpactParticleEffect("hex_bolt_impact"); public static final ParticleEffectType DRAINING_BOLT_IMPACT = new DrainingBoltImpactParticleEffect("draining_bolt_impact"); diff --git a/src/main/java/com/sammy/malum/registry/common/SoundRegistry.java b/src/main/java/com/sammy/malum/registry/common/SoundRegistry.java index 780386e54..08c92c9de 100644 --- a/src/main/java/com/sammy/malum/registry/common/SoundRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/SoundRegistry.java @@ -52,8 +52,17 @@ public class SoundRegistry { public static final RegistryObject SPIRIT_PICKUP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_picked_up"))); public static final RegistryObject SOUL_SHATTER = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("a_soul_shatters"))); + public static final RegistryObject SCYTHE_SWEEP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("scythe_sweeps"))); public static final RegistryObject SCYTHE_CUT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("scythe_cuts"))); - public static final RegistryObject WEIGHT_OF_WORLDS_SLASH = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("weight_of_worlds_slashes"))); + public static final RegistryObject EDGE_OF_DELIVERANCE_SWEEP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("edge_of_deliverance_sweeps"))); + public static final RegistryObject EDGE_OF_DELIVERANCE_CUT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("edge_of_deliverance_cuts"))); + + public static final RegistryObject SCYTHE_THROW = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("scythe_thrown"))); + public static final RegistryObject SCYTHE_SPINS = register(SoundEvent.createFixedRangeEvent(MalumMod.malumPath("scythe_spins_happily"), 24f)); + public static final RegistryObject SCYTHE_CATCH = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("scythe_caught"))); + + public static final RegistryObject TYRVING_SLASH = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("tyrving_slashes_twice"))); + public static final RegistryObject WEIGHT_OF_WORLDS_CUT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("weight_of_worlds_cuts"))); public static final RegistryObject STAFF_FIRES = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("staff_fires"))); public static final RegistryObject STAFF_POWERS_UP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("staff_powers_up"))); @@ -63,9 +72,10 @@ public class SoundRegistry { public static final RegistryObject AURIC_FLAME_MOTIF = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("auric_flame_motif"))); public static final RegistryObject DRAINING_MOTIF = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("draining_motif"))); + public static final RegistryObject MALIGNANT_METAL_MOTIF = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("malignant_metal_motif"))); - public static final RegistryObject ALTAR_CRAFT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_altar_completes_infusion"))); public static final RegistryObject ALTAR_LOOP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_altar_infuses"))); + public static final RegistryObject ALTAR_CRAFT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_altar_completes_infusion"))); public static final RegistryObject ALTAR_CONSUME = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_altar_absorbs_item"))); public static final RegistryObject ALTAR_SPEED_UP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_altar_speeds_up"))); @@ -86,10 +96,14 @@ public class SoundRegistry { public static final RegistryObject TOTEM_CANCELLED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_rite_cancelled"))); public static final RegistryObject TOTEM_ENGRAVE = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_engraved"))); - public static final RegistryObject CRUCIBLE_CRAFT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_crucible_completes_focusing"))); public static final RegistryObject CRUCIBLE_LOOP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_crucible_focuses"))); + public static final RegistryObject CRUCIBLE_CRAFT = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_crucible_completes_focusing"))); public static final RegistryObject IMPETUS_CRACK = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("impetus_takes_damage"))); + public static final RegistryObject REPAIR_PYLON_LOOP = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("repair_pylon_eagerly_hums"))); + public static final RegistryObject REPAIR_PYLON_REPAIR_START = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("repair_pylon_begins_repairing"))); + public static final RegistryObject REPAIR_PYLON_REPAIR_FINISH = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("repair_pylon_finishes_repairing"))); + public static final RegistryObject ALTERATION_PLINTH_ALTERS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("alteration_plinth_alters"))); public static final RegistryObject UNCANNY_VALLEY = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("the_unknown_weeps"))); @@ -100,16 +114,19 @@ public class SoundRegistry { public static final RegistryObject VOID_EATS_GUNK = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("void_eats_gunk"))); public static final RegistryObject AERIAL_FALL = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("aerial_magic_swooshes"))); - public static final RegistryObject VOID_SLASH = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("void_slash_swooshes"))); public static final RegistryObject CONCENTRATED_GLUTTONY_DRINK = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("concentrated_gluttony_drink"))); - public static final RegistryObject HIDDEN_BLADE_STRIKES = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hidden_blade_strikes"))); - public static final RegistryObject MALIGNANT_METAL_RESONATES = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("malignant_metal_resonates"))); + public static final RegistryObject HIDDEN_BLADE_CHARGED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hidden_blade_charged"))); + public static final RegistryObject HIDDEN_BLADE_PRIMED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hidden_blade_primed"))); + public static final RegistryObject HIDDEN_BLADE_DISRUPTED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hidden_blade_disrupted"))); + public static final RegistryObject HIDDEN_BLADE_UNLEASHED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hidden_blade_unleashed"))); public static final RegistryObject HUNGRY_BELT_FEEDS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("hungry_belt_feeds"))); public static final RegistryObject VORACIOUS_RING_FEEDS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("voracious_ring_feeds"))); public static final RegistryObject GRUESOME_RING_FEEDS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("gruesome_ring_feeds"))); public static final RegistryObject FLESH_RING_ABSORBS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("flesh_ring_absorbs"))); + public static final RegistryObject ECHOING_RING_ABSORBS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("echoing_ring_absorbs"))); + public static final RegistryObject SPIRIT_MOTE_CREATED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("spirit_mote_created"))); public static final RegistryObject CATALYST_LOBBER_UNLOCKED = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("catalyst_lobber_unlocked"))); @@ -241,8 +258,8 @@ public class SoundRegistry { public static final RegistryObject ETHER_PLACE = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("ether_place"))); public static final RegistryObject ETHER_BREAK = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("ether_break"))); - public static final RegistryObject THE_DEEP_BECKONS = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("the_deep_beckons"))); - public static final RegistryObject THE_HEAVENS_SIGN = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("the_heavens_sing"))); + public static final RegistryObject THE_DEEP_BECKONS = register(SoundEvent.createFixedRangeEvent(MalumMod.malumPath("the_deep_beckons"), 32f)); + public static final RegistryObject THE_HEAVENS_SIGN = register(SoundEvent.createFixedRangeEvent(MalumMod.malumPath("the_heavens_sing"), 32f)); public static final RegistryObject ARCANE_ELEGY = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("arcane_elegy"))); public static final RegistryObject AESTHETICA = register(SoundEvent.createVariableRangeEvent(MalumMod.malumPath("aesthetica"))); diff --git a/src/main/java/com/sammy/malum/registry/common/entity/EntityRegistry.java b/src/main/java/com/sammy/malum/registry/common/entity/EntityRegistry.java index 190e07c37..7a6c051d2 100644 --- a/src/main/java/com/sammy/malum/registry/common/entity/EntityRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/entity/EntityRegistry.java @@ -7,12 +7,13 @@ import com.sammy.malum.common.entity.activator.*; import com.sammy.malum.common.entity.bolt.*; import com.sammy.malum.common.entity.boomerang.ScytheBoomerangEntity; +import com.sammy.malum.common.entity.hidden_blade.*; import com.sammy.malum.common.entity.nitrate.EthericNitrateEntity; import com.sammy.malum.common.entity.nitrate.VividNitrateEntity; import com.sammy.malum.common.entity.spirit.SpiritItemEntity; import com.sammy.malum.common.entity.thrown.*; import com.sammy.malum.registry.common.item.ItemRegistry; -import net.minecraft.client.renderer.entity.EntityRenderers; +import net.minecraft.client.renderer.entity.*; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraftforge.api.distmarker.Dist; @@ -55,6 +56,10 @@ public class EntityRegistry { () -> EntityType.Builder.of((e, w) -> new SpiritCollectionActivatorEntity(w), MobCategory.MISC).sized(1f, 1f).clientTrackingRange(10) .build(MalumMod.malumPath("pneuma_void").toString())); + public static final RegistryObject> HIDDEN_BLADE_DELAYED_IMPACT = ENTITY_TYPES.register("hidden_blade_delayed_impact", + () -> EntityType.Builder.of((e, w) -> new HiddenBladeDelayedImpactEntity(w), MobCategory.MISC).sized(8F, 8F).clientTrackingRange(10) + .build(MalumMod.malumPath("hidden_blade_delayed_impact").toString())); + public static final RegistryObject> THROWN_GLUTTONY = ENTITY_TYPES.register("thrown_gluttony", () -> EntityType.Builder.of((e, w) -> new ThrownConcentratedGluttony(w), MobCategory.MISC).sized(0.25f, 0.25f).clientTrackingRange(10) .build(MalumMod.malumPath("thrown_gluttony").toString())); @@ -84,6 +89,7 @@ public static void bindEntityRenderers(EntityRenderersEvent.RegisterRenderers ev EntityRenderers.register(EntityRegistry.VIVID_NITRATE.get(), VividNitrateEntityRenderer::new); EntityRenderers.register(EntityRegistry.SPIRIT_COLLECTION_ACTIVATOR.get(), SpiritCollectionActivatorEntityRenderer::new); + EntityRenderers.register(EntityRegistry.HIDDEN_BLADE_DELAYED_IMPACT.get(), NoopRenderer::new); EntityRenderers.register(EntityRegistry.THROWN_GLUTTONY.get(), ThrownConcentratedGluttonyRenderer::new); diff --git a/src/main/java/com/sammy/malum/registry/common/item/ItemRegistry.java b/src/main/java/com/sammy/malum/registry/common/item/ItemRegistry.java index dd82773eb..f5cfde88e 100644 --- a/src/main/java/com/sammy/malum/registry/common/item/ItemRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/item/ItemRegistry.java @@ -633,11 +633,12 @@ public static RegistryObject register(String name, Item.Prop public static final RegistryObject MALIGNANT_STRONGHOLD_LEGGINGS = register("malignant_stronghold_leggings", GEAR_PROPERTIES(), (p) -> new MalignantStrongholdArmorItem(ArmorItem.Type.LEGGINGS, p)); public static final RegistryObject MALIGNANT_STRONGHOLD_BOOTS = register("malignant_stronghold_boots", GEAR_PROPERTIES(), (p) -> new MalignantStrongholdArmorItem(ArmorItem.Type.BOOTS, p)); - public static final RegistryObject WEIGHT_OF_WORLDS = register("weight_of_worlds", GEAR_PROPERTIES(), (p) -> new WeightOfWorldsItem(ItemTiers.ItemTierEnum.MALIGNANT_ALLOY, -1, -0.1f, p)); - public static final RegistryObject EROSION_SCEPTER = register("erosion_scepter", GEAR_PROPERTIES(), (p) -> new ErosionScepterItem(MALIGNANT_ALLOY, 5, p)); + public static final RegistryObject WEIGHT_OF_WORLDS = register("weight_of_worlds", GEAR_PROPERTIES(), (p) -> new WeightOfWorldsItem(ItemTiers.ItemTierEnum.MALIGNANT_ALLOY, 3, -0.2f, p)); + public static final RegistryObject EDGE_OF_DELIVERANCE = register("edge_of_deliverance", GEAR_PROPERTIES(), (p) -> new EdgeOfDeliveranceItem(ItemTiers.ItemTierEnum.MALIGNANT_ALLOY, 2, -0.2f, p)); public static final RegistryObject MNEMONIC_HEX_STAFF = register("mnemonic_hex_staff", GEAR_PROPERTIES(), (p) -> new HexStaffItem(HEX_STAFF, 5, p)); public static final RegistryObject STAFF_OF_THE_AURIC_FLAME = register("staff_of_the_auric_flame", GEAR_PROPERTIES(), (p) -> new AuricFlameStaffItem(AURIC_STAFF, 7, p)); + public static final RegistryObject EROSION_SCEPTER = register("erosion_scepter", GEAR_PROPERTIES(), (p) -> new ErosionScepterItem(MALIGNANT_ALLOY, 5, p)); public static final RegistryObject RUNE_OF_IDLE_RESTORATION = register("rune_of_idle_restoration", GEAR_PROPERTIES(), RuneIdleRestorationItem::new); @@ -679,7 +680,8 @@ public static RegistryObject register(String name, Item.Prop public static final RegistryObject RING_OF_ESOTERIC_SPOILS = register("ring_of_esoteric_spoils", GEAR_PROPERTIES(), CurioArcaneSpoilRing::new); public static final RegistryObject RING_OF_CURATIVE_TALENT = register("ring_of_curative_talent", GEAR_PROPERTIES(), CurioCurativeRing::new); - public static final RegistryObject RING_OF_ARCANE_PROWESS = register("ring_of_arcane_prowess", GEAR_PROPERTIES(), CurioRingOfProwess::new); + public static final RegistryObject RING_OF_ARCANE_PROWESS = register("ring_of_arcane_prowess", GEAR_PROPERTIES(), CurioProwessRing::new); + public static final RegistryObject RING_OF_MANAWEAVING = register("ring_of_manaweaving", GEAR_PROPERTIES(), CurioManaweavingRing::new); public static final RegistryObject RING_OF_ALCHEMICAL_MASTERY = register("ring_of_alchemical_mastery", GEAR_PROPERTIES(), CurioAlchemicalRing::new); public static final RegistryObject RING_OF_DESPERATE_VORACITY = register("ring_of_desperate_voracity", GEAR_PROPERTIES(), CurioVoraciousRing::new); public static final RegistryObject RING_OF_THE_HOARDER = register("ring_of_the_hoarder", GEAR_PROPERTIES(), CurioHoarderRing::new); @@ -695,6 +697,7 @@ public static RegistryObject register(String name, Item.Prop public static final RegistryObject BELT_OF_THE_MAGEBANE = register("belt_of_the_magebane", GEAR_PROPERTIES(), CurioMagebaneBelt::new); public static final RegistryObject RING_OF_THE_ENDLESS_WELL = register("ring_of_the_endless_well", GEAR_PROPERTIES(), CurioEndlessRing::new); + public static final RegistryObject RING_OF_ECHOING_ARCANA = register("ring_of_echoing_arcana", GEAR_PROPERTIES(), CurioEchoingArcanaRing::new); public static final RegistryObject RING_OF_GROWING_FLESH = register("ring_of_growing_flesh", GEAR_PROPERTIES(), CurioGrowingFleshRing::new); public static final RegistryObject RING_OF_GRUESOME_CONCENTRATION = register("ring_of_gruesome_concentration", GEAR_PROPERTIES(), CurioGruesomeConcentrationRing::new); public static final RegistryObject NECKLACE_OF_THE_HIDDEN_BLADE = register("necklace_of_the_hidden_blade", GEAR_PROPERTIES(), CurioHiddenBladeNecklace::new); diff --git a/src/main/java/com/sammy/malum/registry/common/item/ItemTagRegistry.java b/src/main/java/com/sammy/malum/registry/common/item/ItemTagRegistry.java index 5776fe658..167036ed2 100644 --- a/src/main/java/com/sammy/malum/registry/common/item/ItemTagRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/item/ItemTagRegistry.java @@ -11,6 +11,9 @@ public class ItemTagRegistry { public static final TagKey SCYTHE = malumTag("scythe"); public static final TagKey STAFF = malumTag("staff"); + public static final TagKey SPIRITS = malumTag("spirit"); + public static final TagKey ASPECTED_SPIRITS = malumTag("aspected_spirits"); + public static final TagKey RUNEWOOD_BOARD_INGREDIENT = malumTag("runewood_board_ingredient"); public static final TagKey RUNEWOOD_LOGS = malumTag("runewood_logs"); public static final TagKey RUNEWOOD_PLANKS = malumTag("runewood_planks"); diff --git a/src/main/java/com/sammy/malum/registry/common/item/tabs/CreativeTabRegistry.java b/src/main/java/com/sammy/malum/registry/common/item/tabs/CreativeTabRegistry.java index 14f964865..0601575fe 100644 --- a/src/main/java/com/sammy/malum/registry/common/item/tabs/CreativeTabRegistry.java +++ b/src/main/java/com/sammy/malum/registry/common/item/tabs/CreativeTabRegistry.java @@ -75,7 +75,6 @@ public class CreativeTabRegistry { .icon(() -> ItemRegistry.WEAVERS_WORKBENCH.get().getDefaultInstance()).build() ); - @SuppressWarnings("DataFlowIssue") public static void populateItemGroups(BuildCreativeModeTabContentsEvent event) { final ResourceKey tabKey = event.getTabKey(); if (TAB_SORTING.containsKey(tabKey)) { diff --git a/src/main/java/com/sammy/malum/visual_effects/RepairPylonParticleEffects.java b/src/main/java/com/sammy/malum/visual_effects/RepairPylonParticleEffects.java index 8d37bc265..8a07f01d4 100644 --- a/src/main/java/com/sammy/malum/visual_effects/RepairPylonParticleEffects.java +++ b/src/main/java/com/sammy/malum/visual_effects/RepairPylonParticleEffects.java @@ -96,9 +96,9 @@ public static void prepareRepairParticles(RepairPylonCoreBlockEntity pylon, IMal } for (int i = 0; i < 4; i++) { MalumSpiritType cyclingSpiritType = colorData.getCyclingColorRecord().spiritType(); - for (int j = 0; j < 32; j++) { - float distance = 0.8f * (1 - j / 32f); - long time = gameTime+j*3; + for (int j = 0; j < 60; j++) { + float distance = 0.8f * (1 - j / 90f); + long time = gameTime+j*4; Vec3 offsetPosition = DataHelper.rotatingRadialOffset(holderItemPos, distance, i, 4, time, 160); if (random.nextFloat() < 0.85f) { var sparkParticles = SparkParticleEffects.spiritMotionSparks(level, offsetPosition, cyclingSpiritType); @@ -168,7 +168,7 @@ public static void repairItemParticles(RepairPylonCoreBlockEntity pylon, IMalumS return; } var level = pylon.getLevel(); - repairItemParticles(level, activeSpiritType, pylon.getItemPos(), colorData); +// repairItemParticles(level, activeSpiritType, pylon.getItemPos(), colorData); repairItemParticles(level, activeSpiritType, holder.getItemPos(), colorData); } public static void repairItemParticles(Level level, MalumSpiritType activeSpiritType, Vec3 itemPos, ColorEffectData colorData) { diff --git a/src/main/java/com/sammy/malum/visual_effects/SlashParticleEffects.java b/src/main/java/com/sammy/malum/visual_effects/SlashParticleEffects.java new file mode 100644 index 000000000..a137c6649 --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/SlashParticleEffects.java @@ -0,0 +1,61 @@ +package com.sammy.malum.visual_effects; + +import com.sammy.malum.client.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.registry.client.*; +import net.minecraft.util.*; +import net.minecraft.world.level.*; +import net.minecraft.world.phys.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.easing.*; +import team.lodestar.lodestone.systems.particle.*; +import team.lodestar.lodestone.systems.particle.builder.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.color.*; +import team.lodestar.lodestone.systems.particle.render_types.*; +import team.lodestar.lodestone.systems.particle.world.options.*; + +import java.awt.*; +import java.util.function.*; + +import static com.sammy.malum.visual_effects.SpiritLightSpecs.spiritLightSpecs; + +public class SlashParticleEffects { + + public static ParticleEffectSpawner spawnSlashParticle(Level level, Vec3 pos, MalumSpiritType spiritType) { + if (spiritType == null) { + return spawnSlashParticle(level, pos); + } + return spawnSlashParticle(level, pos, o -> SpiritBasedParticleBuilder.createSpirit(o).setSpirit(spiritType)); + } + + public static ParticleEffectSpawner spawnSlashParticle(Level level, Vec3 pos) { + return spawnSlashParticle(level, pos, o -> WorldParticleBuilder.create(o).setRenderType(LodestoneWorldParticleRenderType.TRANSPARENT).setColorData(createGraySlashColor(level.random))); + } + + public static ParticleEffectSpawner spawnSlashParticle(Level level, Vec3 pos, ColorParticleData colorData) { + return spawnSlashParticle(level, pos, o -> WorldParticleBuilder.create(o).setColorData(colorData)); + } + + public static ParticleEffectSpawner spawnSlashParticle(Level level, Vec3 pos, Function builderSupplier) { + var builder = builderSupplier.apply(new WorldParticleOptions(ParticleRegistry.HEAVY_SLASH)); + return spawnSlashParticle(level, pos, builder); + } + + public static ParticleEffectSpawner spawnSlashParticle(Level level, Vec3 pos, WorldParticleBuilder builder) { + var rand = level.getRandom(); + final WorldParticleBuilder worldParticleBuilder = builder + .setScaleData(GenericParticleData.create(RandomHelper.randomBetween(rand, 1.5f, 2f)).build()) + .setTransparencyData(GenericParticleData.create(1f, 0.9f).build()) + .setSpritePicker(SimpleParticleOptions.ParticleSpritePicker.WITH_AGE) + .setLifetime(5) + .enableNoClip(); + return new ParticleEffectSpawner(level, pos, worldParticleBuilder); + } + + public static ColorParticleData createGraySlashColor(RandomSource random) { + int brightness = (int) (255 * RandomHelper.randomBetween(random, 0.6f, 1f)); + Color color = new Color(brightness, brightness, brightness); + return ColorParticleData.create(color, color.darker()).setEasing(Easing.SINE_IN_OUT).build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/visual_effects/networked/slash/EdgeOfDeliveranceCritParticleEffect.java b/src/main/java/com/sammy/malum/visual_effects/networked/slash/EdgeOfDeliveranceCritParticleEffect.java new file mode 100644 index 000000000..45316eaa7 --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/networked/slash/EdgeOfDeliveranceCritParticleEffect.java @@ -0,0 +1,51 @@ +package com.sammy.malum.visual_effects.networked.slash; + +import com.sammy.malum.client.*; +import com.sammy.malum.visual_effects.*; +import com.sammy.malum.visual_effects.networked.data.*; +import net.minecraft.nbt.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.api.distmarker.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.render_types.*; + +import java.util.function.*; + +public class EdgeOfDeliveranceCritParticleEffect extends SlashAttackParticleEffect { + + public EdgeOfDeliveranceCritParticleEffect(String id) { + super(id); + } + + @OnlyIn(Dist.CLIENT) + @Override + public Supplier get() { + return () -> (level, random, positionData, colorData, nbtData) -> { + if (!nbtData.compoundTag.contains("direction")) { + return; + } + final CompoundTag directionData = nbtData.compoundTag.getCompound("direction"); + double dirX = directionData.getDouble("x"); + double dirY = directionData.getDouble("y"); + double dirZ = directionData.getDouble("z"); + Vec3 direction = new Vec3(dirX, dirY, dirZ); + float angle = nbtData.compoundTag.getFloat("angle"); + boolean mirror = nbtData.compoundTag.getBoolean("mirror"); + var spirit = getSpiritType(nbtData); + + float spinOffset = angle + RandomHelper.randomBetween(random, -0.5f, 0.5f) + (mirror ? 3.14f : 0); + for (int i = 0; i < 4; i++) { + var slash = SlashParticleEffects.spawnSlashParticle(level, positionData.getAsVector(), spirit); + slash.getBuilder() + .setSpinData(SpinParticleData.create(0).setSpinOffset(spinOffset).build()) + .setScaleData(GenericParticleData.create(RandomHelper.randomBetween(random, 1.5f, 2f)).build()) + .setMotion(direction.scale(RandomHelper.randomBetween(random, 0.6f, 0.8f))) + .setLifetime(3) + .setBehavior(new PointyDirectionalBehaviorComponent(direction)); + slash.spawnParticles(); + } + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/visual_effects/networked/slash/HiddenBladeCounterParticleEffect.java b/src/main/java/com/sammy/malum/visual_effects/networked/slash/HiddenBladeCounterParticleEffect.java new file mode 100644 index 000000000..2f0f916aa --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/networked/slash/HiddenBladeCounterParticleEffect.java @@ -0,0 +1,65 @@ +package com.sammy.malum.visual_effects.networked.slash; + +import com.sammy.malum.client.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.visual_effects.*; +import com.sammy.malum.visual_effects.networked.*; +import com.sammy.malum.visual_effects.networked.data.*; +import net.minecraft.nbt.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.api.distmarker.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.render_types.*; + +import java.util.function.*; + +public class HiddenBladeCounterParticleEffect extends SlashAttackParticleEffect { + + public HiddenBladeCounterParticleEffect(String id) { + super(id); + } + + @OnlyIn(Dist.CLIENT) + @Override + public Supplier get() { + return () -> (level, random, positionData, colorData, nbtData) -> { + if (!nbtData.compoundTag.contains("direction")) { + return; + } + final CompoundTag directionData = nbtData.compoundTag.getCompound("direction"); + double dirX = directionData.getDouble("x"); + double dirY = directionData.getDouble("y"); + double dirZ = directionData.getDouble("z"); + Vec3 direction = new Vec3(dirX, dirY, dirZ); + float angle = nbtData.compoundTag.getFloat("angle"); + boolean mirror = nbtData.compoundTag.getBoolean("mirror"); + var spirit = getSpiritType(nbtData); + + final float maxBackwardsOffset = 1.5f; + final float maxForwardsOffset = 4.5f; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 100; j++) { + float offsetBase = RandomHelper.randomBetween(random, 0.314f, 3.14f) * (random.nextBoolean() ? 1 : -1) + (mirror ? 3.14f : 0); + float spinOffset = angle + (j % 2 == 0 ? 1 : -1) * offsetBase; + float scale = RandomHelper.randomBetween(random, 2f, 6f); + int lifeDelay = (j % 2 == 0 ? 2 : 0) + i + j / 6; + var position = positionData.getAsVector().add(direction.multiply( + RandomHelper.randomBetween(random, -maxBackwardsOffset, maxForwardsOffset), + RandomHelper.randomBetween(random, -maxBackwardsOffset, maxForwardsOffset), + RandomHelper.randomBetween(random, -maxBackwardsOffset, maxForwardsOffset))); + var slash = SlashParticleEffects.spawnSlashParticle(level, position, spirit); + slash.getBuilder() + .setSpinData(SpinParticleData.create(0).setSpinOffset(spinOffset).build()) + .setScaleData(GenericParticleData.create(scale).build()) + .setMotion(direction.scale(RandomHelper.randomBetween(random, 0.3f, 0.5f))) + .setLifeDelay(lifeDelay) + .setLifetime(2+i) + .setBehavior(new PointyDirectionalBehaviorComponent(direction)); + slash.spawnParticles(); + } + } + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/visual_effects/networked/slash/SlashAttackParticleEffect.java b/src/main/java/com/sammy/malum/visual_effects/networked/slash/SlashAttackParticleEffect.java new file mode 100644 index 000000000..891d15125 --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/networked/slash/SlashAttackParticleEffect.java @@ -0,0 +1,73 @@ +package com.sammy.malum.visual_effects.networked.slash; + +import com.sammy.malum.client.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.visual_effects.*; +import com.sammy.malum.visual_effects.networked.*; +import com.sammy.malum.visual_effects.networked.data.*; +import net.minecraft.nbt.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.api.distmarker.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.render_types.*; + +import java.util.function.*; + +public class SlashAttackParticleEffect extends ParticleEffectType { + + public SlashAttackParticleEffect(String id) { + super(id); + } + + public static NBTEffectData createData(Vec3 direction, boolean mirror, float angle) { + return createData(direction, mirror, angle, null); + } + public static NBTEffectData createData(Vec3 direction, boolean mirror, float angle, MalumSpiritType spiritType) { + CompoundTag tag = new CompoundTag(); + CompoundTag directionTag = new CompoundTag(); + directionTag.putDouble("x", direction.x); + directionTag.putDouble("y", direction.y); + directionTag.putDouble("z", direction.z); + tag.putFloat("angle", angle); + tag.putBoolean("mirror", mirror); + if (spiritType != null) { + tag.putString("spiritType", spiritType.identifier); + } + tag.put("direction", directionTag); + return new NBTEffectData(tag); + } + + @OnlyIn(Dist.CLIENT) + @Override + public Supplier get() { + return () -> (level, random, positionData, colorData, nbtData) -> { + if (!nbtData.compoundTag.contains("direction")) { + return; + } + final CompoundTag directionData = nbtData.compoundTag.getCompound("direction"); + double dirX = directionData.getDouble("x"); + double dirY = directionData.getDouble("y"); + double dirZ = directionData.getDouble("z"); + Vec3 direction = new Vec3(dirX, dirY, dirZ); + float angle = nbtData.compoundTag.getFloat("angle"); + boolean mirror = nbtData.compoundTag.getBoolean("mirror"); + var spirit = getSpiritType(nbtData); + float spinOffset = angle + RandomHelper.randomBetween(random, -0.5f, 0.5f) + (mirror ? 3.14f : 0); + + var slash = SlashParticleEffects.spawnSlashParticle(level, positionData.getAsVector(), spirit); + slash.getBuilder() + .setSpinData(SpinParticleData.create(0).setSpinOffset(spinOffset).build()) + .setScaleData(GenericParticleData.create(RandomHelper.randomBetween(random, 2f, 3f)).build()) + .setMotion(direction.scale(RandomHelper.randomBetween(random, 0.3f, 0.4f))) + .setBehavior(new PointyDirectionalBehaviorComponent(direction)); + slash.spawnParticles(); + }; + } + + public MalumSpiritType getSpiritType(NBTEffectData data) { + return SpiritTypeRegistry.SPIRITS.get(data.compoundTag.getString("spiritType")); + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/visual_effects/networked/slash/TyrvingSlashParticleEffect.java b/src/main/java/com/sammy/malum/visual_effects/networked/slash/TyrvingSlashParticleEffect.java new file mode 100644 index 000000000..6a65dca23 --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/networked/slash/TyrvingSlashParticleEffect.java @@ -0,0 +1,55 @@ +package com.sammy.malum.visual_effects.networked.slash; + +import com.sammy.malum.client.*; +import com.sammy.malum.core.systems.spirit.*; +import com.sammy.malum.registry.common.*; +import com.sammy.malum.visual_effects.*; +import com.sammy.malum.visual_effects.networked.*; +import net.minecraft.nbt.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.api.distmarker.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.render_types.*; + +import java.util.function.*; + +public class TyrvingSlashParticleEffect extends SlashAttackParticleEffect { + + public TyrvingSlashParticleEffect(String id) { + super(id); + } + + @OnlyIn(Dist.CLIENT) + @Override + public Supplier get() { + return () -> (level, random, positionData, colorData, nbtData) -> { + if (!nbtData.compoundTag.contains("direction")) { + return; + } + final CompoundTag directionData = nbtData.compoundTag.getCompound("direction"); + double dirX = directionData.getDouble("x"); + double dirY = directionData.getDouble("y"); + double dirZ = directionData.getDouble("z"); + Vec3 direction = new Vec3(dirX, dirY, dirZ); + float angle = nbtData.compoundTag.getFloat("angle"); + boolean mirror = nbtData.compoundTag.getBoolean("mirror"); + var spirit = getSpiritType(nbtData); + + float offsetBase = RandomHelper.randomBetween(random, 0.4f, 0.8f) * (random.nextBoolean() ? 1 : -1) + (mirror ? 3.14f : 0); + for (int i = 0; i < 4; i++) { + var slash = SlashParticleEffects.spawnSlashParticle(level, positionData.getAsVector(), spirit); + float spinOffset = angle + (i % 2 == 0 ? 1 : -1) * offsetBase; + int lifeDelay = (i % 2 == 0 ? 3 : 0); + slash.getBuilder() + .setSpinData(SpinParticleData.create(0).setSpinOffset(spinOffset).build()) + .setScaleData(GenericParticleData.create(RandomHelper.randomBetween(random, 1f, 2f)).build()) + .setMotion(direction.scale(RandomHelper.randomBetween(random, 0.5f, 0.7f))) + .setLifeDelay(lifeDelay) + .setBehavior(new PointyDirectionalBehaviorComponent(direction)); + slash.spawnParticles(); + } + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/sammy/malum/visual_effects/networked/slash/WeightOfWorldsCritParticleEffect.java b/src/main/java/com/sammy/malum/visual_effects/networked/slash/WeightOfWorldsCritParticleEffect.java new file mode 100644 index 000000000..64cc1419c --- /dev/null +++ b/src/main/java/com/sammy/malum/visual_effects/networked/slash/WeightOfWorldsCritParticleEffect.java @@ -0,0 +1,54 @@ +package com.sammy.malum.visual_effects.networked.slash; + +import com.sammy.malum.client.*; +import com.sammy.malum.visual_effects.*; +import com.sammy.malum.visual_effects.networked.*; +import com.sammy.malum.visual_effects.networked.data.*; +import net.minecraft.nbt.*; +import net.minecraft.world.phys.*; +import net.minecraftforge.api.distmarker.*; +import team.lodestar.lodestone.helpers.*; +import team.lodestar.lodestone.systems.particle.data.*; +import team.lodestar.lodestone.systems.particle.data.spin.*; +import team.lodestar.lodestone.systems.particle.render_types.*; + +import java.util.function.*; + +public class WeightOfWorldsCritParticleEffect extends SlashAttackParticleEffect { + + public WeightOfWorldsCritParticleEffect(String id) { + super(id); + } + + @OnlyIn(Dist.CLIENT) + @Override + public Supplier get() { + return () -> (level, random, positionData, colorData, nbtData) -> { + if (!nbtData.compoundTag.contains("direction")) { + return; + } + final CompoundTag directionData = nbtData.compoundTag.getCompound("direction"); + double dirX = directionData.getDouble("x"); + double dirY = directionData.getDouble("y"); + double dirZ = directionData.getDouble("z"); + Vec3 direction = new Vec3(dirX, dirY, dirZ); + float angle = nbtData.compoundTag.getFloat("angle"); + boolean mirror = nbtData.compoundTag.getBoolean("mirror"); + var spirit = getSpiritType(nbtData); + + float spinOffset = 0; + for (int i = 0; i < 8; i++) { + if (i % 2 == 0) { + spinOffset = angle + RandomHelper.randomBetween(random, -0.5f, 0.5f) + (mirror ? 3.14f : 0); + } + var slash = SlashParticleEffects.spawnSlashParticle(level, positionData.getAsVector(), spirit); + slash.getBuilder() + .setSpinData(SpinParticleData.create(0).setSpinOffset(spinOffset).build()) + .setScaleData(GenericParticleData.create(RandomHelper.randomBetween(random, 3f, 4f)).build()) + .setMotion(direction.scale(RandomHelper.randomBetween(random, 0.3f, 0.4f))) + .setBehavior(new PointyDirectionalBehaviorComponent(direction)); + slash.spawnParticles(); + } + }; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index f02a1bc08..07d3572c4 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -154,4 +154,8 @@ public net.minecraft.client.gui.Font$StringRenderOutput public net.minecraft.client.gui.Font m_92719_(I)I # adjustColor -public net.minecraft.client.gui.Font f_92712_ # SHADOW_OFFSET \ No newline at end of file +public net.minecraft.client.gui.Font f_92712_ # SHADOW_OFFSET + +public net.minecraft.client.renderer.RenderType$CompositeState$CompositeStateBuilder ()V + +public net.minecraft.client.renderer.RenderType$CompositeState$CompositeStateBuilder ()V # CompositeStateBuilder \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index ad2e253b8..6278734a6 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,12 +1,14 @@ modLoader="javafml" loaderVersion="${loaderVersionRange}" license="${modLicense}" + [[mods]] modId="malum" version="${modVersion}" displayName="${modName}" authors="${modAuthors}" description='''${modDescription}''' + [[dependencies.malum]] modId="forge" mandatory=true @@ -22,7 +24,7 @@ side="BOTH" [[dependencies.malum]] modId = "lodestone" mandatory = true -versionRange = "[1.20.1-1.6.1,)" +versionRange = "[1.20.1-1.6.3,)" ordering = "NONE" side = "BOTH" [[dependencies.malum]] @@ -31,6 +33,7 @@ mandatory = true versionRange = "[5.7.0,)" ordering = "NONE" side = "BOTH" + [[dependencies.malum]] modId="fusion" mandatory=false diff --git a/src/main/resources/assets/malum/lang/zh_cn.json b/src/main/resources/assets/malum/lang/zh_cn.json index 9844e0017..d6f2c697e 100644 --- a/src/main/resources/assets/malum/lang/zh_cn.json +++ b/src/main/resources/assets/malum/lang/zh_cn.json @@ -1,12 +1,20 @@ { "attribute.name.malum.arcane_resonance": "奥术谐振", + "attribute.name.malum.arcane_resonance.desc": "收集到精魂时所触发效果的额外强度", "attribute.name.malum.malignant_conversion": "恶念转化", + "attribute.name.malum.malignant_conversion.desc": "百分比转化率,能将部分魔法属性转换为护甲值、盔甲韧性,以及魔法抗性", "attribute.name.malum.reserve_staff_charges": "法杖暂存弹数", + "attribute.name.malum.reserve_staff_charges.desc": "法杖的额外弹数,会随时间恢复,施法时消耗", "attribute.name.malum.scythe_proficiency": "镰刀熟练度", + "attribute.name.malum.scythe_proficiency.desc": "镰刀的伤害倍率", "attribute.name.malum.soul_ward_capacity": "灵魂护盾容量", + "attribute.name.malum.soul_ward_capacity.desc": "灵魂护盾的容量", + "attribute.name.malum.soul_ward_integrity": "灵魂护盾稳固度", + "attribute.name.malum.soul_ward_integrity.desc": "百分比增量,能提升灵魂护盾的耐久度", "attribute.name.malum.soul_ward_recovery_rate": "灵魂护盾恢复速率", - "attribute.name.malum.soul_ward_strength": "灵魂护盾效力", + "attribute.name.malum.soul_ward_recovery_rate.desc": "百分比增量,能提升灵魂护盾的恢复速率", "attribute.name.malum.spirit_spoils": "精魂掠夺", + "attribute.name.malum.spirit_spoils.desc": "固定值增量,能增加击杀敌人所获得的精魂数", "block.malum.aerial_spirited_glass": "澄空融魂玻璃", "block.malum.aqueous_spirited_glass": "碧水融魂玻璃", "block.malum.arcane_spirited_glass": "奥术融魂玻璃", @@ -300,7 +308,9 @@ "effect.malum.aethers_charm.description": "澄空召唤着你,增加跳跃高度并减轻重力影响。", "effect.malum.anglers_lure": "渔夫之诱", "effect.malum.anglers_lure.description": "让我所见所有鱼类明白恐惧的真正含义;因我是死亡的预兆。抛竿入海底深渊,我的鱼竿坚若磐石,是水下的灾祸。一人为无情世界所诟骂,而终在海洋中寻得慰藉。我唯一的朋友,鱼钩上的蚯蚓,蠕动而奋力攀过贫瘠世界的虚无。我独自一人。我内心空虚。但是,我在这,在钓鱼。", + "effect.malum.arcane_reverberation": "奥术回响", "effect.malum.cancerous_growth": "瘤态增生", + "effect.malum.cancerous_growth.description": "不受控制的增生让你更有胆量,增加最大生命值。", "effect.malum.earthen_might": "大地之威", "effect.malum.earthen_might.description": "大地加固了你的拳头和工具,增加整体伤害。", "effect.malum.gaias_bulwark": "盖亚之护", @@ -308,8 +318,10 @@ "effect.malum.gluttony": "暴食", "effect.malum.gluttony.description": "你通过吞食弱者而变强,增加镰刀熟练度并能逐渐恢复饥饿值。", "effect.malum.grim_certainty": "诡秘之必然", + "effect.malum.grim_certainty.description": "宙界重斧不停地振荡,它的下一击必定能造成暴击。", "effect.malum.ifrits_embrace": "火灵之拥", "effect.malum.ifrits_embrace.description": "火焰的温暖拥怀包裹了你的灵魂,治愈你灼伤的疤痕。", + "effect.malum.imminent_deliverance": "挽魂将临", "effect.malum.miners_rage": "矿工之怒", "effect.malum.miners_rage.description": "光耀加固了你的工具,提升挖掘速度与攻击速度。", "effect.malum.poseidons_grasp": "海神之握", @@ -318,7 +330,9 @@ "effect.malum.rejected": "受拒", "effect.malum.sacrificial_empowerment": "献祭权能", "effect.malum.silenced": "静默", + "effect.malum.silenced.description": "你遭到了静默,魔法能力被完全压制。", "effect.malum.wicked_intent": "邪恶意图", + "effect.malum.wicked_intent.description": "你为有力反击对手而整装待发,增加单次挥砍的镰刀熟练度。", "effect.malum.zephyrs_courage": "西风之勇", "effect.malum.zephyrs_courage.description": "西风推动着你前进,提升移动速度。", "enchantment.malum.haunted": "缚灵", @@ -332,6 +346,7 @@ "entity.malum.draining_bolt": "侵蚀能量束", "entity.malum.etheric_nitrate": "灵火硝石", "entity.malum.hex_bolt": "咒术束", + "entity.malum.hidden_blade_delayed_impact": "隐藏锋刃延迟打击", "entity.malum.natural_spirit": "天然精魂", "entity.malum.pneuma_void": "魂息虚空", "entity.malum.runewood_boat": "符文木船", @@ -367,6 +382,7 @@ "item.malum.cluster_of_brilliance": "经验晶簇", "item.malum.coal_fragment": "煤炭碎块", "item.malum.complete_design": "完整构造件", + "item.malum.catalyst_lobber": "促焰投具", "item.malum.concentrated_gluttony": "暴食聚液", "item.malum.copper_impetus": "铜促符", "item.malum.copper_node": "铜结点", @@ -394,13 +410,13 @@ "item.malum.cursed_sapball": "诅咒树脂球", "item.malum.dreaded_weave": "恐惧织物", "item.malum.earthen_spirit": "大地精魂", + "item.malum.edge_of_deliverance": "挽魂锋镰", "item.malum.elaborate_brooch": "精致胸针", "item.malum.eldritch_spirit": "邪术精魂", "item.malum.encyclopedia_arcana": "奥术全典", "item.malum.encyclopedia_esoterica": "奥秘全典", "item.malum.erosion_scepter": "侵蚀权杖", "item.malum.esoteric_spool": "隐秘线轴", - "item.malum.etheric_nitrate": "灵火硝石", "item.malum.filled_spirit_jar": "装有精魂的精魂罐", "item.malum.fused_consciousness": "融合意识", "item.malum.gilded_belt": "镀金腰带", @@ -437,6 +453,8 @@ "item.malum.mnemonic_hex_staff": "忆念咒术法杖", "item.malum.music_disc_aesthetica": "音乐唱片", "item.malum.music_disc_aesthetica.desc": "Kultik - Aesthetica", + "item.malum.music_disc_arcane_elegy": "音乐唱片", + "item.malum.music_disc_arcane_elegy.desc": "Kultik - Arcane Elegy", "item.malum.natural_quartz": "天然石英", "item.malum.necklace_of_blissful_harmony": "福乐和谐项链", "item.malum.necklace_of_the_hidden_blade": "隐藏锋刃项链", @@ -459,9 +477,11 @@ "item.malum.ring_of_arcane_prowess": "奥术才智戒指", "item.malum.ring_of_curative_talent": "疗愈魔能戒指", "item.malum.ring_of_desperate_voracity": "渴求贪食戒指", + "item.malum.ring_of_echoing_arcana": "奥能回响戒指", "item.malum.ring_of_esoteric_spoils": "隐秘掠夺戒指", "item.malum.ring_of_growing_flesh": "增生血肉戒指", "item.malum.ring_of_gruesome_concentration": "可厌聚集戒指", + "item.malum.ring_of_manaweaving": "织魔戒指", "item.malum.ring_of_the_demolitionist": "爆破师戒指", "item.malum.ring_of_the_endless_well": "无底渊井戒指", "item.malum.ring_of_the_hoarder": "囤积者戒指", @@ -538,7 +558,6 @@ "item.malum.umbral_spirit": "幽影精魂", "item.malum.uranium_impetus": "铀促符", "item.malum.uranium_node": "铀结点", - "item.malum.vivid_nitrate": "耀艳硝石", "item.malum.void_salts": "虚空盐", "item.malum.void_tablet": "虚空石符板", "item.malum.warp_flux": "扭曲能流", @@ -604,6 +623,7 @@ "malum.gui.curio.effect.hunger_drain": "持续消耗饥饿值", "malum.gui.curio.effect.low_health_speed": "低生命值时提升速度", "malum.gui.curio.effect.no_sweep": "禁止镰刀横扫攻击", + "malum.gui.curio.effect.pacifist_recharge": "使用镰刀后冷却延长", "malum.gui.curio.effect.passive_healing": "持续恢复生命值", "malum.gui.curio.effect.rotten_gluttony": "食用腐败的食物给予暴食效果", "malum.gui.curio.effect.scythe_chain": "镰刀连续击杀时增强", @@ -613,9 +633,12 @@ "malum.gui.curio.effect.soul_ward_magic_resilience": "灵魂护盾魔法韧性", "malum.gui.curio.effect.soul_ward_physical_absorption": "灵魂护盾吸收物理和魔法伤害", "malum.gui.curio.effect.spirits_add_health": "收获精魂时给予额外生命值", + "malum.gui.curio.effect.spirits_buff_spirit_collection": "收获精魂时提升奥术谐振", "malum.gui.curio.effect.spirits_extend_effect": "收获精魂时延长药水持续时间", "malum.gui.curio.effect.spirits_gluttony": "收获精魂时给予暴食效果", "malum.gui.curio.effect.spirits_heal": "收获精魂时恢复生命值", + "malum.gui.curio.effect.spirits_weave_mana": "收获精魂时恢复灵魂护盾", + "malum.gui.curio.effect.spirits_weave_mana_irons_spellbooks": "同时恢复铁之魔法书的魔力", "malum.gui.curio.effect.spirits_xp": "收获精魂时给予经验", "malum.gui.curio.negative": "-%s", "malum.gui.curio.positive": "+%s", @@ -717,6 +740,7 @@ "malum.subtitle.arcane_charcoal_block_hit": "方块:损坏中", "malum.subtitle.arcane_charcoal_block_place": "方块:被放置", "malum.subtitle.arcane_charcoal_block_step": "脚步声", + "malum.subtitle.arcane_elegy": "Arcane elegy", "malum.subtitle.arcane_rock_break": "方块:被破坏", "malum.subtitle.arcane_rock_bricks_break": "方块:被破坏", "malum.subtitle.arcane_rock_bricks_hit": "方块:损坏中", @@ -745,6 +769,10 @@ "malum.subtitle.calcified_blight_hit": "方块:损坏中", "malum.subtitle.calcified_blight_place": "方块:被放置", "malum.subtitle.calcified_blight_step": "脚步声", + "malum.subtitle.catalyst_lobber_fired": "促焰投具:发射", + "malum.subtitle.catalyst_lobber_locked": "促焰投具:上锁", + "malum.subtitle.catalyst_lobber_primed": "促焰投具:装填", + "malum.subtitle.catalyst_lobber_unlocked": "促焰投具:解锁", "malum.subtitle.cloth_trinket_equipped": "布匹护符:装备", "malum.subtitle.completed_ritual_ambience": "Completed ritual ambience", "malum.subtitle.concentrated_gluttony_drink": "暴食聚液:被饮用", @@ -755,6 +783,9 @@ "malum.subtitle.deepslate_soulstone_place": "方块:被放置", "malum.subtitle.deepslate_soulstone_step": "脚步声", "malum.subtitle.draining_motif": "侵蚀能量束:蚕食", + "malum.subtitle.echoing_ring_absorbs": "奥能回响戒指:吸收", + "malum.subtitle.edge_of_deliverance_cuts": "挽魂锋镰:挥砍", + "malum.subtitle.edge_of_deliverance_sweeps": "挽魂锋镰:横扫", "malum.subtitle.ether_break": "方块:被破坏", "malum.subtitle.ether_place": "方块:被放置", "malum.subtitle.flesh_ring_absorbs": "增生血肉戒指:吸收", @@ -764,12 +795,14 @@ "malum.subtitle.hallowed_gold_hit": "方块:损坏中", "malum.subtitle.hallowed_gold_place": "方块:被放置", "malum.subtitle.hallowed_gold_step": "脚步声", - "malum.subtitle.hidden_blade_strikes": "隐藏镰刃:挥砍", + "malum.subtitle.hidden_blade_charged": "隐藏锋刃:充能", + "malum.subtitle.hidden_blade_disrupted": "隐藏锋刃:被干扰", + "malum.subtitle.hidden_blade_primed": "隐藏锋刃:充能完成", + "malum.subtitle.hidden_blade_unleashed": "隐藏锋刃:释能", "malum.subtitle.hungry_belt_feeds": "饥馁者腰带:喂食", "malum.subtitle.impetus_takes_damage": "促符:受损", - "malum.subtitle.malignant_metal_resonates": "恶念金属:谐振", + "malum.subtitle.malignant_metal_motif": "恶念金属:谐鸣", "malum.subtitle.metallic_trinket_equipped": "金属护符:装备", - "malum.subtitle.nitrate_thrown": "硝石:飞出", "malum.subtitle.ornate_trinket_equipped": "华丽护符:装备", "malum.subtitle.pedestal_item_inserted": "物品台:放入物品", "malum.subtitle.pedestal_item_picked_up": "物品台:取出物品", @@ -780,6 +813,9 @@ "malum.subtitle.quartz_cluster_block_place": "方块:被放置", "malum.subtitle.quartz_cluster_block_step": "脚步声", "malum.subtitle.rejected_by_the_unknown": "未知存在:拒绝", + "malum.subtitle.repair_pylon_begins_repairing": "修复基柱:开始修复", + "malum.subtitle.repair_pylon_eagerly_hums": "修复基柱:高声嗡鸣", + "malum.subtitle.repair_pylon_finishes_repairing": "修复基柱:修复完成", "malum.subtitle.ritual_absorbs_item": "Ritual absorbs item", "malum.subtitle.ritual_absorbs_spirit": "Ritual absorbs spirit", "malum.subtitle.ritual_beginning_ambience": "Ritual beginning ambience", @@ -813,7 +849,11 @@ "malum.subtitle.runewood_trapdoor_close": "符文木活板门:关闭", "malum.subtitle.runewood_trapdoor_open": "符文木活板门:打开", "malum.subtitle.runic_workbench_crafts": "符文工作台:合成", + "malum.subtitle.scythe_caught": "镰刀:被接住", "malum.subtitle.scythe_cuts": "镰刀:挥砍", + "malum.subtitle.scythe_spins_happily": "镰刀:欢快地飞旋", + "malum.subtitle.scythe_sweeps": "镰刀:横扫", + "malum.subtitle.scythe_thrown": "镰刀:抛出", "malum.subtitle.shielding_apparatus_shields": "盾御器件:防御", "malum.subtitle.song_of_the_void": "虚空之歌", "malum.subtitle.soul_stained_steel_break": "方块:被破坏", @@ -872,14 +912,14 @@ "malum.subtitle.the_void_heart_beats": "虚空:心跳声", "malum.subtitle.totem_charges": "图腾:充能", "malum.subtitle.tuning_fork_tinkers": "调谐音叉:校准", + "malum.subtitle.tyrving_slashes_twice": "提尔锋:二次挥砍", "malum.subtitle.void_eats_gunk": "虚空:吸收腐枯物质", - "malum.subtitle.void_slash_swooshes": "虚空斩击", "malum.subtitle.void_transmutation": "虚空嬗变", "malum.subtitle.void_trinket_equipped": "虚空护符:装备", "malum.subtitle.voracious_ring_feeds": "渴求贪食戒指:进食", "malum.subtitle.warping_engine_reverberates": "扭曲引擎:共振", - "malum.subtitle.weight_of_worlds_slashes": "宙界重斧:挥砍", - "tetra.improvement.malum.soul_strike.description": "使你的物品能击碎灵魂", + "malum.subtitle.weight_of_worlds_cuts": "宙界重斧:挥砍", + "tetra.improvement.malum.soul_strike.description": "制造物品所用的材料让物品能够击碎灵魂", "tetra.improvement.malum.soul_strike.name": "灵魂重击", "tetra.material.hallowed_gold": "神圣金", "tetra.material.hallowed_gold.prefix": "神圣金", @@ -903,13 +943,13 @@ "malum.gui.book.entry.page.text.introduction.1": "“世上所有的生物都有灵魂。灵 魂是意识,是形体的动力,也是 物质与魔法的交汇。形体和灵魂 代表我们的存在,灵魂之于奥法 领域,正如形体之于物理世界。”", "malum.gui.book.entry.page.text.introduction.2": "我貌似发现了某种怪异的事物: 一种迄今未有记载的魔法形式。 若是放弃学习魔法的机会,便不 能称自己为魔法师。在此手札 ——《奥术全典》之中,我会记 录我对这种力量的研究,希冀于 详尽记载所有相关知识。", "malum.gui.book.entry.page.text.introduction.3": "这一神秘学派操纵的能量似乎植 根于灵魂。更确切地说,是灵魂 的能量,是构成我们每一个人的 意愿与脉动。", - "malum.gui.book.entry.page.text.introduction.4": "到目前为止,我所描述的还只是 基础。但我发现了某种能将灵魂 的脉动分离并凝聚为物质的方式, 我称这些物质为“精魂晶体”。 这便是我研究的基石。", + "malum.gui.book.entry.page.text.introduction.4": "到目前为止,我所描述的还只是 基础。但我发现了某种方法,能 将灵魂的脉动分离出来,并凝聚 为物质;我称这些物质为“精魂 晶体”。这便是我研究的基石。", "malum.gui.book.entry.page.text.introduction.5": "被凝聚的灵魂的本质会影响晶体 的性质。每个灵魂都独一无二, 形成的晶体也种类各异。我相信 这种晶体就是研究的突破。", "malum.gui.book.entry.spirit_crystals": "精魂晶体", "malum.gui.book.entry.spirit_crystals.description": "物质与魔法", "malum.gui.book.entry.page.headline.spirit_crystals": "精魂晶体", - "malum.gui.book.entry.page.text.spirit_crystals.1": "灵魂因其难以捉摸而出名。证明 它的存在颇为困难,就连最为渊 博的神秘使都要阅读文献才能稍 有了解。这也正是精魂魔法的独 特之处。不需要藉由宏伟巨大的 构件和深奥隐秘的技艺去实际看 到灵魂。只要把它摧毁掉就够了。", + "malum.gui.book.entry.page.text.spirit_crystals.1": "灵魂因其难以捉摸而出名。证明 它的存在颇为困难,就连最为渊 博的神秘使都要阅读文献才能稍 有了解。这也正是精魂魔法的独 特之处:不需要藉由宏伟巨大的 构件和深奥隐秘的技艺去实际看 到灵魂,只要把它摧毁掉就够了。", "malum.gui.book.entry.page.text.spirit_crystals.2": "有种材料是摧毁灵魂的必需之物, 我命名为“灵魂石”。在精制之 前,它的表现相对平庸;但剥除 其中杂质之后,它似乎就……和 世界相异。凭借以其为核心的刀, 我就应该能抢在灵魂消散之前击 毁形体,同时也将灵魂击碎为能 量。", "malum.gui.book.entry.page.text.spirit_crystals.3": "正如前文所说,这些能量的某种 “频率”各不相同。若生物燃烧 发光,其灵魂则会反映那种光耀; 若生物适应力强,其灵魂也会与 其一般易适。有时,这种能量不 会表现出任何倾向性,而只余造 物本身的脉动。这种晶体仍待深 入研究学习。", @@ -937,7 +977,7 @@ "malum.gui.book.entry.brilliance": "经验晶", "malum.gui.book.entry.brilliance.description": "经验物质", "malum.gui.book.entry.page.headline.brilliance": "经验晶", - "malum.gui.book.entry.page.text.brilliance.1": "我常听到“经验晶”这一术语, 指的是其他人口中的经验。它与 灵魂的链接并不牢固,但它是灵 魂的一部分,且可收集起来并重 新利用于附魔和修复。", + "malum.gui.book.entry.page.text.brilliance.1": "我常听到“才智”这一术语,指 的是其他人口中的经验。它与灵 魂的链接并不牢固,但它是灵魂 的一部分,且可收集起来并重新 利用于附魔和修复。", "malum.gui.book.entry.page.text.brilliance.2": "大部分人不知道的是,它也能 凝聚出物理形态。我曾听过流言 称它们会从矿石中掉出来,但最 可靠的来源是灵魂消散处的小型 矿石簇,灵魂遗留的经验会刻于 岩石之上。", "malum.gui.book.entry.spirit_minerals.reexamination": "再次审视:灵魂石与经验晶", "malum.gui.book.entry.spirit_minerals.reexamination.description": "不只是奥术能量", @@ -955,8 +995,8 @@ "malum.gui.book.entry.cthonic_gold.reexamination": "再次审视:深岩珍金", "malum.gui.book.entry.cthonic_gold.reexamination.description": "旧物质的新法则", "malum.gui.book.entry.page.headline.cthonic_gold.reexamination": "再次审视:深岩珍金", - "malum.gui.book.entry.page.text.cthonic_gold.reexamination.1": "我现在知道我为何无法制成深岩 珍金了:我不理解它背后的法则。 精魂晶体融入物质并非仅有深岩 珍金一例。也许能强令精魂晶体 进入并构成物体的内部结构,由 此可造出类似的“天然”奥术能 量合金。", - "malum.gui.book.entry.page.text.cthonic_gold.reexamination.2": "我需要找到能让精魂晶体穿过固 态物质的方法;或者要在空气之 外的介质中,大致复刻精魂罐中 晶体形成的过程。这两种方法都 有可能造出深岩珍金,也许还能 造出更多东西,很多、很多新东 西。", + "malum.gui.book.entry.page.text.cthonic_gold.reexamination.1": "我现在知道我为何无法制成深岩 珍金了:我不理解它背后的法则。 精魂晶体融入物质并非仅有深岩 珍金一例。也许我能强令精魂晶 体进入并构成物体的内部结构, 由此可造出类似的“天然”奥术 能量合金。", + "malum.gui.book.entry.page.text.cthonic_gold.reexamination.2": "我需要找到能让精魂晶体穿过固 态物质的方法;或者要在空气之 外的介质中,大致复刻精魂罐中 晶体形成的过程。这两种方法都 有可能造出深岩珍金,也许还能 造出更多东西。很多、很多新东 西。", "malum.gui.book.entry.soulstone": "灵魂石", "malum.gui.book.entry.soulstone.description": "异相", @@ -981,9 +1021,9 @@ "malum.gui.book.entry.spirit_infusion": "精魂灌注", "malum.gui.book.entry.spirit_infusion.description": "奇迹造物", "malum.gui.book.entry.page.headline.spirit_infusion": "精魂灌注", - "malum.gui.book.entry.page.text.spirit_infusion.1": "通过将符文木的自然魔法作为基 底,我设计了一座用于法术研究 基础的祭坛——精魂祭坛。它是 等式的另一端,是奥术能量的用 途。只需将奥术能量融入物品, 再用这种能量影响其他灌注过程, 就是研究的起点了。", - "malum.gui.book.entry.page.text.spirit_infusion.2": "使用祭坛时,需要将被灌注的物 品置于其上,同时放入合适的奥 术能量。如果灌注中要用到其 他物品,则需将其置于某种符文 木物品台上。物品台需在祭坛四 格之内才能正常工作。", - "malum.gui.book.entry.page.text.spirit_infusion.3": "所有奥术能量就位之后,晶体内 的能量就会开始流入中央的物品 内。其他要融合的物品也会在 这一过程中被拉入其中。待所有 吸收过程结束,灌注的产物便会 成型。不过,这一过程$i确实/$相当 缓慢……", + "malum.gui.book.entry.page.text.spirit_infusion.1": "我以将符文木的自然魔法作为基 底,设计了一座用于法术研究基 础的祭坛——精魂祭坛。它是等 式的另一端,是奥术能量的用途。 只需将奥术能量融入物品,再用 这种能量影响其他灌注过程,就 是研究的起点了。", + "malum.gui.book.entry.page.text.spirit_infusion.2": "使用祭坛时,需要将被灌注的物 品置于其上,同时放入合适的奥 术能量。如果灌注中要用到其他 物品,则需将其置于某种符文木 物品台上。物品台需在祭坛四格 之内才能正常工作。", + "malum.gui.book.entry.page.text.spirit_infusion.3": "所有奥术能量就位之后,晶体内 的能量就会开始流入中央的物品 内。其他要融合的物品也会在这 一过程中被拉入其中。待所有吸 收过程结束,灌注的产物便会成 型。不过,这一过程$i确实/$相当缓 慢……", "malum.gui.book.entry.page.headline.spirit_infusion.hex_ash": "咒灰", "malum.gui.book.entry.page.text.spirit_infusion.hex_ash.1": "灌注所得的第一种产物是一种粉 末,我以其颜色称其“咒灰”。 它是一种简单而有用的砂粉,其 中硝石和硫磺大都被原始奥术能 量嬗变殆尽,余下的是碳和反应 物的混合品。", "malum.gui.book.entry.page.headline.spirit_infusion.living_flesh": "鲜活血肉", @@ -1010,14 +1050,14 @@ "malum.gui.book.entry.primary_arcana.description": "魔法的构件", "malum.gui.book.entry.page.headline.primary_arcana.sacred": "神圣精魂", "malum.gui.book.entry.page.text.primary_arcana.sacred.1": "神圣奥术能量对任何促进生命的 魔法都至关重要。它可被看作神 圣事物,格外有活力的生命的能 量,甚至是青春的单纯。它纯净 而未经污染,也因此十分有用。", - "malum.gui.book.entry.page.text.primary_arcana.sacred.2": "它是纯净的脉动,是对乐观的渴 望。它可在被动的、单纯的、起 源神圣的事物中寻得。", + "malum.gui.book.entry.page.text.primary_arcana.sacred.2": "它是纯净的脉动,是对乐观的渴 望。它可在友善的、单纯的、起 源神圣的事物中寻得。", "malum.gui.book.entry.page.headline.primary_arcana.wicked": "邪恶精魂", "malum.gui.book.entry.page.text.primary_arcana.wicked.1": "邪恶奥术能量对生命有害。它追 求死亡与绝望,并会将生命扭曲 为其他形态。就连触碰这种晶体 都会让我的灵魂因疼痛而颤栗。", "malum.gui.book.entry.page.text.primary_arcana.wicked.2": "它是腐化的脉动,是对苦痛的渴 望。它可在缺失生命的,或是为 恶意所扭曲的事物中寻得。", "malum.gui.book.entry.page.headline.primary_arcana.arcane": "奥术精魂", "malum.gui.book.entry.page.text.primary_arcana.arcane.1": "其他奥术能量都是灵魂的脉动, 但奥术精魂准确来说是奥能自身 的脉动。这种$b原始奥术能量/$没有 独特属性,而只是无向的精神力 量。", "malum.gui.book.entry.page.text.primary_arcana.arcane.2": "它是创造的脉动,是所有事物的 最初法则。它可在将自身灵魂对 力量开放的,或是起源于那种力 量的事物中寻得。", - "malum.gui.book.entry.page.text.primary_arcana.arcane.3": "我推测这种奥术能量与其他能量 不同,会经时间融入灵魂。灵魂 的许多方面先天就已决定,毕竟 独属于你的脉动自初便与你同在。 但这种能量缺失脉动,也许它就 是与其他能量有所不同。毕竟, 女巫不是生来就是女巫。", + "malum.gui.book.entry.page.text.primary_arcana.arcane.3": "我推测这种奥术能量与其他能量 不同,会经时间融入灵魂。灵魂 的许多方面先天就已决定,独属 于你的脉动自初便与你同在。但 这种能量缺失脉动,也许它就是 与其他能量有所不同。毕竟,女 巫不是生来就是女巫。", "malum.gui.book.entry.elemental_arcana": "元素奥术能量", "malum.gui.book.entry.elemental_arcana.description": "聚焦的魔法", @@ -1058,7 +1098,7 @@ "malum.gui.book.entry.page.text.spirit_metals.hallowed_gold.spirit_jar.1": "这种金属的一种简单应用是精魂 罐。精魂的原始形态并无质量, 而将其锁存在神圣金下则是无视 物理限制存储的好方法。这种罐 子的容量近乎无限,但它们只能 存储单种精魂。", "malum.gui.book.entry.page.headline.spirit_metals.soulstained_steel": "魂染钢", "malum.gui.book.entry.page.text.spirit_metals.soulstained_steel.1": "简而言之,铁很平凡。以灵魂石 调谐铁,就能制成一种$i同时/$与世 界同相又与世界异相的钢材。", - "malum.gui.book.entry.page.text.spirit_metals.soulstained_steel.2": "任何由魂染钢制成的事物都天生 具有击中灵魂的能力,不需要镰 刀那样的精密加工技艺辅助。但 直接穿上只用魂染钢制成的盔甲 相当危险,因为我的灵魂也会受 其影响。我需要一种反制措施。", + "malum.gui.book.entry.page.text.spirit_metals.soulstained_steel.2": "任何由魂染钢制成的事物都天生 具有击碎灵魂的能力,不需要镰 刀那样的精密加工技艺辅助。但 直接穿上只用魂染钢制成的盔甲 相当危险,因为我的灵魂也会受 其影响。需要有一种反制措施。", "malum.gui.book.entry.spirit_metals.reexamination": "再次审视:精魂金属", "malum.gui.book.entry.spirit_metals.reexamination.description": "异类法则", "malum.gui.book.entry.page.headline.spirit_metals.reexamination": "再次审视:精魂金属", @@ -1073,8 +1113,8 @@ "malum.gui.book.entry.soulstained_armor": "魂染钢盔甲", "malum.gui.book.entry.soulstained_armor.description": "精魂保护", "malum.gui.book.entry.page.headline.soulstained_armor": "魂染钢盔甲", - "malum.gui.book.entry.page.text.soulstained_armor.1": "和魂染钢镰刀类似,我成功将普 通的铁盔甲改进为了魂染钢盔甲。 为避免直接接触这种金属导致的 灵魂受到搓挤,我在金属内部安 上了扭曲石制成的衬板。", - "malum.gui.book.entry.page.text.soulstained_armor.2": "因其同时具有存在于物理和奥术 领域,魂染钢展现出了惊人的防 御属性。它能挡住来自两个领域 的攻击,我称这种效果“灵魂护 盾”。效果受到干扰后的恢复需 要时间。其表现为提供额外护甲 值,这种护甲值能完全吸收魔法 伤害并减弱物理伤害。", + "malum.gui.book.entry.page.text.soulstained_armor.1": "和魂染钢镰刀类似,我成功将普 通的铁盔甲改进为了魂染钢盔甲。 为避免直接接触这种金属导致的 灵魂损伤,我在金属内部安上了 扭曲石制成的衬板。", + "malum.gui.book.entry.page.text.soulstained_armor.2": "因其同时存在于物理和奥术领域, 魂染钢展现出了惊人的防御属 性。它能挡住来自两个领域的攻 击,我称这种效果为“灵魂护 盾”。效果受到干扰后的恢复需 要时间。其表现为额外的护甲值, 这种护甲值能完全吸收魔法伤害 并减弱物理伤害。", "malum.gui.book.entry.page.text.soulstained_armor.3": "这种效果在本质上似乎与其他我 研究过的事物颇为相似,例如往 盔甲上刻符文,或是召来黑阳当 空。尽管形式上有所不同,但此 效果$i表面上/$似乎没有相应代价。 灵魂护盾的能量究竟是哪里来的?", "malum.gui.book.entry.spirit_trinkets": "精魂护符", @@ -1089,8 +1129,10 @@ "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_alchemical_mastery.1": "通过某种炼金技巧,这枚戒指能 够操纵我血液中流动的药水。每 当收集到奥术能量时,戒指会滤 出部分负面效果,并延长正面效 果的持续时间。", "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_curative_talent": "疗愈魔能戒指", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_curative_talent.1": "收获到精魂晶体时,此处记载的 护符便会起效,吸收残余的能量。 例如,在收获到奥术能量时,这 枚回复护符便会为我恢复一部分 生命。", + "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_manaweaving": "织魔戒指", + "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_manaweaving.1": "灵魂护盾相当强大,但在当前的 状态下还难称尽善尽美。显著缺 陷之一便是恢复用时过长。为改 进这一点,我制成了一枚戒指, 收获到奥术能量就能加速灵魂护 盾的恢复。", "malum.gui.book.entry.page.headline.reactive_trinkets.ring_of_prowess": "奥术才智戒指", - "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_prowess.1": "经验晶附于灵魂,又不似奥术能 量那样的脉动。它是积累起于灵 魂的学识才智,也因此并非灵魂 与生俱来之物。就算是不伤及灵 魂的重击也能将其解离。", + "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_prowess.1": "才智附于灵魂,又不似奥术能量 那样的脉动。它是随灵魂不断积 累的学识,也因此并非灵魂与生 俱来之物。就算是不伤及灵魂的 重击也能将其解离。", "malum.gui.book.entry.page.text.reactive_trinkets.ring_of_prowess.2": "我也通过凝结出的经验晶制造出 了一枚戒指,它能将经验晶从我 收获的奥术能量中滤出,每当收 获到奥术能量便会给我一次经验 才智的爆发。", "malum.gui.book.entry.ring_of_esoteric_spoils": "隐秘掠夺戒指", @@ -1101,7 +1143,7 @@ "malum.gui.book.entry.belt_of_the_starved": "饥馁者腰带", "malum.gui.book.entry.belt_of_the_starved.description": "引导贪食", "malum.gui.book.entry.page.headline.belt_of_the_starved": "饥馁者腰带", - "malum.gui.book.entry.page.text.belt_of_the_starved.1": "有时,收集得的奥术能量中会有 几缕残存的愿望与欲望。而再看 我平时所收割事物的本质,这种 思维情绪便通常会表现为饥饿、 淫欲,或者琐碎的忿恨。所有上 述杂质都可被利用,此外,还可 将其融入我的魔法。", + "malum.gui.book.entry.page.text.belt_of_the_starved.1": "有时,收集得的奥术能量中会有 几缕残存的愿望与欲望。而再看 我平时所收割事物的本质,这种 思维情绪便通常会表现为饥饿、 淫欲,或者琐碎的忿恨。上述所 有杂质都可被利用,也可将其融 入我的魔法。", "malum.gui.book.entry.page.text.belt_of_the_starved.2": "这么做也许会导致可预见的饥饿 感增幅,并在过程中迅速消耗饥 饿值。如此带来的魔法熟练度增 幅极为巨大,但是……方法本身 确实相当令人反胃。", "malum.gui.book.entry.belt_of_the_starved.ring_of_desperate_voracity": "渴求贪食戒指", "malum.gui.book.entry.belt_of_the_starved.ring_of_desperate_voracity.description": "扩大通路", @@ -1116,12 +1158,12 @@ "malum.gui.book.entry.necklace_of_the_narrow_edge": "精准镰刃项链", "malum.gui.book.entry.necklace_of_the_narrow_edge.description": "精准而锋利", "malum.gui.book.entry.page.headline.necklace_of_the_narrow_edge": "精准镰刃", - "malum.gui.book.entry.page.text.necklace_of_the_narrow_edge.1": "镰刀的横扫攻击是其亮点,取首 级如刈麦的能力更是无价,但这 也导致镰刀的单体伤害较低。此 项链会以神秘手段将攻击锋刃聚 合,所有能量都导向至单个目标, 大大提升攻击伤害。", + "malum.gui.book.entry.page.text.necklace_of_the_narrow_edge.1": "镰刀的横扫攻击是其亮点,取首 级如刈麦的能力更是无价,但这 也导致镰刀的单体伤害较低。此 项链会以神秘手段将攻击锋刃聚 合汇集,所有能量都导向至单个 目标,大大提升攻击伤害。", "malum.gui.book.entry.belt_of_the_prospector": "勘探腰带", "malum.gui.book.entry.belt_of_the_prospector.description": "大地之宝", "malum.gui.book.entry.page.headline.belt_of_the_prospector": "勘探腰带", - "malum.gui.book.entry.page.text.belt_of_the_prospector.1": "为进行各种魔法实验并达成目标, 我常需要各种岩层中的宝藏。此 腰带可使地上的高价值物品免受 $i直接/$由我造成的爆炸的摧残,并 使这种爆炸破坏方块的效果与时运 III的工具等同。", + "malum.gui.book.entry.page.text.belt_of_the_prospector.1": "为进行各种魔法实验并达成目标, 我常需要岩层中的各种宝藏。此 腰带可使地上的高价值物品免受 $i直接/$由我造成的爆炸的摧残,并 使这种爆炸破坏方块的效果与时运 III的工具等同。", "malum.gui.book.entry.belt_of_the_prospector.ring_of_the_hoarder": "囤积者戒指", "malum.gui.book.entry.belt_of_the_prospector.ring_of_the_hoarder.description": "直入血脉", "malum.gui.book.entry.page.headline.belt_of_the_prospector.ring_of_the_hoarder": "囤积者戒指", @@ -1147,14 +1189,14 @@ "malum.gui.book.entry.spirit_stones.reexamination": "再次审视:精魂石材", "malum.gui.book.entry.spirit_stones.reexamination.description": "晶体结构的密铺", "malum.gui.book.entry.page.headline.spirit_stones.reexamination": "再次审视:精魂石材", - "malum.gui.book.entry.page.text.spirit_stones.reexamination.1": "似乎精魂晶体结构可以无限密铺, 至少邪恶和神圣晶体可以,因为 我拆解分析扭曲石和污秽石样本 后得出的结论就是这样。其他精 魂石材——换言之,密铺方式 ——或许真实存在?很有可能。", + "malum.gui.book.entry.page.text.spirit_stones.reexamination.1": "似乎精魂晶体结构可以无限密铺, 至少邪恶和神圣晶体可以,因为 我拆解分析扭曲石和污秽石样本 后得出的结论就是这样。其他精 魂石材——换言之,密铺方式 ——或许真的存在?很有可能。", "malum.gui.book.entry.page.text.spirit_stones.reexamination.2": "那些石材的性质又会是怎样?神 圣和邪恶能制得接受和排斥魔法 的石材……澄空和大地就能造出 移动和锁定魔法的石材?但这些 功能神圣金早已具备……狱火大 概能用来加速,碧水则可用于改 变,这两种石材也许会有用处。", "malum.gui.book.entry.page.text.spirit_stones.reexamination.3": "我应当还不具备剖析奥术、邪术、 幽影所成石材的能力。我仍然没 有理解它们所代表事物的完全图 景,因为目前我还无法对幽影奥 术能量进行破坏性测试。但是, 考虑到基岩位于虚空旁侧……也 许基岩的不可破坏性就是幽影石 材的特性?", "malum.gui.book.entry.ether": "灵火", "malum.gui.book.entry.ether.description": "风之色彩", "malum.gui.book.entry.page.headline.ether": "灵火", - "malum.gui.book.entry.page.text.ether.1": "魔法师学徒的常见任务之一是制 造无需热源和燃料的火焰。这也 是种测试魔法掌控力的方法,以 及测试规避自然现象的能力的常 用手段。精魂魔法也当然能制造 这种奇迹。", + "malum.gui.book.entry.page.text.ether.1": "魔法师学徒的常见任务之一是制 造无需热源和燃料的火焰。这是 种测试魔法掌控力的方法,也常 用来检测规避自然现象的能力。 精魂魔法也当然能制造这种奇迹。", "malum.gui.book.entry.page.text.ether.2": "灵火火焰的特殊之处就在于其与 颜色的相性。就如同给皮革染色, 我同样也能为灵火染色。它是种 光源,因此染上深色会降低其明 度,而非改变火焰的颜色。", "malum.gui.book.entry.page.headline.ether.iridescent": "虹彩灵火", "malum.gui.book.entry.page.text.ether.iridescent.1": "我并未止步于制成灵火,而是找 到了给灵火浸入第二种颜色的方 式,也由此创造出了虹彩灵火。 初制成时,这种灵火的基础颜色 便会锁死,也同时能染上$i第二种/$ 颜色。光则会在火焰尖端附近慢 慢由原有颜色变为新添的颜色。", @@ -1184,12 +1226,12 @@ "malum.gui.book.entry.page.text.focus_ashes.1": "只要给炼金促符注入不同种的奥 术能量,就能制成各种粉状物质。 是简单而好用的奥术配方。", "malum.gui.book.entry.focus_crystals": "晶体创造", - "malum.gui.book.entry.focus_crystals.description": "制成不规则晶体", + "malum.gui.book.entry.focus_crystals.description": "制造不规则晶体", "malum.gui.book.entry.page.headline.focus_crystals": "晶体创造", "malum.gui.book.entry.page.text.focus_crystals.1": "只要给炼金促符注入不同种的奥 术能量,就能制成更多种平凡晶 体。", "malum.gui.book.entry.focus_metals": "金属魔艺", - "malum.gui.book.entry.focus_metals.description": "制成条状晶体", + "malum.gui.book.entry.focus_metals.description": "制造条状晶体", "malum.gui.book.entry.page.headline.focus_metals": "金属魔艺", "malum.gui.book.entry.page.text.focus_metals.1": "以硝石、硫磺、深岩珍金改变炼 金促符的组分,就可将其改造, 使其能形成纯度极高的金属结点。", "malum.gui.book.entry.page.text.focus_metals.2": "这种方法的效率和速度都不算最 快,但肯定比全手动挖矿要好得 多。所有种类的金属结点都可在 任意熔炉内烧炼为金属粒,每个 结点相当于三分之二个锭。", @@ -1204,7 +1246,7 @@ "malum.gui.book.entry.arcane_restoration": "奥术复原", "malum.gui.book.entry.arcane_restoration.description": "神秘修复", "malum.gui.book.entry.page.headline.arcane_restoration": "奥术复原", - "malum.gui.book.entry.page.text.arcane_restoration.1": "精魂坩埚有一个怪癖比较烦人 ——它会破坏与其交互的工具。 尽管使用坩埚时代价不可避免, 我也宁可选择分期支付。我设计 了这座叫“修复基柱”的仪器, 以在工具损坏时修复它们。", + "malum.gui.book.entry.page.text.arcane_restoration.1": "精魂坩埚有一个怪癖比较烦人 ——它会破坏与其交互的工具。 就算使用坩埚时代价不可避免, 我也宁可选择分期支付。我设计 了这座叫“修复基柱”的仪器, 以在工具损坏时修复它们。", "malum.gui.book.entry.page.text.arcane_restoration.2": "修复基柱不只对促符有效,而是 对几乎所有东西都有效。只要把 它们放在足够近的物品台座上, 往基柱中放入修复材料(例如, 铁工具使用铁锭),再配上合适 的精魂就行。和铁砧不同,这种 修复过程不需要消耗经验。", "malum.gui.book.entry.page.text.arcane_restoration.3": "似乎与精魂能量相性更佳的材料 的修复过程也更高效,魂染钢和 神圣金就是如此。在同等消耗下, 它们的修复量比对应平凡材料的 更多。", @@ -1212,7 +1254,8 @@ "malum.gui.book.entry.mote_making": "奥能聚块的制作", "malum.gui.book.entry.mote_making.description": "崇拜立方体", "malum.gui.book.entry.page.headline.mote_making": "奥能聚块的制作", - "malum.gui.book.entry.page.text.mote_making.1": "精魂晶体发出的微光奇异而神秘, 增强这种辉光又会怎么样呢?适 合这件事的工具就是明灯夹钳, 一手持夹钳,另一手持精魂晶体, 即可制造一个“奥能聚块”。它 在魔法中近乎无用,但当作灯来 看非常美观。", + "malum.gui.book.entry.page.text.mote_making.1": "精魂晶体发出的微光奇异而神秘, 增强这种辉光又会怎么样呢?明 灯夹钳就很适合这件事,一手持 夹钳,另一手持精魂晶体,即可 制造一个“奥能聚块”。", + "malum.gui.book.entry.page.text.mote_making.2": "这些奥能聚块是纯净的奥术能量 的凝聚体,外部有一小层守护魔 法,用以防止外溢。它在魔法中 近乎无用,但当作灯来看非常美 观。", "malum.gui.book.entry.spirited_glass": "融魂玻璃", "malum.gui.book.entry.spirited_glass.description": "不太适合当镜片", @@ -1245,7 +1288,7 @@ "malum.gui.book.entry.blazing_diode": "烈焰二极管", "malum.gui.book.entry.blazing_diode.description": "至强之力", "malum.gui.book.entry.page.headline.blazing_diode": "烈焰二极管", - "malum.gui.book.entry.page.text.blazing_diode.1": "烈焰二极管借用了如火般热烈灵 魂的强大力量,降低坩埚周围催 化器的燃料需求,同时略微加快 了聚焦过程。", + "malum.gui.book.entry.page.text.blazing_diode.1": "烈焰二极管借用了如火般热烈的 灵魂的强大力量,降低坩埚周围 催化器的燃料需求,同时略微加 快了聚焦过程。", "malum.gui.book.entry.prismatic_focus_lens": "海晶聚焦透镜", "malum.gui.book.entry.prismatic_focus_lens.description": "稳定下来", @@ -1276,7 +1319,7 @@ "malum.gui.book.entry.page.text.totem_magic.2": "为启动图腾魔法,我需要将精魂 奥术能量刻至符文原木之中,形 成代表该能量的符记。如不需要 某个符记,可用斧将其去除。我 脑中已有构想,先准备一符文木 图腾基座,再往其上图腾柱刻入 特定的符记组合,就可以启动精 魂仪式了。", "malum.gui.book.entry.page.text.totem_magic.3": "各种仪式的功能各有不同,但其 仍有规律可循,仍能归为若干类。 其一命名为“灵气仪式”,这类 仪式是给予状态效果的简单仪式, 可影响距图腾基座八格之内的所 有生物。而其他转化生物的仪式, 则大多只能影响灵气仪式的范围 的一半。", "malum.gui.book.entry.page.text.totem_magic.4": "转化方块的仪式大多会影响基座 下方、符记刻痕方向的五乘五的 范围。", - "malum.gui.book.entry.page.text.totem_magic.5": "需要注意,所有仪式图腾都无法 在另一同种仪式作用范围内工作。 若仍试图这么做,原有的仪式会 会因其周围的能流受到干扰而被 打断。", + "malum.gui.book.entry.page.text.totem_magic.5": "需要注意,所有仪式图腾都无法 在另一同种仪式作用范围内工作。 若仍试图这么做,原有的仪式会 因其周围的能流受到干扰而被打 断。", "malum.gui.book.entry.totemic_runes": "图腾符文", "malum.gui.book.entry.totemic_runes.description": "符文工艺中的仪式", @@ -1493,7 +1536,7 @@ "malum.gui.book.entry.rune_of_aliment_cleansing": "病痛祓除符文", "malum.gui.book.entry.rune_of_aliment_cleansing.description": "促进处理的脉动", "malum.gui.book.entry.page.headline.rune_of_aliment_cleansing": "病痛祓除符文", - "malum.gui.book.entry.page.text.rune_of_aliment_cleansing.1": "病痛祓除符文促使形体催化、转 化和改变物质,以期加快处理消 解负面效果的速度,以超越寻常 的速度战胜它们。", + "malum.gui.book.entry.page.text.rune_of_aliment_cleansing.1": "病痛祓除符文促使形体催化、转 化和改变物质,以期加快处理和 消解负面效果的速度,而以超越 寻常的速度战胜它们。", "malum.gui.book.entry.rune_of_culling": "屠戮符文", "malum.gui.book.entry.rune_of_culling.description": "促进破坏的脉动", @@ -1569,7 +1612,7 @@ "malum.gui.book.entry.tyrving": "提尔锋", "malum.gui.book.entry.tyrving.description": "远古遗物", "malum.gui.book.entry.page.headline.tyrving": "提尔锋", - "malum.gui.book.entry.page.text.tyrving.1": "提尔锋是一把相对隐秘的武器。 它奇异的构造使其看上去好像是 不适合战斗的孱弱武器。然而, 其咒灰内衬和扭曲石外形则使其 能对灵魂造成额外魔法伤害,灵 魂越强大,增益就越多。", + "malum.gui.book.entry.page.text.tyrving.1": "提尔锋是一把相对隐秘的武器。 它奇异的构造让它看上去好像是 不适合战斗的孱弱武器。然而, 其咒灰内衬和扭曲石外形则使其 能对灵魂造成额外魔法伤害,灵 魂越强大,增益就越多。", "malum.gui.book.entry.page.text.tyrving.2": "此武器也可用奥术复原高效修复。", "malum.gui.book.entry.the_device": "神秘装置", @@ -1591,13 +1634,13 @@ "malum.gui.book.entry.page.text.void.the_weeping_well.4": "我的第一想法是往里面扔块石头, 现在看来大概不算什么好决定。 井本身应该足够稳定,如果它真 的存在了很长时间的话……好在 没发生危险的事,算是松了口气。 那块石头几秒后就飞了出来,同 时还有一阵类似打嗝的声音,附 带少量浓度低至无害的井内物质。", "malum.gui.book.entry.page.text.void.the_weeping_well.5": "我身上还有些挖矿收集到的物品, 其中有一些经验晶和一块深岩珍 金,我待在井旁时它们便好像要 飞出我的口袋。我不清楚这意味 着什么,不过,扔进去的石头会 反弹出来,那么也许可以把它们 也扔进去试试。", "malum.gui.book.entry.page.text.void.the_weeping_well.6": "这么做了之后,投进去的材料在 反弹回的那一刻发生了变化 ——有趣的是,石头和这些材料 的反弹方向都是正南方。或许我 可借此造出新材料、新造物?而 且,仅是受到吸引的材料都与奥 能相关这一点,就极具探索价值。", - "malum.gui.book.entry.page.text.void.the_weeping_well.7": "我并非历史学家,便不会去探究 那些延伸而来的文化内涵,但有 一点,至少就我目前所知如此, 那就是污秽石只可通过精魂灌注 制成。这意味着曾有文明触及过 奥术能量,并且……试图控制它? 曾畏惧过它?曾利用过它?这个 文明是否与深埋地下的其他结构 有关?我不清楚,但我希望我能 找到答案。", + "malum.gui.book.entry.page.text.void.the_weeping_well.7": "我并非历史学家,不会去探究那 些延申而来的文化内涵,但有一 点,至少就我目前所知如此,那 就是污秽石只可通过精魂灌注制 成。这意味着曾有文明触及过奥 术能量,并且……试图控制它? 曾畏惧过它?曾利用过它?这个 文明是否与深埋地下的其他结构 有关?我不清楚,但我希望我能 找到答案。", "malum.gui.book.entry.void.material_study_soulstone": "材料研究:灵魂石", "malum.gui.book.entry.void.material_study_soulstone.description": "一位老朋友", "malum.gui.book.entry.page.headline.void.material_study_soulstone": "研究:灵魂石", "malum.gui.book.entry.page.text.void.material_study_soulstone.1": "当然,灵魂石本身没什么新东西。 它是精魂魔法的基石。然而,大 多数粗金属穿过哭泣之井后,便 会变成粗灵魂石。", - "malum.gui.book.entry.page.text.void.material_study_soulstone.2": "这是否意味着灵魂石本身类似金 属?或许吧。但这肯定能解释它 为何能轻松调谐铁。这当然也代 表着,灵魂石本身以某种方式与 井的真实存在相连。也许井是现 实中充斥着灵魂的区域,还是一 种收纳灵魂的方式?这两种说法 都不太站得住脚,但我目前还无 法直接推倒这些理论,不管看上 去有多站不住脚。", + "malum.gui.book.entry.page.text.void.material_study_soulstone.2": "这是否意味着灵魂石本身类似金 属?或许吧。但这肯定能解释它 为何能轻松调谐铁。这当然也代 表着,灵魂石本身以某种方式与 井的真实存在相连。也许井是现 实中充斥着灵魂的区域?还是一 种收纳灵魂的方式?这两种说法 都不太站得住脚,但我目前还无 法直接推倒这些理论,不管看上 去有多站不住脚。", "malum.gui.book.entry.void.material_study_null_slate": "材料研究:精炼灵魂石", "malum.gui.book.entry.void.material_study_null_slate.description": "空白的板石,也许即是前身", @@ -1628,10 +1671,10 @@ "malum.gui.book.entry.void.material_study_void_salts.reexamination": "再次审视:虚空盐", "malum.gui.book.entry.void.material_study_void_salts.reexamination.description": "引人担忧", "malum.gui.book.entry.page.headline.void.material_study_void_salts.reexamination": "再次审视:虚空盐", - "malum.gui.book.entry.page.text.void.material_study_void_salts.reexamination.1": "$i不存在/$中产生了$i存在/$,就是幽影 奥术能量存在的表现。它或许$i真 的/$活着……但它的生命由虚无定 义,而非物质的存在。再推而广 之,虚空中或许还有更为复杂的 生命?", + "malum.gui.book.entry.page.text.void.material_study_void_salts.reexamination.1": "$i不存在/$中产生了$i存在/$,就是幽影 奥术能量存在的表现。它或许$i真/$ $i的/$活着……但它的生命由虚无定 义,而非物质的存在。再推而广 之,虚空中或许还有更为复杂的 生命?", "malum.gui.book.entry.void.material_study_malignant_lead": "材料研究:腐化黄金", - "malum.gui.book.entry.void.material_study_malignant_lead.description": "完美变为平庸", + "malum.gui.book.entry.void.material_study_malignant_lead.description": "化神奇为腐朽", "malum.gui.book.entry.page.headline.void.material_study_malignant_lead": "研究:恶念之铅", "malum.gui.book.entry.page.text.void.material_study_malignant_lead.1": "穿过哭泣之井后,深岩珍金会转 换成恶念之铅。与金绑定的各种 奥术能量大多转变成了邪恶奥术 能量,这种金属也因此自炼金师 的神坛跌落,变成了最为低等的 材料。", "malum.gui.book.entry.page.text.void.material_study_malignant_lead.2": "金属中的奥术能量也大致变为了 原本的一半。是因为被井剥去了, 还是变化成了我仍未分离辨识的 事物?两种说法都可能成立。这 点有可能和虚无板石展现出来的 奥术交互能力有关……", @@ -1639,7 +1682,7 @@ "malum.gui.book.entry.void.material_study_malignant_lead.reexamination.description": "邪恶与幽影", "malum.gui.book.entry.page.headline.void.material_study_malignant_lead.reexamination": "再次审视:恶念之铅", "malum.gui.book.entry.page.text.void.material_study_malignant_lead.reexamination.1": "我目前只有恶念之铅这一种方法 考察幽影晶体的物理形态——恰 好失去了一半的奥术质量,哪还 可能是其他原因所致?", - "malum.gui.book.entry.page.text.void.material_study_malignant_lead.reexamination.2": "分离深岩珍金中微晶和恶念之铅 中邪恶晶体那样的操作仍未取得 成果,但在我能获得更多材料之 前,这么做就是研究幽影奥术能 量构造的最佳途径。", + "malum.gui.book.entry.page.text.void.material_study_malignant_lead.reexamination.2": "分离深岩珍金中的微晶,分离恶 念之铅中的邪恶晶体,这两者仍 未取得成果。但在我能获得更多 材料之前,这么做就是研究幽影 奥术能量构造的最佳途径。", "malum.gui.book.entry.void.material_study_auric_embers": "材料研究:烈焰升华", "malum.gui.book.entry.void.material_study_auric_embers.description": "演进的精华", @@ -1651,6 +1694,13 @@ "malum.gui.book.entry.page.headline.void.material_study_auric_embers.reexamination": "再次审视:灵气余焰", "malum.gui.book.entry.page.text.void.material_study_auric_embers.reexamination.1": "和我之前的构想不一样,井并不 会剥去事物。而是会逆转它们, 替换成类虚空的相似物质。灵气 余焰大概就是其中最纯粹的例子: 所有不属于演进精华的事物都蒙 上了一层虚无暗影,产生的材料 $i远/$比“适合于某一用途”要完美。", + "malum.gui.book.entry.void.catalyst_lobber": "促焰投具", + "malum.gui.book.entry.void.catalyst_lobber.description": "演进超越一切", + "malum.gui.book.entry.page.headline.void.catalyst_lobber": "促焰投具", + "malum.gui.book.entry.page.text.void.catalyst_lobber.1": "演进之火极为强烈,它会为自身 的演进与蔓延摧毁路上的一切事 物。因此必然存在以其为基础的 毁灭性武器,事实上也真的存在。", + "malum.gui.book.entry.page.text.void.catalyst_lobber.2": "我使用一对明灯夹钳造成了这件 “促焰投具”。它会重新校准灵 气余焰以“解锁”它们,令它们 那温和的火焰转变为爆炸性的烈 焰,并在准备发射之前控制住它 们。", + "malum.gui.book.entry.page.text.void.catalyst_lobber.3": "我还加了一层安全措施,因为 ……我不想再建一遍实验室了。 这些火焰极其易爆。当然,黑曜 石等基础的防爆措施能挡住它们。", + "malum.gui.book.entry.void.black_crystal": "漆黑的晶体", "malum.gui.book.entry.void.black_crystal.description": "是错误,还是祝福?", "malum.gui.book.entry.page.headline.void.black_crystal": "漆黑的晶体", @@ -1661,7 +1711,7 @@ "malum.gui.book.entry.fragment.void.black_crystal": "胡乱涂写的笔记", "malum.gui.book.entry.fragment.void.black_crystal.description": "无法理解", "malum.gui.book.entry.page.headline.fragment.void.black_crystal": "胡乱涂写的笔记", - "malum.gui.book.entry.page.text.fragment.void.black_crystal.1": "$i你尝试阅读这篇条目,但文字似 乎从眼边溜走了,每次捕捉到它 们的同时就又遗失了它们。你仍 记得的只言片语在你脑内留下了 这样一种印象:除去投入井中的 材料外,好像还存在着些什么……/$", + "malum.gui.book.entry.page.text.fragment.void.black_crystal.1": "$i你尝试阅读这篇条目,但文字似/$ $i乎从眼边溜走了,每次捕捉到它/$ $i们的同时就又遗失了它们。你仍/$ $i记得的只言片语在你脑内留下了/$ $i这样一种印象:除去投入井中的/$ $i材料外,好像还存在着些什么……/$", "malum.gui.book.entry.void.umbral_arcana": "幽影奥术能量", "malum.gui.book.entry.void.umbral_arcana.description": "完全不可能", @@ -1679,7 +1729,7 @@ "malum.gui.book.entry.void.inverse_and_hybrid_arcana.description": "失败的理论", "malum.gui.book.entry.page.headline.void.inverse_and_hybrid_arcana": "理论中的奥术能量", "malum.gui.book.entry.page.text.void.inverse_and_hybrid_arcana.1": "如果奥术和邪术有其反面,那么 其他精魂晶体也应当有对应的反 面:比如,火的完全缺失即是狱 火的反面。从精魂罐中取出精魂 能量是形成晶体的手段之一。理 论上,再现类似环境就可以形成 另一种类型的晶体。", - "malum.gui.book.entry.page.text.void.inverse_and_hybrid_arcana.2": "精确放置精魂晶体,再配以灵魂 木仪式,理论中能够形成六种基 础奥术能量反面晶体的环境就此 落成……但什么都没有发生。要 是能找到适用于幽影奥术能量的 类似环境,那用处就会多出许多, 但目前我未能想出移除区域内$i所 有/$奥术能量的方法。", + "malum.gui.book.entry.page.text.void.inverse_and_hybrid_arcana.2": "精确放置精魂晶体,再配以灵魂 木仪式,理论中能够形成六种基 础奥术能量反面晶体的环境就此 落成……但什么都没有发生。要 是能找到适用于幽影奥术能量的 类似环境,那用处就会多出许多, 但目前我未能想出移除区域内$i所/$ $i有/$奥术能量的方法。", "malum.gui.book.entry.page.text.void.inverse_and_hybrid_arcana.3": "与之类似,无论以何种奥术能量 组合精校环境,都无法形成超出 六种基础晶体之外的晶体。也就 是说,混合奥术能量不存在,至 少不以同种方式存在;奥术能量 的稳定态只有有限个。但奥术能 量可以以其他方式结合……", "malum.gui.book.entry.fragment.void.inverse_and_hybrid_arcana": "一次失败的实验", "malum.gui.book.entry.fragment.void.inverse_and_hybrid_arcana.description": "试图创造全新事物?", @@ -1687,7 +1737,7 @@ "malum.gui.book.entry.void.material_study_arcana": "材料研究:奥术能量", "malum.gui.book.entry.void.material_study_arcana.description": "旧井新渊", "malum.gui.book.entry.page.headline.void.material_study_arcana": "研究:精魂晶体", - "malum.gui.book.entry.page.text.void.material_study_arcana.1": "在此之前,我还没将精魂晶体物 理性质的研究推进到如此地步。 这当然也有借口,我主要关注的 是它们的魔法性质,物理性质居 于其次……并非只有幽影精魂有 奇怪的特性。所有晶体都会。", + "malum.gui.book.entry.page.text.void.material_study_arcana.1": "在此之前,我还没将精魂晶体物 理性质的研究推进到如此地步。 这当然也有借口,我主要关注的 是它们的魔法性质,物理性质居 于其次……并非只有幽影精魂有 奇怪的特性。所有晶体都有。", "malum.gui.book.entry.page.text.void.material_study_arcana.2": "首先,单个种类精魂晶体的各个 样本——幽影精魂也许也一样, 但我只有一枚晶体样本——在物 理层面上完全一致,我现在的探 测精度还没法把它们区分开。这 种“一致”不只停留在“类似” 上,而是$i完全/$地、$i精确/$地相同, 到百万分之一格的数量级都是这 样。这自然也引出了一个问题: 能否雕琢或破坏晶体的一小部分?", "malum.gui.book.entry.page.text.void.material_study_arcana.3": "经过测试——当然没有非常$i全面/$, 我没有测试过幽影晶体——似乎 这种外形就是晶体能稳定存在的 唯一外形。试图移除或损坏哪怕 很小一部分都完全不可行,晶体 的物理外形完全不会受损,直至 受到足够的力而整个破碎。", "malum.gui.book.entry.page.text.void.material_study_arcana.4": "更为有意思的是,精魂晶体的物 理强度不算很高,但化学上则表 现出完全的惰性,我甚至试了很 多很多种反应物。它们真的是传 统意义上的物质吗?假如不是, 那幽影晶体又是什么呢?", @@ -1698,7 +1748,7 @@ "malum.gui.book.entry.page.headline.void.staves_as_foci": "以法杖为核心", "malum.gui.book.entry.page.text.void.staves_as_foci.1": "仔细思索我在精魂晶体中观察到 的性质后,我不禁认为结构本身 也有其重要性。而为测试这一结 论,我造出了一件忆念质仿制品, 用于仿造邪恶奥术能量;凝聚的 灵魂记忆是我能想到的最接近的 物质了。它能达到几十万分之一 格的精度。", "malum.gui.book.entry.page.text.void.staves_as_foci.2": "我没想到它会在我眼前爆炸。\n\n但是爆炸也很有用,前提是能够 掌控。所以我又做了一件样品, 但这次我为伪晶体设计了一副用 以运转的结构——灵魂木和魂染 钢制成的嵌座,以将能量向外传 递。将法术聚焦于法杖时,它就 像是微缩版的仪式,不过产生的 效果不太一样。", - "malum.gui.book.entry.page.text.void.staves_as_foci.3": "近战攻击中的法杖……堪堪足用。 我大概会将镰刀作为首选,但法 杖的功效也不错了。它们通常会 着重增强魔法伤害,物理伤害则 不那么看重,有些时候也很有用。 它们真正的特殊之处展现于我$i使 用/$它们时。", + "malum.gui.book.entry.page.text.void.staves_as_foci.3": "近战攻击中的法杖……堪堪足用。 我大概会将镰刀作为首选,但法 杖的功效也不错了。它们通常会 着重增强魔法伤害,物理伤害则 不那么看重,有些时候也很有用。 它们真正的特殊之处展现于我$i使/$ $i用/$它们时。", "malum.gui.book.entry.page.text.void.staves_as_foci.4": "忆念咒术法杖的名称来自其发射 液态邪恶能量的简单功能,就好 像女巫发射咒术。激活它需要时 间,使用也不算非常连续,却能 够对命中的事物造成可观的伤害。", "malum.gui.book.entry.page.text.void.staves_as_foci.5": "这种制造仿造奥术能量的方式在 其他能量处都碰了壁,也许是材 料的缘故。忆念质与邪恶能量的 谐振,或许只是来源于制造经验 晶所需的死亡。", "malum.gui.book.entry.void.staves_as_foci.ring_of_the_endless_well": "无底渊井戒指", @@ -1712,6 +1762,11 @@ "malum.gui.book.entry.page.headline.void.ring_of_growing_flesh": "增生血肉戒指", "malum.gui.book.entry.page.text.void.ring_of_growing_flesh.1": "我超频了疗愈魔能戒指,造出的 戒指不只会治疗伤害,还能超量 治疗。它在收集到精魂晶体时给 予额外生命值,但不会提供生命 恢复效果。", + "malum.gui.book.entry.void.ring_of_echoing_arcana": "奥能回响戒指", + "malum.gui.book.entry.void.ring_of_echoing_arcana.description": "我能看看见见未来$i未来未来/$", + "malum.gui.book.entry.page.headline.void.ring_of_echoing_arcana": "奥能回响戒指", + "malum.gui.book.entry.page.text.void.ring_of_echoing_arcana.1": "将疗愈魔能戒指超频过后得到的 戒指很有用,所以我又在织魔戒 指上重复了一遍,让它不只会绑 定,而也会制造出魔法层面的回 响。奥能回响戒指在收集到精魂 晶体时会给予奥术回响效果,以 此增强所有其他收集精魂时触发 的效果。", + "malum.gui.book.entry.void.ring_of_gruesome_concentration": "可厌聚集戒指", "malum.gui.book.entry.void.ring_of_gruesome_concentration.description": "摄取并同化", "malum.gui.book.entry.page.headline.void.ring_of_gruesome_concentration": "可厌聚集", @@ -1725,7 +1780,9 @@ "malum.gui.book.entry.void.necklace_of_the_hidden_blade": "隐藏锋刃项链", "malum.gui.book.entry.void.necklace_of_the_hidden_blade.description": "刺向背后的锋刃", "malum.gui.book.entry.page.headline.void.necklace_of_the_hidden_blade": "隐藏锋刃", - "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.1": "精准镰刃项链能聚焦镰刀的锋刃, 隐藏锋刃项链则更进一步,逆转 锋刃并令其饥馁。镰刀不再能进 行横扫攻击,但在我受伤时,镰 刃便会饮下我的痛楚,强化下一 次攻击。", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.1": "精准镰刃项链能聚焦镰刀的锋刃, 隐藏锋刃项链则更进一步,逆转 锋刃并令其饥馁。镰刀不再能进 行横扫攻击,但在我受伤时,镰 刃便会饮下我的痛楚,它借此挥 出的重砍和斩击在平常几近无法 达成。", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.2": "激活时,此项链会在十秒内保持 惰性,只有保持静止、集中思绪 才能激发出它的潜能。在此状态 下进行攻击会延长其惰性时间。", + "malum.gui.book.entry.page.text.void.necklace_of_the_hidden_blade.3": "这种反击的本质较为奇异,我未 能完全辨识。就好像锋刃扭曲了 现实,以在同一时刻出现在多个 位置。", "malum.gui.book.entry.void.malignant_pewter": "恶念白镴", "malum.gui.book.entry.void.malignant_pewter.description": "演进不再", @@ -1739,15 +1796,21 @@ "malum.gui.book.entry.page.headline.void.erosion_scepter": "侵蚀权杖", "malum.gui.book.entry.page.text.void.erosion_scepter.1": "我新制成了一种仿制奥术能量, 借由恶念白镴作为核心。在它那 腐蚀性的逆转能力中,金属本身 即会呼唤混乱熵增;因此邪术能 量回应了这一呼唤。和这种金属 的其他用途一样,自虚空盐悬液 中产出的晶体同样渴求消解人类 的成就。", "malum.gui.book.entry.page.text.void.erosion_scepter.2": "侵蚀权杖的制造使用了这种伪晶 体,它能发射一束束近乎匍匐的 腐蚀性物质,与腐枯物质和制造 其的虚空盐极其类似。每次充能 都会发射两发法术弹,每枚弹又 分出四束。这些物质束会蚕食所 命中事物的灵魂,并在一段时间 内阻止其运用魔法,也许算是使 用它的好处。", - "malum.gui.book.entry.page.text.void.erosion_scepter.3": "每一束物质都会额外叠上一层效 果,令魔法能力的灵魂力降低十 分之一。当然,这种效果可以叠 到完全封印目标的能力,而且每 次命中都会增强并延长封印。", + "malum.gui.book.entry.page.text.void.erosion_scepter.3": "每一束物质都会额外叠上一层效 果,令魔法能力和灵魂力降低十 分之一。当然,这种效果可以叠 到完全封印目标的能力,而且每 次命中都会增强并延长封印。", "malum.gui.book.entry.page.text.void.erosion_scepter.4": "直接用法杖敲打敌人即会施加两 次侵蚀,很有用处,它也不再只 是到了近身格斗的窘迫时刻才掏 出的武器了。并非所有魔法都要 求一个稳定的灵魂,对自我消解 的恐惧也应当能驱动魔法。", "malum.gui.book.entry.void.weight_of_worlds": "宙界重斧", "malum.gui.book.entry.void.weight_of_worlds.description": "实物化的存在性重负", "malum.gui.book.entry.page.headline.void.weight_of_worlds": "宙界重斧", - "malum.gui.book.entry.page.text.void.weight_of_worlds.1": "利用恶念白镴的现实侵蚀性质相 对来说比较简单。一把粗制的武 器,除此之外又有什么更能代表 演进的终止呢?这把斧,我称作 “宙界重斧”,以凸显恼怒情绪 之重。它很缓慢,它很笨拙,它 仅限物理……同时它也$i强大/$到远 超构想。", + "malum.gui.book.entry.page.text.void.weight_of_worlds.1": "利用恶念白镴的现实侵蚀性质相 对来说比较简单。一把粗制的武 器,除此之外又有什么更能代表 演进的终止呢?这把斧,我称作 “宙界重斧”,以凸显恼怒情绪 之重。它很缓慢,它很笨拙,它 的攻击仅限物理……同时它也$i强/$ $i大/$到远超构想。", "malum.gui.book.entry.page.text.void.weight_of_worlds.2": "某些时候,宙界重斧似会认可我 的屠戮,并令我的攻击力变为双 倍,这种增幅完全没有可溯来源。 我坚信屠戮即是关键,因在取走 性命时我能感受到某种谐振;这 种谐振似乎会在我下一次挥砍时 消散,并必定使得攻击力度翻倍。", + "malum.gui.book.entry.void.edge_of_deliverance": "挽魂锋镰", + "malum.gui.book.entry.void.edge_of_deliverance.description": "疯狂尖啸之人的歌谣", + "malum.gui.book.entry.page.headline.void.edge_of_deliverance": "挽魂锋镰", + "malum.gui.book.entry.page.text.void.edge_of_deliverance.1": "演进可被抵消:粗野即可压过宏 伟,终止演进。但演进是否也可 由演进抵消呢?那是当然。一把 镰刀,能让你感到熟悉的镰刀, 与斧截然不同的镰刀,我称作 “挽魂锋镰”。它就是斧的对立 面;宙界重斧锋利而沉重,挽魂 锋镰则纤细而蜿蜒。", + "malum.gui.book.entry.page.text.void.edge_of_deliverance.2": "正是这一特征加强了宙界重斧那 变化无常的力量;它也会寻求杀 戮,希冀于以血洗刃。与斧不同 的是,它若是在单次挥砍中品尝 到了血液的味道,其能力便得到 增强;由此,其攻击力度会交替 变动。", + "malum.gui.book.entry.void.malignant_stronghold_armor": "恶念要塞盔甲", "malum.gui.book.entry.void.malignant_stronghold_armor.description": "抵御必然之险", "malum.gui.book.entry.page.headline.void.malignant_stronghold_armor": "恶念要塞", diff --git a/src/main/resources/assets/malum/models/item/creative_scythe_handheld.json b/src/main/resources/assets/malum/models/item/creative_scythe_handheld.json index 81a26d497..0dff5591c 100644 --- a/src/main/resources/assets/malum/models/item/creative_scythe_handheld.json +++ b/src/main/resources/assets/malum/models/item/creative_scythe_handheld.json @@ -1,76 +1,6 @@ { - "parent": "item/handheld", + "parent": "malum:item/handheld_large", "textures": { "layer0": "malum:item/creative_scythe_huge" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - 0, - -90, - 55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 1.45 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 0, - 90, - -55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 1.45 - ] - }, - "firstperson_righthand": { - "rotation": [ - 0, - -90, - 25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 1.1 - ] - }, - "firstperson_lefthand": { - "rotation": [ - 0, - 90, - -25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 1.1 - ] - } } } \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/crude_scythe_handheld.json b/src/main/resources/assets/malum/models/item/crude_scythe_handheld.json index 5169d6eae..039983634 100644 --- a/src/main/resources/assets/malum/models/item/crude_scythe_handheld.json +++ b/src/main/resources/assets/malum/models/item/crude_scythe_handheld.json @@ -1,76 +1,6 @@ { - "parent": "item/handheld", + "parent": "malum:item/handheld_large", "textures": { "layer0": "malum:item/crude_scythe_huge" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - 0, - -90, - 55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 0, - 90, - -55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "firstperson_righthand": { - "rotation": [ - 0, - -90, - 25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - }, - "firstperson_lefthand": { - "rotation": [ - 0, - 90, - -25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - } } } \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/edge_of_deliverance.json b/src/main/resources/assets/malum/models/item/edge_of_deliverance.json new file mode 100644 index 000000000..7351f31e8 --- /dev/null +++ b/src/main/resources/assets/malum/models/item/edge_of_deliverance.json @@ -0,0 +1,15 @@ +{ + "parent": "item/handheld", + "loader": "forge:separate_transforms", + "base": { + "parent": "malum:item/edge_of_deliverance_handheld" + }, + "perspectives": { + "gui": { + "parent": "malum:item/edge_of_deliverance_gui" + }, + "fixed": { + "parent": "malum:item/edge_of_deliverance_gui" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/edge_of_deliverance_gui.json b/src/main/resources/assets/malum/models/item/edge_of_deliverance_gui.json new file mode 100644 index 000000000..5931417c2 --- /dev/null +++ b/src/main/resources/assets/malum/models/item/edge_of_deliverance_gui.json @@ -0,0 +1,6 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "malum:item/edge_of_deliverance" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/edge_of_deliverance_handheld.json b/src/main/resources/assets/malum/models/item/edge_of_deliverance_handheld.json new file mode 100644 index 000000000..f3e687159 --- /dev/null +++ b/src/main/resources/assets/malum/models/item/edge_of_deliverance_handheld.json @@ -0,0 +1,6 @@ +{ + "parent": "malum:item/handheld_large", + "textures": { + "layer0": "malum:item/edge_of_deliverance_huge" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/handheld_large.json b/src/main/resources/assets/malum/models/item/handheld_large.json new file mode 100644 index 000000000..ffa5b0501 --- /dev/null +++ b/src/main/resources/assets/malum/models/item/handheld_large.json @@ -0,0 +1,73 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ + 0, + -90, + 55 + ], + "translation": [ + 0, + 5, + 0.5 + ], + "scale": [ + 1.45, + 1.45, + 0.85 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 0, + 90, + -55 + ], + "translation": [ + 0, + 5, + 0.5 + ], + "scale": [ + 1.45, + 1.45, + 0.85 + ] + }, + "firstperson_righthand": { + "rotation": [ + 0, + -90, + 25 + ], + "translation": [ + 1.13, + 4.2, + 1.13 + ], + "scale": [ + 1.1, + 1.1, + 0.68 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 0, + 90, + -25 + ], + "translation": [ + 1.13, + 4.2, + 1.13 + ], + "scale": [ + 1.1, + 1.1, + 0.68 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/soul_stained_steel_scythe_handheld.json b/src/main/resources/assets/malum/models/item/soul_stained_steel_scythe_handheld.json index 984ab624e..7cac363f0 100644 --- a/src/main/resources/assets/malum/models/item/soul_stained_steel_scythe_handheld.json +++ b/src/main/resources/assets/malum/models/item/soul_stained_steel_scythe_handheld.json @@ -1,76 +1,6 @@ { - "parent": "item/handheld", + "parent": "malum:item/handheld_large", "textures": { "layer0": "malum:item/soul_stained_steel_scythe_huge" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - 0, - -90, - 55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 0, - 90, - -55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "firstperson_righthand": { - "rotation": [ - 0, - -90, - 25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - }, - "firstperson_lefthand": { - "rotation": [ - 0, - 90, - -25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - } } } \ No newline at end of file diff --git a/src/main/resources/assets/malum/models/item/weight_of_worlds_handheld.json b/src/main/resources/assets/malum/models/item/weight_of_worlds_handheld.json index 3cef4c2e2..aae1bb90b 100644 --- a/src/main/resources/assets/malum/models/item/weight_of_worlds_handheld.json +++ b/src/main/resources/assets/malum/models/item/weight_of_worlds_handheld.json @@ -1,76 +1,6 @@ { - "parent": "item/handheld", + "parent": "malum:item/handheld_large", "textures": { "layer0": "malum:item/weight_of_worlds_huge" - }, - "display": { - "thirdperson_righthand": { - "rotation": [ - 0, - -90, - 55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 0, - 90, - -55 - ], - "translation": [ - 0, - 5, - 0.5 - ], - "scale": [ - 1.45, - 1.45, - 0.85 - ] - }, - "firstperson_righthand": { - "rotation": [ - 0, - -90, - 25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - }, - "firstperson_lefthand": { - "rotation": [ - 0, - 90, - -25 - ], - "translation": [ - 1.13, - 4.2, - 1.13 - ], - "scale": [ - 1.1, - 1.1, - 0.68 - ] - } } } \ No newline at end of file diff --git a/src/main/resources/assets/malum/particles/heavy_slash.json b/src/main/resources/assets/malum/particles/heavy_slash.json new file mode 100644 index 000000000..c236233f6 --- /dev/null +++ b/src/main/resources/assets/malum/particles/heavy_slash.json @@ -0,0 +1,9 @@ +{ + "textures": [ + "malum:slash/heavy_slash_00", + "malum:slash/heavy_slash_01", + "malum:slash/heavy_slash_02", + "malum:slash/heavy_slash_03", + "malum:slash/heavy_slash_03" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/particles/slash.json b/src/main/resources/assets/malum/particles/slash.json new file mode 100644 index 000000000..ed1feeca8 --- /dev/null +++ b/src/main/resources/assets/malum/particles/slash.json @@ -0,0 +1,9 @@ +{ + "textures": [ + "malum:slash/slash_00", + "malum:slash/slash_01", + "malum:slash/slash_02", + "malum:slash/slash_03", + "malum:slash/slash_03" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/malum/sounds.json b/src/main/resources/assets/malum/sounds.json index 1718c2148..9d5ef9b95 100644 --- a/src/main/resources/assets/malum/sounds.json +++ b/src/main/resources/assets/malum/sounds.json @@ -36,32 +36,42 @@ "spirit_picked_up": { "sounds":["malum:curiosities/spirit/spirit_pickup1","malum:curiosities/spirit/spirit_pickup2","malum:curiosities/spirit/spirit_pickup3","malum:curiosities/spirit/spirit_pickup4"], "subtitle": "malum.subtitle.spirit_picked_up" }, "a_soul_shatters": { "sounds":["malum:curiosities/soul_shatter1","malum:curiosities/soul_shatter2","malum:curiosities/soul_shatter3"], "subtitle": "malum.subtitle.a_soul_shatters" }, - "scythe_cuts": { "sounds":["malum:curiosities/scythe/cut1","malum:curiosities/scythe/cut2","malum:curiosities/scythe/cut3"], "subtitle": "malum.subtitle.scythe_cuts" }, - "weight_of_worlds_slashes": { "sounds":["malum:curiosities/scythe/cut1","malum:curiosities/scythe/cut2","malum:curiosities/scythe/cut3"], "subtitle": "malum.subtitle.weight_of_worlds_slashes" }, + "scythe_sweeps": { "sounds":["malum:curiosities/weapons/scythe/sweep1","malum:curiosities/weapons/scythe/sweep2","malum:curiosities/weapons/scythe/sweep3","malum:curiosities/weapons/scythe/sweep4","malum:curiosities/weapons/scythe/sweep5","malum:curiosities/weapons/scythe/sweep6","malum:curiosities/weapons/scythe/sweep7"], "subtitle": "malum.subtitle.scythe_sweeps" }, + "scythe_cuts": { "sounds":["malum:curiosities/weapons/scythe/sweep1","malum:curiosities/weapons/scythe/sweep2","malum:curiosities/weapons/scythe/sweep3","malum:curiosities/weapons/scythe/sweep4","malum:curiosities/weapons/scythe/sweep5","malum:curiosities/weapons/scythe/sweep6","malum:curiosities/weapons/scythe/sweep7"], "subtitle": "malum.subtitle.scythe_cuts" }, + "edge_of_deliverance_sweeps": { "sounds":["malum:curiosities/weapons/scythe/sweep1","malum:curiosities/weapons/scythe/sweep2","malum:curiosities/weapons/scythe/sweep3","malum:curiosities/weapons/scythe/sweep4","malum:curiosities/weapons/scythe/sweep5","malum:curiosities/weapons/scythe/sweep6","malum:curiosities/weapons/scythe/sweep7"], "subtitle": "malum.subtitle.edge_of_deliverance_sweeps" }, + "edge_of_deliverance_cuts": { "sounds":["malum:curiosities/weapons/scythe/sweep1","malum:curiosities/weapons/scythe/sweep2","malum:curiosities/weapons/scythe/sweep3","malum:curiosities/weapons/scythe/sweep4","malum:curiosities/weapons/scythe/sweep5","malum:curiosities/weapons/scythe/sweep6","malum:curiosities/weapons/scythe/sweep7"], "subtitle": "malum.subtitle.edge_of_deliverance_cuts" }, - "staff_fires": { "sounds":["malum:curiosities/staff/fire1","malum:curiosities/staff/fire2"], "subtitle": "malum.subtitle.staff_fires" }, - "staff_powers_up": { "sounds":["malum:curiosities/staff/charge1","malum:curiosities/staff/charge2"], "subtitle": "malum.subtitle.staff_powers_up" }, - "staff_sizzles": { "sounds":["malum:curiosities/staff/sizzle1","malum:curiosities/staff/sizzle2"], "subtitle": "malum.subtitle.staff_sizzles" }, - "staff_charged": { "sounds":["malum:curiosities/staff/sizzle1","malum:curiosities/staff/sizzle2"], "subtitle": "malum.subtitle.staff_charged" }, - "staff_strikes": { "sounds":["malum:curiosities/staff/hit1","malum:curiosities/staff/hit2","malum:curiosities/staff/hit3","malum:curiosities/staff/hit4"], "subtitle": "malum.subtitle.staff_strikes" }, + "scythe_thrown": { "sounds":["malum:curiosities/weapons/scythe/throw1","malum:curiosities/weapons/scythe/throw2","malum:curiosities/weapons/scythe/throw3"], "subtitle": "malum.subtitle.scythe_thrown" }, + "scythe_spins_happily": { "sounds":["malum:curiosities/weapons/scythe/spin"], "subtitle": "malum.subtitle.scythe_spins_happily" }, + "scythe_caught": { "sounds":["malum:curiosities/weapons/scythe/catch1","malum:curiosities/weapons/scythe/catch2","malum:curiosities/weapons/scythe/catch3"], "subtitle": "malum.subtitle.scythe_caught" }, - "auric_flame_motif": { "sounds":["malum:curiosities/staff/auric_flame_motif1","malum:curiosities/staff/auric_flame_motif2","malum:curiosities/staff/auric_flame_motif3"]}, - "draining_motif": { "sounds":["malum:curiosities/staff/draining_motif1","malum:curiosities/staff/draining_motif2","malum:curiosities/staff/draining_motif3"]}, + "tyrving_slashes_twice": { "sounds":["malum:curiosities/weapons/tyrving/hit1", "malum:curiosities/weapons/tyrving/hit2", "malum:curiosities/weapons/tyrving/hit3", "malum:curiosities/weapons/tyrving/hit4", "malum:curiosities/weapons/tyrving/hit5"], "subtitle": "malum.subtitle.tyrving_slashes_twice" }, + "weight_of_worlds_cuts": { "sounds":["malum:curiosities/weapons/scythe/sweep1","malum:curiosities/weapons/scythe/sweep2","malum:curiosities/weapons/scythe/sweep3","malum:curiosities/weapons/scythe/sweep4","malum:curiosities/weapons/scythe/sweep5","malum:curiosities/weapons/scythe/sweep6","malum:curiosities/weapons/scythe/sweep7"], "subtitle": "malum.subtitle.weight_of_worlds_cuts" }, + + "staff_fires": { "sounds":["malum:curiosities/weapons/staff/fire1","malum:curiosities/weapons/staff/fire2"], "subtitle": "malum.subtitle.staff_fires" }, + "staff_powers_up": { "sounds":["malum:curiosities/weapons/staff/charge1","malum:curiosities/weapons/staff/charge2"], "subtitle": "malum.subtitle.staff_powers_up" }, + "staff_sizzles": { "sounds":["malum:curiosities/weapons/staff/sizzle1","malum:curiosities/weapons/staff/sizzle2"], "subtitle": "malum.subtitle.staff_sizzles" }, + "staff_charged": { "sounds":["malum:curiosities/weapons/staff/sizzle1","malum:curiosities/weapons/staff/sizzle2"], "subtitle": "malum.subtitle.staff_charged" }, + "staff_strikes": { "sounds":["malum:curiosities/weapons/staff/hit1","malum:curiosities/weapons/staff/hit2","malum:curiosities/weapons/staff/hit3","malum:curiosities/weapons/staff/hit4"], "subtitle": "malum.subtitle.staff_strikes" }, + + "auric_flame_motif": { "sounds":["malum:curiosities/motifs/auric_cinders1","malum:curiosities/motifs/auric_cinders2","malum:curiosities/motifs/auric_cinders3"]}, + "draining_motif": { "sounds":["malum:curiosities/motifs/draining_bubbling1","malum:curiosities/motifs/draining_bubbling2","malum:curiosities/motifs/draining_bubbling3"]}, + "malignant_metal_motif": { "sounds":["malum:curiosities/motifs/malignant_crit1", "malum:curiosities/motifs/malignant_crit2", "malum:curiosities/motifs/malignant_crit3"]}, "the_unknown_weeps": { "sounds":["malum:weeping_well/uncanny_valley0","malum:weeping_well/uncanny_valley1"], "subtitle": "malum.subtitle.the_unknown_weeps" }, "the_void_heart_beats": { "sounds":["malum:weeping_well/void_heartbeat"], "subtitle": "malum.subtitle.the_void_heart_beats" }, "song_of_the_void": { "sounds":["malum:weeping_well/song_of_the_void0","malum:weeping_well/song_of_the_void1","malum:weeping_well/song_of_the_void2"], "subtitle": "malum.subtitle.song_of_the_void" }, "rejected_by_the_unknown": { "sounds":["malum:weeping_well/void_rejection"], "subtitle": "malum.subtitle.rejected_by_the_unknown" }, "void_transmutation": { "sounds":["malum:weeping_well/void_transmutation0","malum:weeping_well/void_transmutation1"], "subtitle": "malum.subtitle.void_transmutation" }, - "void_eats_gunk": { "sounds":["malum:curiosities/starved_trinkets/nom1", "malum:curiosities/starved_trinkets/nom2", "malum:curiosities/starved_trinkets/nom3", "malum:curiosities/starved_trinkets/nom4"], "subtitle": "malum.subtitle.void_eats_gunk" }, + "void_eats_gunk": { "sounds":["malum:curiosities/trinkets/starved/nom1", "malum:curiosities/trinkets/starved/nom2", "malum:curiosities/trinkets/starved/nom3", "malum:curiosities/trinkets/starved/nom4"], "subtitle": "malum.subtitle.void_eats_gunk" }, "totem_charges": { "sounds":["malum:totem/totem_charge1","malum:totem/totem_charge2","malum:totem/totem_charge3"], "subtitle": "malum.subtitle.totem_charges" }, "spirit_rite_activated": { "sounds":["malum:totem/totem_activate"], "subtitle": "malum.subtitle.spirit_rite_activated" }, "spirit_rite_cancelled": { "sounds":["malum:totem/totem_cancel"], "subtitle": "malum.subtitle.spirit_rite_cancelled" }, "spirit_engraved": { "sounds":["malum:totem/totem_engrave1","malum:totem/totem_engrave2","malum:totem/totem_engrave3"], "subtitle": "malum.subtitle.spirit_engraved" }, - "spirit_altar_completes_infusion": { "sounds":["malum:altar/altar_craft1","malum:altar/altar_craft2"], "subtitle": "malum.subtitle.spirit_altar_completes_infusion" }, "spirit_altar_infuses": { "sounds":["malum:altar/altar_loop"], "subtitle": "malum.subtitle.spirit_altar_infuses" }, + "spirit_altar_completes_infusion": { "sounds":["malum:altar/altar_craft1","malum:altar/altar_craft2"], "subtitle": "malum.subtitle.spirit_altar_completes_infusion" }, "spirit_altar_speeds_up": { "sounds":["malum:altar/altar_speedup1","malum:altar/altar_speedup2"], "subtitle": "malum.subtitle.spirit_altar_speeds_up" }, "spirit_altar_absorbs_item": { "sounds":["malum:altar/altar_consume1", "malum:altar/altar_consume2"], "subtitle": "malum.subtitle.spirit_altar_absorbs_item" }, "alteration_plinth_alters": { "sounds":["malum:plinth/alter1","malum:plinth/alter2","malum:plinth/alter3"], "subtitle": "malum.subtitle.alteration_plinth_alters" }, @@ -79,21 +89,27 @@ "ritual_evolution_ambience": { "sounds":["malum:ritual/ritual_loop2"], "subtitle": "malum.subtitle.ritual_evolution_ambience" }, "completed_ritual_ambience": { "sounds":["malum:ritual/ritual_loop3"], "subtitle": "malum.subtitle.completed_ritual_ambience" }, - "spirit_crucible_completes_focusing": { "sounds":["malum:crucible/crucible_craft1", "malum:crucible/crucible_craft2", "malum:crucible/crucible_craft3"], "subtitle": "malum.subtitle.spirit_crucible_completes_focusing" }, "spirit_crucible_focuses": { "sounds":["malum:crucible/crucible_loop"], "subtitle": "malum.subtitle.spirit_crucible_focuses" }, + "spirit_crucible_completes_focusing": { "sounds":["malum:crucible/crucible_craft1", "malum:crucible/crucible_craft2", "malum:crucible/crucible_craft3"], "subtitle": "malum.subtitle.spirit_crucible_completes_focusing" }, "impetus_takes_damage": { "sounds":["malum:crucible/impetus_crack1", "malum:crucible/impetus_crack2", "malum:crucible/impetus_crack3"], "subtitle": "malum.subtitle.impetus_takes_damage" }, + "repair_pylon_eagerly_hums": { "sounds":["malum:repair_pylon/repair_pylon_loop"], "subtitle": "malum.subtitle.repair_pylon_eagerly_hums" }, + "repair_pylon_begins_repairing": { "sounds":["malum:repair_pylon/repair_pylon_send1", "malum:repair_pylon/repair_pylon_send2", "malum:repair_pylon/repair_pylon_send3", "malum:repair_pylon/repair_pylon_send4"], "subtitle": "malum.subtitle.repair_pylon_begins_repairing" }, + "repair_pylon_finishes_repairing": { "sounds":["malum:repair_pylon/repair_pylon_fix1", "malum:repair_pylon/repair_pylon_fix2", "malum:repair_pylon/repair_pylon_fix3", "malum:repair_pylon/repair_pylon_fix4"], "subtitle": "malum.subtitle.repair_pylon_finishes_repairing" }, + "aerial_magic_swooshes": { "sounds":["minecraft:mob/phantom/flap1","minecraft:mob/phantom/flap2","minecraft:mob/phantom/flap3","minecraft:mob/phantom/flap4","minecraft:mob/phantom/flap5","minecraft:mob/phantom/flap6"], "subtitle": "malum.subtitle.aerial_magic_swooshes" }, - "void_slash_swooshes": { "sounds":["malum:void_slash"], "subtitle": "malum.subtitle.void_slash_swooshes" }, "concentrated_gluttony_drink": { "sounds":["malum:curiosities/concentrated_gluttony/drink1", "malum:curiosities/concentrated_gluttony/drink2"], "subtitle": "malum.subtitle.concentrated_gluttony_drink" }, - "hungry_belt_feeds": { "sounds":["malum:curiosities/starved_trinkets/nom1", "malum:curiosities/starved_trinkets/nom2", "malum:curiosities/starved_trinkets/nom3", "malum:curiosities/starved_trinkets/nom4"], "subtitle": "malum.subtitle.hungry_belt_feeds" }, - "voracious_ring_feeds": { "sounds":["malum:curiosities/starved_trinkets/nom1", "malum:curiosities/starved_trinkets/nom2", "malum:curiosities/starved_trinkets/nom3", "malum:curiosities/starved_trinkets/nom4"], "subtitle": "malum.subtitle.voracious_ring_feeds" }, - "gruesome_ring_feeds": { "sounds":["malum:curiosities/starved_trinkets/nom1", "malum:curiosities/starved_trinkets/nom2", "malum:curiosities/starved_trinkets/nom3", "malum:curiosities/starved_trinkets/nom4"], "subtitle": "malum.subtitle.gruesome_ring_feeds" }, - "flesh_ring_absorbs": { "sounds":["malum:curiosities/cancer_ring/grow1", "malum:curiosities/cancer_ring/grow2", "malum:curiosities/cancer_ring/grow3"], "subtitle": "malum.subtitle.flesh_ring_absorbs" }, - "hidden_blade_strikes": { "sounds":["malum:curiosities/hidden_blade/strike1", "malum:curiosities/hidden_blade/strike2", "malum:curiosities/hidden_blade/strike3"], "subtitle": "malum.subtitle.hidden_blade_strikes" }, - "malignant_metal_resonates": { "sounds":["malum:curiosities/hidden_blade/strike1", "malum:curiosities/hidden_blade/strike2", "malum:curiosities/hidden_blade/strike3"], "subtitle": "malum.subtitle.malignant_metal_resonates" }, + "hungry_belt_feeds": { "sounds":["malum:curiosities/trinkets/starved/nom1", "malum:curiosities/trinkets/starved/nom2", "malum:curiosities/trinkets/starved/nom3", "malum:curiosities/trinkets/starved/nom4"], "subtitle": "malum.subtitle.hungry_belt_feeds" }, + "voracious_ring_feeds": { "sounds":["malum:curiosities/trinkets/starved/nom1", "malum:curiosities/trinkets/starved/nom2", "malum:curiosities/trinkets/starved/nom3", "malum:curiosities/trinkets/starved/nom4"], "subtitle": "malum.subtitle.voracious_ring_feeds" }, + "gruesome_ring_feeds": { "sounds":["malum:curiosities/trinkets/starved/nom1", "malum:curiosities/trinkets/starved/nom2", "malum:curiosities/trinkets/starved/nom3", "malum:curiosities/trinkets/starved/nom4"], "subtitle": "malum.subtitle.gruesome_ring_feeds" }, + "flesh_ring_absorbs": { "sounds":["malum:curiosities/trinkets/cancer_ring/grow1", "malum:curiosities/trinkets/cancer_ring/grow2", "malum:curiosities/trinkets/cancer_ring/grow3"], "subtitle": "malum.subtitle.flesh_ring_absorbs" }, + "hidden_blade_charged": { "sounds":["malum:curiosities/trinkets/hidden_blade/charge"], "subtitle": "malum.subtitle.trinkets/hidden_blade_charged" }, + "hidden_blade_primed": { "sounds":["malum:curiosities/trinkets/hidden_blade/charge"], "subtitle": "malum.subtitle.trinkets/hidden_blade_primed" }, + "hidden_blade_disrupted": { "sounds":["malum:curiosities/trinkets/hidden_blade/charge"], "subtitle": "malum.subtitle.trinkets/hidden_blade_disrupted" }, + "hidden_blade_unleashed": { "sounds":["malum:curiosities/trinkets/hidden_blade/flurry1", "malum:curiosities/trinkets/hidden_blade/flurry2"], "subtitle": "malum.subtitle.trinkets/hidden_blade_unleashed" }, + "spirit_mote_created": { "sounds":["malum:curiosities/spirit_mote/created1", "malum:curiosities/spirit_mote/created2", "malum:curiosities/spirit_mote/created3"], "subtitle": "malum.subtitle.spirit_mote_created" }, "catalyst_lobber_unlocked": { "sounds":["malum:curiosities/catalyst_lobber/open1", "malum:curiosities/catalyst_lobber/open2"], "subtitle": "malum.subtitle.catalyst_lobber_unlocked" }, diff --git a/src/main/resources/assets/malum/sounds/aesthetica.ogg b/src/main/resources/assets/malum/sounds/aesthetica.ogg index bbbab14aa..f9f66ccbc 100644 Binary files a/src/main/resources/assets/malum/sounds/aesthetica.ogg and b/src/main/resources/assets/malum/sounds/aesthetica.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_consume1.ogg b/src/main/resources/assets/malum/sounds/altar/altar_consume1.ogg index f66221ae9..c7966d85f 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_consume1.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_consume1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_consume2.ogg b/src/main/resources/assets/malum/sounds/altar/altar_consume2.ogg index ea0c63d43..9994cd08c 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_consume2.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_consume2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_craft1.ogg b/src/main/resources/assets/malum/sounds/altar/altar_craft1.ogg index 2f38dc111..8734cf689 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_craft1.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_craft1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_craft2.ogg b/src/main/resources/assets/malum/sounds/altar/altar_craft2.ogg index c9b0d7348..75667f372 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_craft2.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_craft2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_loop.ogg b/src/main/resources/assets/malum/sounds/altar/altar_loop.ogg index da0814d81..fd3f9d270 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_loop.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_loop.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_speedup1.ogg b/src/main/resources/assets/malum/sounds/altar/altar_speedup1.ogg index 1e26ed9b5..0497e3203 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_speedup1.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_speedup1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/altar/altar_speedup2.ogg b/src/main/resources/assets/malum/sounds/altar/altar_speedup2.ogg index d88b75e4b..168349b6c 100644 Binary files a/src/main/resources/assets/malum/sounds/altar/altar_speedup2.ogg and b/src/main/resources/assets/malum/sounds/altar/altar_speedup2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/arcane_elegy.ogg b/src/main/resources/assets/malum/sounds/arcane_elegy.ogg index 434ec3dcd..e2d0bf7c5 100644 Binary files a/src/main/resources/assets/malum/sounds/arcane_elegy.ogg and b/src/main/resources/assets/malum/sounds/arcane_elegy.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert1.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert1.ogg index 3ad85911b..c7260c332 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert1.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert2.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert2.ogg index 7af02a71d..35ad816cf 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert2.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert3.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert3.ogg index e888d3641..150bffc69 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert3.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_insert3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove1.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove1.ogg index b26d5ed55..2559f8bd6 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove1.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove2.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove2.ogg index 09b74a776..4153ffb78 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove2.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove3.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove3.ogg index 81f039112..58af004e5 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove3.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_item_remove3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert1.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert1.ogg index 656a112c7..34503e428 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert1.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert2.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert2.ogg index d9fbdf31f..6cfa03317 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert2.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert3.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert3.ogg index f9ffc220d..d4b1a3f08 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert3.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_insert3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove1.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove1.ogg index a11c39013..2e3b518ea 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove1.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove2.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove2.ogg index 7ef0ca159..f32c7abf3 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove2.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove3.ogg b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove3.ogg index c54a56490..eb7ff713d 100644 Binary files a/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove3.ogg and b/src/main/resources/assets/malum/sounds/block_interaction/pedestal_spirit_remove3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break1.ogg index 44d78cbac..dfa1cf3ab 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break2.ogg index c5788f24e..25c82b8fa 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break3.ogg index fe79230cf..44f897235 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break4.ogg index b99b609d8..e5d379d1d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break5.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break5.ogg index b3276f841..91e6b1443 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break5.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break6.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break6.ogg index 334b7139e..0c9a0e35e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break6.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/break6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break1.ogg index 703b1fd2b..953bb92c4 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break2.ogg index eac0bc9e5..c419c111f 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break3.ogg index 97b9e6e92..ef91a7ac8 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break4.ogg index c2b7ca27b..fce8f605a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break5.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break5.ogg index fb56032c9..a607122ad 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break5.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break6.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break6.ogg index 5cd296ff1..1248950da 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break6.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/break6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit1.ogg index 1f4f56d33..fdd91bdb9 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit2.ogg index da6010baa..e6187245e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit3.ogg index 357e29f03..9689c5ad6 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit4.ogg index ca84689b2..00e18bbe5 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit5.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit5.ogg index ab83a3d89..8318b8e3c 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit5.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit6.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit6.ogg index e53d2d867..9422c2e66 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit6.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/bricks/hit6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit1.ogg index 674c20e86..fc3b4c374 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit2.ogg index 650d4e385..545c04d04 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit3.ogg index 2aa7a1466..6bca71c1c 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit4.ogg index d670a8bfb..cf672c249 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit5.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit5.ogg index b53b8a3a6..cdef5c6da 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit5.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit6.ogg b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit6.ogg index 61017262b..476dce5f2 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit6.ogg and b/src/main/resources/assets/malum/sounds/blocks/arcane_rock/hit6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break1.ogg index 83594c4d9..55c635a4a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break2.ogg index a85309222..096212d03 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break3.ogg index c24ae5dd7..48316b8f4 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break4.ogg index b6383ab2a..c3cf0a271 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/blazing_quartz/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif1.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif1.ogg index 520cb0725..3116e392b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif1.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif2.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif2.ogg index 8460a48d5..ba19846b1 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif2.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif3.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif3.ogg index 3511276c8..e515d1c02 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif3.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif4.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif4.ogg index fbd4545cf..7f8581f07 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif4.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif5.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif5.ogg index e565d9ab0..7c5e9ae74 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif5.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif6.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif6.ogg index 314824bf7..10810891d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif6.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/blight_motif6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif1.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif1.ogg index eb6b2ac30..d4deca563 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif1.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif2.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif2.ogg index 9b1d51033..010276a3e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif2.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif3.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif3.ogg index 1f92a12c4..3c4c1a657 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif3.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif4.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif4.ogg index d0c3ffcd3..e068a75f3 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif4.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif5.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif5.ogg index 95527fdb2..0fdd9c0d7 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif5.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif6.ogg b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif6.ogg index b498aff80..b2fdb6cff 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif6.ogg and b/src/main/resources/assets/malum/sounds/blocks/blight/minor_blight_motif6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break1.ogg index 73144fa64..605320a3d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break2.ogg index ae4afa1e6..3e1f554b8 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break3.ogg index 67b1f3085..c47b2d09e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break4.ogg index 083d92928..f401223da 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit1.ogg index 8a51726e1..04cf8c12e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit2.ogg index 823a74891..839a5232e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit3.ogg index f9153e9c3..2b8e9106b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit4.ogg index 1a956aa5c..1d394fa23 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/calcified_blight/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break1.ogg index 8d93494e6..5e1af1f39 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break2.ogg index 3e9501c20..2ac838e6d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break3.ogg index bac1561c8..334604209 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break4.ogg index 4a3e4474d..4af41fd38 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit1.ogg index f417e7872..84ecdcd8a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit2.ogg index e71a8783c..c6a4454df 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit3.ogg index 61bdc1d60..130ded0c6 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/cthonic_gold/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/ether/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/ether/break1.ogg index d2131dd7c..1ce1c1e53 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/ether/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/ether/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/ether/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/ether/break2.ogg index f3d6a5f77..8802f6130 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/ether/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/ether/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/ether/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/ether/break3.ogg index 7c82b8ba3..9fd1c3d93 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/ether/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/ether/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/ether/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/ether/break4.ogg index 29d6a9974..5529946e7 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/ether/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/ether/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/break1.ogg index 592a025b4..b7d59cfbe 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/break2.ogg index 472b92f03..2c05470ba 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/break3.ogg index f0bb45804..354c8b86e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/break4.ogg index 9e208a00a..e6c9c04b1 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit1.ogg index 45ebb48b5..0b55d61a7 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit2.ogg index 8775c869a..87d2fdd8e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit3.ogg index 9ff304807..9311cb781 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit4.ogg index a3061ec38..13f9da45d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/gemstone/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/gemstone/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break1.ogg index db1b71916..5f7819260 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break2.ogg index 9168d1208..a7cac1068 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break3.ogg index 6ccdfb945..da36dc729 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break4.ogg index c1915c4d0..c5a401289 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit1.ogg index 66b8a27cb..d714fb401 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit2.ogg index c37d5262e..7c1240dd4 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit3.ogg index 3443404b2..eba599e90 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit4.ogg index d90be0404..8056f381b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/hallowed_gold/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break1.ogg index 11314a383..5aaa44948 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break2.ogg index e487d7dfc..6026bc7aa 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break3.ogg index 00252c98b..f32988930 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break4.ogg index aa29034c4..956573c7a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break5.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break5.ogg index 5e3321b81..53f530b08 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break5.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/break6.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/break6.ogg index bc5f38a1e..b0854b67f 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/break6.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/break6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/button/runewood_button.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/button/runewood_button.ogg index 78ee42053..e97768e1f 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/button/runewood_button.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/button/runewood_button.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle1.ogg index 731001a76..1aaa166b9 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle2.ogg index 3070ff297..43faccfb5 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle3.ogg index cf700859d..ac9b2cf80 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/door/toggle3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle1.ogg index 9d074ed54..4862f52b9 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle2.ogg index 187f6a491..6d4b17b11 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle3.ogg index f7da4507a..aaf1d833a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/fence_gate/toggle3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break1.ogg index c950b348a..5ffc6b42d 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break2.ogg index 680a57153..29f172a68 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break3.ogg index d6f063418..029bb6021 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break4.ogg index c43016227..7a08fee5c 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step1.ogg index cea1dcf71..0c07030e3 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step2.ogg index d1d44765d..28507866b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step3.ogg index 3e53cc240..75d7073ad 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step4.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step4.ogg index 34310a211..f77f3b715 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step4.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hanging_sign/step4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit1.ogg index fb0376a42..3c216f37b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit2.ogg index 075c6145e..04819a458 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit3.ogg index 8f6e8a1be..942472404 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit4.ogg index 6974f961d..c51cd4adc 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit5.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit5.ogg index 2daac6024..1051d0666 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit5.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/hit6.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/hit6.ogg index af6f3b9c8..234c89e55 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/hit6.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/hit6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle1.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle1.ogg index c71b6220c..987f72633 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle1.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle2.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle2.ogg index 0ebc27116..676594690 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle2.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle3.ogg b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle3.ogg index 01c19bf2c..c7c057b10 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle3.ogg and b/src/main/resources/assets/malum/sounds/blocks/runewood/trapdoor/toggle3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break1.ogg index 7f3870fa9..5b22deaed 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break2.ogg index 8ad7a1dad..7e325bf95 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break3.ogg index 8d955eac5..5daf3500a 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break4.ogg index 13792d9a1..a7fd2c42e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit1.ogg index debe9b653..8f5ee04e7 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit2.ogg index 4e7e82e2c..e18143d97 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit3.ogg index e11a9034b..2e666d81b 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit4.ogg index 6fe76cb42..cb6a9211e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soul_stained_steel/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/break1.ogg index af9133454..91308f937 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/break2.ogg index 2c1758366..c2108a1ca 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/break3.ogg index 624a8efb2..a9116b513 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/break4.ogg index b3d647baa..16687f709 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break1.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break1.ogg index e1e8a7e70..3064b0921 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break2.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break2.ogg index dcee062cc..dc9cfa3e5 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break3.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break3.ogg index 7f9a979cc..2aac80364 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break4.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break4.ogg index 754c135b7..a84093876 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/break4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place1.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place1.ogg index 763bc830d..e62125fcc 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place2.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place2.ogg index 8b069f1e5..06639fe0e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place3.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place3.ogg index 16a01040b..d77aa930e 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place4.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place4.ogg index 0b96a66b0..ebfa29694 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place5.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place5.ogg index 12615a5fb..aa8c8cf70 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place5.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place6.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place6.ogg index 254c94d86..61dfe1227 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place6.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/deepslate/place6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit1.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit1.ogg index cefd7f5e4..15085b212 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit1.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit2.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit2.ogg index 435c8eb0d..b881aa113 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit2.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit3.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit3.ogg index c4caa0312..5c491a928 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit3.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit4.ogg b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit4.ogg index fec8cacd4..b3e5213af 100644 Binary files a/src/main/resources/assets/malum/sounds/blocks/soulstone/hit4.ogg and b/src/main/resources/assets/malum/sounds/blocks/soulstone/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/crucible_craft1.ogg b/src/main/resources/assets/malum/sounds/crucible/crucible_craft1.ogg index a2ce3fdff..c6650cda9 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/crucible_craft1.ogg and b/src/main/resources/assets/malum/sounds/crucible/crucible_craft1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/crucible_craft2.ogg b/src/main/resources/assets/malum/sounds/crucible/crucible_craft2.ogg index 4c1b63333..c3b56663f 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/crucible_craft2.ogg and b/src/main/resources/assets/malum/sounds/crucible/crucible_craft2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/crucible_craft3.ogg b/src/main/resources/assets/malum/sounds/crucible/crucible_craft3.ogg index 374dbf7e5..8eb969d0a 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/crucible_craft3.ogg and b/src/main/resources/assets/malum/sounds/crucible/crucible_craft3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/crucible_loop.ogg b/src/main/resources/assets/malum/sounds/crucible/crucible_loop.ogg index 76bd2864f..f9252da4b 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/crucible_loop.ogg and b/src/main/resources/assets/malum/sounds/crucible/crucible_loop.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/impetus_crack1.ogg b/src/main/resources/assets/malum/sounds/crucible/impetus_crack1.ogg index b394e7390..e41ecb1bf 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/impetus_crack1.ogg and b/src/main/resources/assets/malum/sounds/crucible/impetus_crack1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/impetus_crack2.ogg b/src/main/resources/assets/malum/sounds/crucible/impetus_crack2.ogg index 7f93f1912..e11a132b1 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/impetus_crack2.ogg and b/src/main/resources/assets/malum/sounds/crucible/impetus_crack2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/crucible/impetus_crack3.ogg b/src/main/resources/assets/malum/sounds/crucible/impetus_crack3.ogg index 8deb287e3..9d73dd19c 100644 Binary files a/src/main/resources/assets/malum/sounds/crucible/impetus_crack3.ogg and b/src/main/resources/assets/malum/sounds/crucible/impetus_crack3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment1.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment1.ogg index 5b2b8a51e..5fc83d912 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment2.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment2.ogg index 65df625e4..8ff0670a7 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/apply_augment2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment1.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment1.ogg index 937f5daec..e19bbb583 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment2.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment2.ogg index 7f446eda9..a8f355503 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/remove_augment2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields1.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields1.ogg index c086cb608..c3a0d3169 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields2.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields2.ogg index bbb948249..f9cd75dc6 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/shielding_apparatus_shields2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker1.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker1.ogg index 906a45b2f..25ab0d1c2 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker2.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker2.ogg index 1d3fe44e1..f1efbb5f1 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/tuning_fork_tinker2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates1.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates1.ogg index d3a39f24b..b820624b8 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates2.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates2.ogg index af43712c7..706f062a7 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates3.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates3.ogg index 535a5746a..ca4a90623 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates4.ogg b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates4.ogg index 0d270dcdf..1241745a6 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates4.ogg and b/src/main/resources/assets/malum/sounds/curiosities/augments/warping_engine_reverberates4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow1.ogg b/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow1.ogg deleted file mode 100644 index 691757557..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow2.ogg b/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow2.ogg deleted file mode 100644 index 1e0a0e8f9..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow3.ogg b/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow3.ogg deleted file mode 100644 index 82420ef2f..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/cancer_ring/grow3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire1.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire1.ogg index 2c5e071c1..bf72d0916 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire2.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire2.ogg index f7390acf3..50a471b24 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/fire2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load1.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load1.ogg index 9474b9723..51e97dab2 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load2.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load2.ogg index 0d41341a1..ad3a17921 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/load2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open1.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open1.ogg index 274709a5c..ad9abd7bf 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open2.ogg b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open2.ogg index 99d4726df..81442e8a3 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/catalyst_lobber/open2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink1.ogg b/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink1.ogg index 4b197cf7f..b8e9a4d44 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink2.ogg b/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink2.ogg index b541582bb..c621c209e 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/concentrated_gluttony/drink2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike1.ogg b/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike1.ogg deleted file mode 100644 index 4d31b0d59..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike2.ogg b/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike2.ogg deleted file mode 100644 index 84fdf846f..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike3.ogg b/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike3.ogg deleted file mode 100644 index c31a324b1..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/hidden_blade/strike3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders1.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders1.ogg new file mode 100644 index 000000000..2c9a07731 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders2.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders2.ogg new file mode 100644 index 000000000..ac3232dfd Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders3.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders3.ogg new file mode 100644 index 000000000..d9d513955 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/auric_cinders3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling1.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling1.ogg new file mode 100644 index 000000000..0a7222cb3 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling2.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling2.ogg new file mode 100644 index 000000000..e97f5899a Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling3.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling3.ogg new file mode 100644 index 000000000..63d6e94b0 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/draining_bubbling3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit1.ogg new file mode 100644 index 000000000..1bfb70cee Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit2.ogg new file mode 100644 index 000000000..227b88e19 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit3.ogg new file mode 100644 index 000000000..8628dd120 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/motifs/malignant_crit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut1.ogg b/src/main/resources/assets/malum/sounds/curiosities/scythe/cut1.ogg deleted file mode 100644 index 3fc71a73c..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut2.ogg b/src/main/resources/assets/malum/sounds/curiosities/scythe/cut2.ogg deleted file mode 100644 index 2fb942544..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut3.ogg b/src/main/resources/assets/malum/sounds/curiosities/scythe/cut3.ogg deleted file mode 100644 index ff4449a1a..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/scythe/cut3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter1.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter1.ogg index d333eac3a..4079af5c8 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter2.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter2.ogg index c715e57c3..120656c54 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter3.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter3.ogg index 3b8a6f24f..718eb2932 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_shatter3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_shatter3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break1.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break1.ogg index a8d7dbbe4..2b3ee30e7 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break2.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break2.ogg index d76da9e7d..3e35621f4 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/break2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg1.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg1.ogg index 4c88da1c3..219f3fbf7 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg2.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg2.ogg index bbfab171b..46f839647 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg3.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg3.ogg index ed4acb067..22049ea63 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg4.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg4.ogg index 4dd3cf79d..b48fd6a65 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg4.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/dmg4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full1.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full1.ogg index 2ed8bdfed..3fb5dbd4d 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full2.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full2.ogg index b82c63d11..3fbef4836 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/full2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow1.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow1.ogg index ca543db37..765130415 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow2.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow2.ogg index a8b158ffa..5c94ce49a 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow3.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow3.ogg index fe4918071..692d70241 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow4.ogg b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow4.ogg index bc866b4fc..0a735e372 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow4.ogg and b/src/main/resources/assets/malum/sounds/curiosities/soul_ward/grow4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle1.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle1.ogg index b6b165c66..5f444eb0e 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle2.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle2.ogg index b20995186..1b993065b 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle3.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle3.ogg index 11fb26efc..141841cb3 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle4.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle4.ogg index cbbf073db..b8b39e57d 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle4.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_idle4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup1.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup1.ogg index 0838f00e3..c9898b23c 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup2.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup2.ogg index 131e0bd97..89692b0ff 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup3.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup3.ogg index 91a811de7..0af009f29 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup4.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup4.ogg index f0c21861f..fed7826d6 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup4.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit/spirit_pickup4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created1.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created1.ogg index 235d52bfb..0eec3147f 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created1.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created2.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created2.ogg index 1c65ad493..0edd9dfa2 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created2.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created3.ogg b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created3.ogg index 1b7df6451..71ad85431 100644 Binary files a/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created3.ogg and b/src/main/resources/assets/malum/sounds/curiosities/spirit_mote/created3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif1.ogg deleted file mode 100644 index dcd4bdc5d..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif2.ogg deleted file mode 100644 index ca9479072..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif3.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif3.ogg deleted file mode 100644 index ebae1ce17..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/auric_flame_motif3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/charge1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/charge1.ogg deleted file mode 100644 index 808974163..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/charge1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/charge2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/charge2.ogg deleted file mode 100644 index bd674379f..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/charge2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif1.ogg deleted file mode 100644 index 1d5deb212..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif2.ogg deleted file mode 100644 index 650709a52..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif3.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif3.ogg deleted file mode 100644 index 52f0d00e1..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/draining_motif3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/fire1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/fire1.ogg deleted file mode 100644 index b888e11cb..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/fire1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/fire2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/fire2.ogg deleted file mode 100644 index c31dd0225..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/fire2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/hit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/hit1.ogg deleted file mode 100644 index 53e07aee3..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/hit1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/hit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/hit2.ogg deleted file mode 100644 index fbccd89c2..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/hit2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/hit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/hit3.ogg deleted file mode 100644 index 1e247cbc0..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/hit3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/hit4.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/hit4.ogg deleted file mode 100644 index 0228bf09b..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/hit4.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle1.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle1.ogg deleted file mode 100644 index edc6f6e72..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle2.ogg b/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle2.ogg deleted file mode 100644 index 28eecee46..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/staff/sizzle2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom1.ogg b/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom1.ogg deleted file mode 100644 index 9b42c1499..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom2.ogg b/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom2.ogg deleted file mode 100644 index 5c993068c..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom3.ogg b/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom3.ogg deleted file mode 100644 index 46f87a764..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom4.ogg b/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom4.ogg deleted file mode 100644 index 7cd1dcae0..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/starved_trinkets/nom4.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow1.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow1.ogg new file mode 100644 index 000000000..39b7555e0 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow2.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow2.ogg new file mode 100644 index 000000000..403ac2a26 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow3.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow3.ogg new file mode 100644 index 000000000..d4f006b62 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/cancer_ring/grow3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/charge.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/charge.ogg new file mode 100644 index 000000000..e0e29e8ff Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/charge.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry1.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry1.ogg new file mode 100644 index 000000000..97c30447e Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry2.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry2.ogg new file mode 100644 index 000000000..afd4b461e Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/hidden_blade/flurry2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom1.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom1.ogg new file mode 100644 index 000000000..3544ce809 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom2.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom2.ogg new file mode 100644 index 000000000..bcc21bf18 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom3.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom3.ogg new file mode 100644 index 000000000..377b244ff Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom4.ogg b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom4.ogg new file mode 100644 index 000000000..247fecd5a Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/trinkets/starved/nom4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit1.ogg deleted file mode 100644 index 6ba1010d4..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit1.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit2.ogg deleted file mode 100644 index ccf879c4f..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit2.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit3.ogg deleted file mode 100644 index 7c8eef6f6..000000000 Binary files a/src/main/resources/assets/malum/sounds/curiosities/tyrving/tyrving_hit3.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch1.ogg new file mode 100644 index 000000000..6cdbcd4db Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch2.ogg new file mode 100644 index 000000000..330a98193 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/catch2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/spin.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/spin.ogg new file mode 100644 index 000000000..3531f07f1 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/spin.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep1.ogg new file mode 100644 index 000000000..db8ac3842 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep2.ogg new file mode 100644 index 000000000..8425306cf Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep3.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep3.ogg new file mode 100644 index 000000000..4f5136f95 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep4.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep4.ogg new file mode 100644 index 000000000..3a5f4604b Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep5.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep5.ogg new file mode 100644 index 000000000..463d4d2d4 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep6.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep6.ogg new file mode 100644 index 000000000..ca97b65d8 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep6.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep7.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep7.ogg new file mode 100644 index 000000000..81de5bc8c Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/sweep7.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw1.ogg new file mode 100644 index 000000000..50889d602 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw2.ogg new file mode 100644 index 000000000..0a8155390 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw3.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw3.ogg new file mode 100644 index 000000000..ac19e7b85 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/scythe/throw3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge1.ogg new file mode 100644 index 000000000..0c1ef7a0e Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge2.ogg new file mode 100644 index 000000000..09f30f1c2 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/charge2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire1.ogg new file mode 100644 index 000000000..7c08707f5 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire2.ogg new file mode 100644 index 000000000..a3db36d58 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/fire2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit1.ogg new file mode 100644 index 000000000..1850d89b0 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit2.ogg new file mode 100644 index 000000000..9ecd496e6 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit3.ogg new file mode 100644 index 000000000..692ae197c Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit4.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit4.ogg new file mode 100644 index 000000000..d09d8369b Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle1.ogg new file mode 100644 index 000000000..f8bf0740a Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle2.ogg new file mode 100644 index 000000000..cbd189207 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/staff/sizzle2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit1.ogg new file mode 100644 index 000000000..dd13554e2 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit2.ogg new file mode 100644 index 000000000..c93ce4b4f Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit3.ogg new file mode 100644 index 000000000..075c17bfa Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit4.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit4.ogg new file mode 100644 index 000000000..4de1ee58b Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit5.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit5.ogg new file mode 100644 index 000000000..a09c5408d Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/hit5.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit1.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit1.ogg new file mode 100644 index 000000000..ece5d17f0 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit2.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit2.ogg new file mode 100644 index 000000000..321a49a43 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit3.ogg b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit3.ogg new file mode 100644 index 000000000..5d7d83d52 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/curiosities/weapons/tyrving/tyrving_hit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical1.ogg index 4d45e854f..ec93809be 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical2.ogg index 6d0a6df2f..c11f8fadb 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical3.ogg index 734c6aa2e..e1307c6e9 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/alchemical/equip_alchemical3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth1.ogg index 73e499c10..319ff76b5 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth2.ogg index fc9b079c3..e1cbe9d6c 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth3.ogg index af77dbbe6..2c9c852f4 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/cloth/equip_cloth3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded1.ogg index d0c02dd7f..d56f16046 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded2.ogg index 903daa234..6079f653c 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded3.ogg index 6ca226e37..3c4e91a0e 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/gilded/equip_gilded3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic1.ogg index a8316b047..acb3acd4c 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic2.ogg index a35fe185d..74d2c223a 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic3.ogg index 8b87491ad..438e757fc 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/metallic/equip_metallic3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate1.ogg index 7a13cc1dc..3814cd0f5 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate2.ogg index 0ca1a5415..968b0767f 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate3.ogg index 226384cc3..ebfc71831 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/ornate/equip_ornate3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten1.ogg index 8f9475438..85bfa677c 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten2.ogg index 32caed83b..897024638 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten3.ogg index 5c804a4d5..a573514cd 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rotten/equip_rotten3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune1.ogg index 2667b27cc..3b12020a2 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune2.ogg index b6555e87c..3bbc60c04 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune3.ogg index 1cc3e6426..90c0d83fa 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/rune/equip_rune3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void1.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void1.ogg index 1d5e030e8..f0299f501 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void1.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void2.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void2.ogg index 077aa66c2..34e019b51 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void2.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void3.ogg b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void3.ogg index 68739723b..164b34949 100644 Binary files a/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void3.ogg and b/src/main/resources/assets/malum/sounds/equip_sounds/void/equip_void3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/heavenly_organs.ogg b/src/main/resources/assets/malum/sounds/heavenly_organs.ogg index 8aeabd0ea..3f79f46d7 100644 Binary files a/src/main/resources/assets/malum/sounds/heavenly_organs.ogg and b/src/main/resources/assets/malum/sounds/heavenly_organs.ogg differ diff --git a/src/main/resources/assets/malum/sounds/plinth/alter1.ogg b/src/main/resources/assets/malum/sounds/plinth/alter1.ogg index a003e5ce8..1a0a27ebc 100644 Binary files a/src/main/resources/assets/malum/sounds/plinth/alter1.ogg and b/src/main/resources/assets/malum/sounds/plinth/alter1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/plinth/alter2.ogg b/src/main/resources/assets/malum/sounds/plinth/alter2.ogg index 437a7e615..e841daeca 100644 Binary files a/src/main/resources/assets/malum/sounds/plinth/alter2.ogg and b/src/main/resources/assets/malum/sounds/plinth/alter2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/plinth/alter3.ogg b/src/main/resources/assets/malum/sounds/plinth/alter3.ogg index 7c2805ea1..a217aa306 100644 Binary files a/src/main/resources/assets/malum/sounds/plinth/alter3.ogg and b/src/main/resources/assets/malum/sounds/plinth/alter3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix1.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix1.ogg new file mode 100644 index 000000000..b7ee14ca2 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix2.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix2.ogg new file mode 100644 index 000000000..0c135f7a7 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix3.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix3.ogg new file mode 100644 index 000000000..bbec8afb8 Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix4.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix4.ogg new file mode 100644 index 000000000..b3f39409b Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_fix4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_loop.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_loop.ogg new file mode 100644 index 000000000..e9004417e Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_loop.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send1.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send1.ogg new file mode 100644 index 000000000..2de1442fa Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send2.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send2.ogg new file mode 100644 index 000000000..69fc693ad Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send3.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send3.ogg new file mode 100644 index 000000000..2ee96613d Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send4.ogg b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send4.ogg new file mode 100644 index 000000000..cff9e6a4e Binary files /dev/null and b/src/main/resources/assets/malum/sounds/repair_pylon/repair_pylon_send4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item1.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item1.ogg index 638f96588..6cdb25003 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item1.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item2.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item2.ogg index 52bee7eb0..a02d09eae 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item2.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item3.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item3.ogg index 41aa46c15..1dd87e58a 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item3.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_item3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit1.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit1.ogg index ab9bff00b..c6a018893 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit1.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit2.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit2.ogg index 2053f837a..3dc6c6205 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit2.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit3.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit3.ogg index b1b0c6938..20bf4d904 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit3.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit4.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit4.ogg index 601f01b51..f76046f2e 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit4.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_absorb_spirit4.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up1.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up1.ogg index bb87748e0..7c1b5d963 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up1.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up2.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up2.ogg index cafd61ede..e8a8980ff 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up2.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up_max.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up_max.ogg index 99a2802e3..5ac754c80 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_level_up_max.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_level_up_max.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_loop1.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_loop1.ogg index 29b54b59c..2c878355d 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_loop1.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_loop1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_loop2.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_loop2.ogg index d0aaca635..934dd4d8c 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_loop2.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_loop2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_loop3.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_loop3.ogg index 1fb11ecf4..da7096286 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_loop3.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_loop3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_stage2.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_stage2.ogg index e2e100cf4..9e0260871 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_stage2.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_stage2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/ritual/ritual_start.ogg b/src/main/resources/assets/malum/sounds/ritual/ritual_start.ogg index 8a355bf06..3c7dc15f6 100644 Binary files a/src/main/resources/assets/malum/sounds/ritual/ritual_start.ogg and b/src/main/resources/assets/malum/sounds/ritual/ritual_start.ogg differ diff --git a/src/main/resources/assets/malum/sounds/runic_workbench/craft1.ogg b/src/main/resources/assets/malum/sounds/runic_workbench/craft1.ogg index 5f04d3115..9bf112b78 100644 Binary files a/src/main/resources/assets/malum/sounds/runic_workbench/craft1.ogg and b/src/main/resources/assets/malum/sounds/runic_workbench/craft1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/runic_workbench/craft2.ogg b/src/main/resources/assets/malum/sounds/runic_workbench/craft2.ogg index 067053bd4..b761647e3 100644 Binary files a/src/main/resources/assets/malum/sounds/runic_workbench/craft2.ogg and b/src/main/resources/assets/malum/sounds/runic_workbench/craft2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/suspicious_sound.ogg b/src/main/resources/assets/malum/sounds/suspicious_sound.ogg index deae3f1fc..4dcecb98d 100644 Binary files a/src/main/resources/assets/malum/sounds/suspicious_sound.ogg and b/src/main/resources/assets/malum/sounds/suspicious_sound.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_activate.ogg b/src/main/resources/assets/malum/sounds/totem/totem_activate.ogg index 4827da893..545f5b511 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_activate.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_activate.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_cancel.ogg b/src/main/resources/assets/malum/sounds/totem/totem_cancel.ogg index c15752f5c..96da5b2ca 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_cancel.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_cancel.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_charge1.ogg b/src/main/resources/assets/malum/sounds/totem/totem_charge1.ogg index 4b42f01a5..d58fe9b6f 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_charge1.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_charge1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_charge2.ogg b/src/main/resources/assets/malum/sounds/totem/totem_charge2.ogg index 9d7897947..ede05b60d 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_charge2.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_charge2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_charge3.ogg b/src/main/resources/assets/malum/sounds/totem/totem_charge3.ogg index 3fd1be6d6..fef4fb923 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_charge3.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_charge3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_engrave1.ogg b/src/main/resources/assets/malum/sounds/totem/totem_engrave1.ogg index 7acdd4862..06b6a24cf 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_engrave1.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_engrave1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_engrave2.ogg b/src/main/resources/assets/malum/sounds/totem/totem_engrave2.ogg index 6e06f3605..f873072f3 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_engrave2.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_engrave2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/totem/totem_engrave3.ogg b/src/main/resources/assets/malum/sounds/totem/totem_engrave3.ogg index 7eb95cf6d..9c2c8495d 100644 Binary files a/src/main/resources/assets/malum/sounds/totem/totem_engrave3.ogg and b/src/main/resources/assets/malum/sounds/totem/totem_engrave3.ogg differ diff --git a/src/main/resources/assets/malum/sounds/void_slash.ogg b/src/main/resources/assets/malum/sounds/void_slash.ogg deleted file mode 100644 index 5ab4c0d1e..000000000 Binary files a/src/main/resources/assets/malum/sounds/void_slash.ogg and /dev/null differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void0.ogg b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void0.ogg index d5f7282b3..727b32fd1 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void0.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void0.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void1.ogg b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void1.ogg index 0e32bc312..968e286ac 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void1.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void2.ogg b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void2.ogg index e09053930..a8b180b27 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void2.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/song_of_the_void2.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley0.ogg b/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley0.ogg index 1f4a4dd41..b15897de4 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley0.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley0.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley1.ogg b/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley1.ogg index 184d25421..c1c01257b 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley1.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/uncanny_valley1.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/void_heartbeat.ogg b/src/main/resources/assets/malum/sounds/weeping_well/void_heartbeat.ogg index a84fb617c..964dc898b 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/void_heartbeat.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/void_heartbeat.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/void_rejection.ogg b/src/main/resources/assets/malum/sounds/weeping_well/void_rejection.ogg index 20d1d2fdf..dcb339a61 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/void_rejection.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/void_rejection.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation0.ogg b/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation0.ogg index 88f8fb647..ec4f81428 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation0.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation0.ogg differ diff --git a/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation1.ogg b/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation1.ogg index c385b3e4f..be0f256fa 100644 Binary files a/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation1.ogg and b/src/main/resources/assets/malum/sounds/weeping_well/void_transmutation1.ogg differ diff --git a/src/main/resources/assets/malum/textures/gui/hud/hidden_blade.png b/src/main/resources/assets/malum/textures/gui/hud/hidden_blade.png new file mode 100644 index 000000000..39c419bc5 Binary files /dev/null and b/src/main/resources/assets/malum/textures/gui/hud/hidden_blade.png differ diff --git a/src/main/resources/assets/malum/textures/gui/soul_ward/nonbinary_pride.png b/src/main/resources/assets/malum/textures/gui/hud/nonbinary_pride.png similarity index 100% rename from src/main/resources/assets/malum/textures/gui/soul_ward/nonbinary_pride.png rename to src/main/resources/assets/malum/textures/gui/hud/nonbinary_pride.png diff --git a/src/main/resources/assets/malum/textures/gui/soul_ward/rainbow_pride.png b/src/main/resources/assets/malum/textures/gui/hud/rainbow_pride.png similarity index 100% rename from src/main/resources/assets/malum/textures/gui/soul_ward/rainbow_pride.png rename to src/main/resources/assets/malum/textures/gui/hud/rainbow_pride.png diff --git a/src/main/resources/assets/malum/textures/gui/hud/soul_ward.png b/src/main/resources/assets/malum/textures/gui/hud/soul_ward.png new file mode 100644 index 000000000..7aa35ef76 Binary files /dev/null and b/src/main/resources/assets/malum/textures/gui/hud/soul_ward.png differ diff --git a/src/main/resources/assets/malum/textures/gui/soul_ward/trans_pride.png b/src/main/resources/assets/malum/textures/gui/hud/trans_pride.png similarity index 100% rename from src/main/resources/assets/malum/textures/gui/soul_ward/trans_pride.png rename to src/main/resources/assets/malum/textures/gui/hud/trans_pride.png diff --git a/src/main/resources/assets/malum/textures/gui/soul_ward/default.png b/src/main/resources/assets/malum/textures/gui/soul_ward/default.png deleted file mode 100644 index 75b2fa9b0..000000000 Binary files a/src/main/resources/assets/malum/textures/gui/soul_ward/default.png and /dev/null differ diff --git a/src/main/resources/assets/malum/textures/item/edge_of_deliverance.png b/src/main/resources/assets/malum/textures/item/edge_of_deliverance.png new file mode 100644 index 000000000..e066643f5 Binary files /dev/null and b/src/main/resources/assets/malum/textures/item/edge_of_deliverance.png differ diff --git a/src/main/resources/assets/malum/textures/item/edge_of_deliverance_huge.png b/src/main/resources/assets/malum/textures/item/edge_of_deliverance_huge.png new file mode 100644 index 000000000..05073bd71 Binary files /dev/null and b/src/main/resources/assets/malum/textures/item/edge_of_deliverance_huge.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_alchemical_mastery.png b/src/main/resources/assets/malum/textures/item/ring_of_alchemical_mastery.png index 6c3e4f361..b1a2957f5 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_alchemical_mastery.png and b/src/main/resources/assets/malum/textures/item/ring_of_alchemical_mastery.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_arcane_prowess.png b/src/main/resources/assets/malum/textures/item/ring_of_arcane_prowess.png index 65133d10a..577262de7 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_arcane_prowess.png and b/src/main/resources/assets/malum/textures/item/ring_of_arcane_prowess.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_curative_talent.png b/src/main/resources/assets/malum/textures/item/ring_of_curative_talent.png index 9f6738c65..e8d544096 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_curative_talent.png and b/src/main/resources/assets/malum/textures/item/ring_of_curative_talent.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_echoing_arcana.png b/src/main/resources/assets/malum/textures/item/ring_of_echoing_arcana.png new file mode 100644 index 000000000..321898989 Binary files /dev/null and b/src/main/resources/assets/malum/textures/item/ring_of_echoing_arcana.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_growing_flesh.png b/src/main/resources/assets/malum/textures/item/ring_of_growing_flesh.png index 4ccb68c2f..f0f9ddd10 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_growing_flesh.png and b/src/main/resources/assets/malum/textures/item/ring_of_growing_flesh.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_gruesome_concentration.png b/src/main/resources/assets/malum/textures/item/ring_of_gruesome_concentration.png index 419faf4e1..96f32fc26 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_gruesome_concentration.png and b/src/main/resources/assets/malum/textures/item/ring_of_gruesome_concentration.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_manaweaving.png b/src/main/resources/assets/malum/textures/item/ring_of_manaweaving.png new file mode 100644 index 000000000..23b305c84 Binary files /dev/null and b/src/main/resources/assets/malum/textures/item/ring_of_manaweaving.png differ diff --git a/src/main/resources/assets/malum/textures/item/ring_of_the_endless_well.png b/src/main/resources/assets/malum/textures/item/ring_of_the_endless_well.png index 7d0df882b..93e01dbfa 100644 Binary files a/src/main/resources/assets/malum/textures/item/ring_of_the_endless_well.png and b/src/main/resources/assets/malum/textures/item/ring_of_the_endless_well.png differ diff --git a/src/main/resources/assets/malum/textures/item/weight_of_worlds_huge.png b/src/main/resources/assets/malum/textures/item/weight_of_worlds_huge.png index e3b923b9b..697bb530d 100644 Binary files a/src/main/resources/assets/malum/textures/item/weight_of_worlds_huge.png and b/src/main/resources/assets/malum/textures/item/weight_of_worlds_huge.png differ diff --git a/src/main/resources/assets/malum/textures/mob_effect/imminent_deliverance.png b/src/main/resources/assets/malum/textures/mob_effect/imminent_deliverance.png new file mode 100644 index 000000000..05795bcfe Binary files /dev/null and b/src/main/resources/assets/malum/textures/mob_effect/imminent_deliverance.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_00.png b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_00.png new file mode 100644 index 000000000..42a27726c Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_00.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_01.png b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_01.png new file mode 100644 index 000000000..220d75508 Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_01.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_02.png b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_02.png new file mode 100644 index 000000000..65f7b405c Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_02.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_03.png b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_03.png new file mode 100644 index 000000000..5ee827764 Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/heavy_slash_03.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/slash_00.png b/src/main/resources/assets/malum/textures/particle/slash/slash_00.png new file mode 100644 index 000000000..35acfee3a Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/slash_00.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/slash_01.png b/src/main/resources/assets/malum/textures/particle/slash/slash_01.png new file mode 100644 index 000000000..667fb7aa1 Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/slash_01.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/slash_02.png b/src/main/resources/assets/malum/textures/particle/slash/slash_02.png new file mode 100644 index 000000000..4fd8f3e38 Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/slash_02.png differ diff --git a/src/main/resources/assets/malum/textures/particle/slash/slash_03.png b/src/main/resources/assets/malum/textures/particle/slash/slash_03.png new file mode 100644 index 000000000..7b4f4c6d1 Binary files /dev/null and b/src/main/resources/assets/malum/textures/particle/slash/slash_03.png differ diff --git a/src/main/resources/assets/malum/textures/vfx/t.png b/src/main/resources/assets/malum/textures/vfx/t.png deleted file mode 100644 index 2df9ed85b..000000000 Binary files a/src/main/resources/assets/malum/textures/vfx/t.png and /dev/null differ diff --git a/src/main/resources/assets/malum/textures/vfx/tt.png b/src/main/resources/assets/malum/textures/vfx/tt.png deleted file mode 100644 index 2891af665..000000000 Binary files a/src/main/resources/assets/malum/textures/vfx/tt.png and /dev/null differ diff --git a/src/main/resources/data/malum/damage_type/hidden_blade_counter.json b/src/main/resources/data/malum/damage_type/hidden_blade_counter.json new file mode 100644 index 000000000..add712467 --- /dev/null +++ b/src/main/resources/data/malum/damage_type/hidden_blade_counter.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "hidden_blade_counter", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/main/resources/data/malum/damage_type/scythe_melee.json b/src/main/resources/data/malum/damage_type/scythe_melee.json new file mode 100644 index 000000000..9f7671c0f --- /dev/null +++ b/src/main/resources/data/malum/damage_type/scythe_melee.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "scythe_melee", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/scythe_proficiency.json b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/max_mana.json similarity index 54% rename from src/main/resources/data/malum/malignant_conversion_data/scythe_proficiency.json rename to src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/max_mana.json index b541d608c..a78de7609 100644 --- a/src/main/resources/data/malum/malignant_conversion_data/scythe_proficiency.json +++ b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/max_mana.json @@ -1,13 +1,14 @@ { - "source_attribute": "lodestone:scythe_proficiency", + "source_attribute": "irons_spellbooks:max_mana", + "ignore_base_value": "true", "target_attributes": [ { "attribute": "minecraft:generic.armor", - "ratio": "1.0" + "ratio": "0.04" }, { "attribute": "lodestone:magic_resistance", - "ratio": "1.0" + "ratio": "0.04" } ] } \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/misc.json b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/misc.json new file mode 100644 index 000000000..8dbd6791d --- /dev/null +++ b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/misc.json @@ -0,0 +1,17 @@ +{ + "source_attributes": [ + "irons_spellbooks:mana_regen", "irons_spellbooks:cooldown_reduction", + "irons_spellbooks:cast_time_reduction", "irons_spellbooks:summon_damage" + ], + "ignore_base_value": "true", + "target_attributes": [ + { + "attribute": "minecraft:generic.armor", + "ratio": "10" + }, + { + "attribute": "minecraft:generic.armor_toughness", + "ratio": "5" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/powers.json b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/powers.json new file mode 100644 index 000000000..5508069d6 --- /dev/null +++ b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/powers.json @@ -0,0 +1,20 @@ +{ + "source_attributes": [ + "irons_spellbooks:spell_power", "irons_spellbooks:fire_spell_power", + "irons_spellbooks:ice_spell_power", "irons_spellbooks:lightning_spell_power", + "irons_spellbooks:holy_spell_power", "irons_spellbooks:ender_spell_power", + "irons_spellbooks:blood_spell_power", "irons_spellbooks:evocation_spell_power", + "irons_spellbooks:nature_spell_power", "irons_spellbooks:eldritch_spell_power" + ], + "ignore_base_value": "true", + "target_attributes": [ + { + "attribute": "minecraft:generic.armor", + "ratio": "10" + }, + { + "attribute": "minecraft:generic.armor_toughness", + "ratio": "5" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/resistances.json b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/resistances.json new file mode 100644 index 000000000..111e096ac --- /dev/null +++ b/src/main/resources/data/malum/malignant_conversion_data/irons_spells_and_books/resistances.json @@ -0,0 +1,20 @@ +{ + "source_attributes": [ + "irons_spellbooks:spell_resist", "irons_spellbooks:fire_magic_resist", + "irons_spellbooks:ice_magic_resist", "irons_spellbooks:lightning_magic_resist", + "irons_spellbooks:holy_magic_resist", "irons_spellbooks:ender_magic_resist", + "irons_spellbooks:blood_magic_resist", "irons_spellbooks:evocation_magic_resist", + "irons_spellbooks:nature_magic_resist", "irons_spellbooks:eldritch_magic_resist" + ], + "ignore_base_value": "true", + "target_attributes": [ + { + "attribute": "minecraft:generic.armor", + "ratio": "10" + }, + { + "attribute": "minecraft:generic.armor_toughness", + "ratio": "5" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/magic_proficiency.json b/src/main/resources/data/malum/malignant_conversion_data/magic_proficiency.json index 1f29895aa..3b75f5dc0 100644 --- a/src/main/resources/data/malum/malignant_conversion_data/magic_proficiency.json +++ b/src/main/resources/data/malum/malignant_conversion_data/magic_proficiency.json @@ -1,14 +1,15 @@ { "source_attribute": "lodestone:magic_proficiency", "ratio" : "0.5", + "ignore_base_value": "true", "target_attributes": [ { "attribute": "minecraft:generic.armor", - "ratio": "1.0" + "ratio": "10" }, { "attribute": "lodestone:magic_resistance", - "ratio": "1.0" + "ratio": "0.25" } ] } \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_capacity.json b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_capacity.json index a1f5ae9f8..df8bc9c5b 100644 --- a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_capacity.json +++ b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_capacity.json @@ -4,10 +4,6 @@ { "attribute": "minecraft:generic.armor", "ratio": "1.0" - }, - { - "attribute": "lodestone:magic_resistance", - "ratio": "1.0" } ] } \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_recovery_rate.json b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_recovery_rate.json index e6c01659e..385e3dbe5 100644 --- a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_recovery_rate.json +++ b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_recovery_rate.json @@ -1,13 +1,14 @@ { "source_attribute": "malum:soul_ward_recovery_rate", + "ignore_base_value": "true", "target_attributes": [ { - "attribute": "minecraft:generic.armor_toughness", - "ratio": "2.0" + "attribute": "minecraft:generic.armor", + "ratio": "10.0" }, { "attribute": "lodestone:magic_resistance", - "ratio": "2.0" + "ratio": "1.0" } ] } \ No newline at end of file diff --git a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_strength.json b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_strength.json index f310a552a..d3ac16b5b 100644 --- a/src/main/resources/data/malum/malignant_conversion_data/soul_ward_strength.json +++ b/src/main/resources/data/malum/malignant_conversion_data/soul_ward_strength.json @@ -1,9 +1,10 @@ { "source_attribute": "malum:soul_ward_strength", + "ignore_base_value": "true", "target_attributes": [ { - "attribute": "minecraft:generic.armor", - "ratio": "2.0" + "attribute": "minecraft:generic.armor_toughness", + "ratio": "10.0" }, { "attribute": "lodestone:magic_resistance", diff --git a/src/main/resources/data/malum/spirit_data/entity/embers/ancient_golem.json b/src/main/resources/data/malum/spirit_data/entity/embers/ancient_golem.json new file mode 100644 index 000000000..fa14b6e44 --- /dev/null +++ b/src/main/resources/data/malum/spirit_data/entity/embers/ancient_golem.json @@ -0,0 +1,18 @@ +{ + "registry_name": "embers:ancient_golem", + "primary_type": "infernal", + "spirits": [ + { + "spirit": "infernal", + "count": 1 + }, + { + "spirit": "arcane", + "count": 2 + }, + { + "spirit": "wicked", + "count": 1 + } + ] +} diff --git a/src/main/resources/data/malum/spirit_data/entity/spectrum/preservation_turret.json b/src/main/resources/data/malum/spirit_data/entity/spectrum/preservation_turret.json index a37128228..781b8a302 100644 --- a/src/main/resources/data/malum/spirit_data/entity/spectrum/preservation_turret.json +++ b/src/main/resources/data/malum/spirit_data/entity/spectrum/preservation_turret.json @@ -1,14 +1,3 @@ { - "registry_name": "spectrum:preservation_turrets", - "primary_type": "earthen", - "spirits": [ - { - "spirit": "earthen", - "count": 4 - }, - { - "spirit": "arcane", - "count": 1 - } - ] + "registry_name": "spectrum:preservation_turrets" } diff --git a/src/main/resources/data/malum/spirit_data/entity/sullysmod/bouldering_zombie.json b/src/main/resources/data/malum/spirit_data/entity/sullysmod/bouldering_zombie.json new file mode 100644 index 000000000..b689a10ae --- /dev/null +++ b/src/main/resources/data/malum/spirit_data/entity/sullysmod/bouldering_zombie.json @@ -0,0 +1,14 @@ +{ + "registry_name": "sullysmod:bouldering_zombie", + "primary_type": "wicked", + "spirits": [ + { + "spirit": "wicked", + "count": 1 + }, + { + "spirit": "earthen", + "count": 2 + } + ] +} diff --git a/src/main/resources/data/malum/spirit_data/entity/sullysmod/jungle_spider.json b/src/main/resources/data/malum/spirit_data/entity/sullysmod/jungle_spider.json new file mode 100644 index 000000000..3652ba5b8 --- /dev/null +++ b/src/main/resources/data/malum/spirit_data/entity/sullysmod/jungle_spider.json @@ -0,0 +1,18 @@ +{ + "registry_name": "sullysmod:jungle_spider", + "primary_type": "aerial", + "spirits": [ + { + "spirit": "wicked", + "count": 1 + }, + { + "spirit": "aerial", + "count": 1 + }, + { + "spirit": "earthen", + "count": 1 + } + ] +} diff --git a/src/main/resources/data/malum/weapon_attributes/edge_of_deliverance.json b/src/main/resources/data/malum/weapon_attributes/edge_of_deliverance.json new file mode 100644 index 000000000..965ff070d --- /dev/null +++ b/src/main/resources/data/malum/weapon_attributes/edge_of_deliverance.json @@ -0,0 +1,3 @@ +{ + "parent": "bettercombat:scythe" +} \ No newline at end of file diff --git a/src/main/resources/data/malum/weapon_attributes/weight_of_worlds.json b/src/main/resources/data/malum/weapon_attributes/weight_of_worlds.json index 6db48eab5..965ff070d 100644 --- a/src/main/resources/data/malum/weapon_attributes/weight_of_worlds.json +++ b/src/main/resources/data/malum/weapon_attributes/weight_of_worlds.json @@ -1,3 +1,3 @@ { - "parent": "bettercombat:hammer" + "parent": "bettercombat:scythe" } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/advancements/recipes/brewing/magma_cream.json b/src/main/resources/data/minecraft/advancements/recipes/brewing/magma_cream.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/brewing/magma_cream.json rename to src/main/resources/data/minecraft/advancements/recipes/brewing/magma_cream.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/building_blocks/diorite.json b/src/main/resources/data/minecraft/advancements/recipes/building_blocks/diorite.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/building_blocks/diorite.json rename to src/main/resources/data/minecraft/advancements/recipes/building_blocks/diorite.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/building_blocks/granite.json b/src/main/resources/data/minecraft/advancements/recipes/building_blocks/granite.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/building_blocks/granite.json rename to src/main/resources/data/minecraft/advancements/recipes/building_blocks/granite.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/building_blocks/quartz_block.json b/src/main/resources/data/minecraft/advancements/recipes/building_blocks/quartz_block.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/building_blocks/quartz_block.json rename to src/main/resources/data/minecraft/advancements/recipes/building_blocks/quartz_block.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/redstone/comparator.json b/src/main/resources/data/minecraft/advancements/recipes/redstone/comparator.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/redstone/comparator.json rename to src/main/resources/data/minecraft/advancements/recipes/redstone/comparator.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/redstone/daylight_detector.json b/src/main/resources/data/minecraft/advancements/recipes/redstone/daylight_detector.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/redstone/daylight_detector.json rename to src/main/resources/data/minecraft/advancements/recipes/redstone/daylight_detector.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/redstone/observer.json b/src/main/resources/data/minecraft/advancements/recipes/redstone/observer.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/redstone/observer.json rename to src/main/resources/data/minecraft/advancements/recipes/redstone/observer.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/redstone/slime_block.json b/src/main/resources/data/minecraft/advancements/recipes/redstone/slime_block.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/redstone/slime_block.json rename to src/main/resources/data/minecraft/advancements/recipes/redstone/slime_block.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/redstone/sticky_piston.json b/src/main/resources/data/minecraft/advancements/recipes/redstone/sticky_piston.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/redstone/sticky_piston.json rename to src/main/resources/data/minecraft/advancements/recipes/redstone/sticky_piston.json diff --git a/src/generated/resources/data/minecraft/advancements/recipes/tools/lead.json b/src/main/resources/data/minecraft/advancements/recipes/tools/lead.json similarity index 100% rename from src/generated/resources/data/minecraft/advancements/recipes/tools/lead.json rename to src/main/resources/data/minecraft/advancements/recipes/tools/lead.json diff --git a/src/generated/resources/data/minecraft/recipes/comparator.json b/src/main/resources/data/minecraft/recipes/comparator.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/comparator.json rename to src/main/resources/data/minecraft/recipes/comparator.json diff --git a/src/generated/resources/data/minecraft/recipes/daylight_detector.json b/src/main/resources/data/minecraft/recipes/daylight_detector.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/daylight_detector.json rename to src/main/resources/data/minecraft/recipes/daylight_detector.json diff --git a/src/generated/resources/data/minecraft/recipes/diorite.json b/src/main/resources/data/minecraft/recipes/diorite.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/diorite.json rename to src/main/resources/data/minecraft/recipes/diorite.json diff --git a/src/generated/resources/data/minecraft/recipes/granite.json b/src/main/resources/data/minecraft/recipes/granite.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/granite.json rename to src/main/resources/data/minecraft/recipes/granite.json diff --git a/src/generated/resources/data/minecraft/recipes/lead.json b/src/main/resources/data/minecraft/recipes/lead.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/lead.json rename to src/main/resources/data/minecraft/recipes/lead.json diff --git a/src/generated/resources/data/minecraft/recipes/magma_cream.json b/src/main/resources/data/minecraft/recipes/magma_cream.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/magma_cream.json rename to src/main/resources/data/minecraft/recipes/magma_cream.json diff --git a/src/generated/resources/data/minecraft/recipes/observer.json b/src/main/resources/data/minecraft/recipes/observer.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/observer.json rename to src/main/resources/data/minecraft/recipes/observer.json diff --git a/src/generated/resources/data/minecraft/recipes/quartz_block.json b/src/main/resources/data/minecraft/recipes/quartz_block.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/quartz_block.json rename to src/main/resources/data/minecraft/recipes/quartz_block.json diff --git a/src/generated/resources/data/minecraft/recipes/slime_block.json b/src/main/resources/data/minecraft/recipes/slime_block.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/slime_block.json rename to src/main/resources/data/minecraft/recipes/slime_block.json diff --git a/src/generated/resources/data/minecraft/recipes/sticky_piston.json b/src/main/resources/data/minecraft/recipes/sticky_piston.json similarity index 100% rename from src/generated/resources/data/minecraft/recipes/sticky_piston.json rename to src/main/resources/data/minecraft/recipes/sticky_piston.json diff --git a/src/main/resources/data/tetra/materials/metal/malignant_pewter.json b/src/main/resources/data/tetra/materials/metal/malignant_pewter.json new file mode 100644 index 000000000..24d1751ec --- /dev/null +++ b/src/main/resources/data/tetra/materials/metal/malignant_pewter.json @@ -0,0 +1,32 @@ +{ + "key": "soul_stained_steel", + "category": "metal", + "primary": "8.0", + "secondary": "3.5", + "tertiary": "4.0", + "durability": "2500", + "integrityCost": "2", + "integrityGain": "7", + "magicCapacity": "120", + "toolLevel": "minecraft:diamond", + "toolEfficiency": "9.0", + "tints": { + "glyph": "eccef6", + "texture": "eccef6" + }, + "textures": [ + "metal", + "default" + ], + "material": { + "items": [ + "malum:malignant_pewter_ingot" + ] + }, + "improvements": { + "malum.soul_strike": 0 + }, + "requiredTools": { + "hammer_dig": "minecraft:netherite" + } +} \ No newline at end of file