diff --git a/1.20.1-FearFactoryTest/minecraft/shaderpacks/ComplementaryUnbound_r5.5.1test.txt b/1.20.1-FearFactoryTest/minecraft/shaderpacks/ComplementaryUnbound_r5.5.1test.txt index c8b0e81..a01b4a6 100644 --- a/1.20.1-FearFactoryTest/minecraft/shaderpacks/ComplementaryUnbound_r5.5.1test.txt +++ b/1.20.1-FearFactoryTest/minecraft/shaderpacks/ComplementaryUnbound_r5.5.1test.txt @@ -1,24 +1,34 @@ -#Sun May 25 06:28:48 CDT 2025 +#Tue May 27 02:27:05 CDT 2025 +GLOWING_ORE_NETHERQUARTZ=false AURORA_CONDITION=4 CLOUD_STYLE_DEFINE=3 WATER_STYLE_DEFINE=3 ATM_FOG_DISTANCE=10 MOON_PHASE_INF_LIGHT=true WB_DB_DAY_I=9.0 +GLOWING_ORE_IRON=false MOON_PHASE_FULL=0.70 SUN_ANGLE=-40 +GLOWING_ORE_DIAMOND=false LIGHT_NIGHT_I=0.60 +GLOWING_ORE_MODDED=false ATM_FOG_ALTITUDE=70 +GLOWING_ORE_LAPIS=false MOON_PHASE_DARK=0.45 +GLOWING_ORE_GOLD=false PIXELATED_AO=true +GLOWING_ORE_NETHERGOLD=false NIGHT_NEBULA=true +GLOWING_ORE_EMERALD=false BLOCK_REFLECT_QUALITY=1 SUN_MOON_STYLE_DEFINE=2 XLIGHT_R=0.65 WB_DB_RAIN_I=18.0 RAIN_STYLE=2 +GLOWING_ORE_REDSTONE=false XLIGHT_G=0.65 XLIGHT_B=0.65 +GLOWING_ORE_GILDEDBLACKSTONE=false CHROMA_ABERRATION=2 AURORA_STYLE_DEFINE=2 HELD_LIGHTING_MODE=1 @@ -40,13 +50,14 @@ WB_DB_WATER_I=24.0 LIGHT_MORNING_I=0.50 LIGHT_MORNING_G=0.85 LIGHT_NOON_G=0.85 +GLOWING_ORE_COPPER=false +GLOWING_ORE_ANCIENTDEBRIS=false LIGHT_NOON_I=1.10 LIGHT_NOON_B=0.85 WB_DOF_FOCUS=1 WB_DB_NETHER_I=18.0 SHADOW_QUALITY=0 MOON_PHASE_PARTIAL=0.55 -GLOWING_ORE_MASTER=0 WB_CHROMATIC=true WATER_BUMPINESS=1.00 BLOOM_STRENGTH=0.045 diff --git a/OminousDarkness-main/.gitattributes b/OminousDarkness-main/.gitattributes new file mode 100644 index 0000000..f811f6a --- /dev/null +++ b/OminousDarkness-main/.gitattributes @@ -0,0 +1,5 @@ +# Disable autocrlf on generated files, they always generate with LF +# Add any extra files or paths here to make git stop saying they +# are changed when only line endings change. +src/generated/**/.cache/cache text eol=lf +src/generated/**/*.json text eol=lf diff --git a/OminousDarkness-main/.gitignore b/OminousDarkness-main/.gitignore new file mode 100644 index 0000000..12f8644 --- /dev/null +++ b/OminousDarkness-main/.gitignore @@ -0,0 +1,25 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea + +# gradle +build +.gradle + +# other +eclipse +run + +# Files from Forge MDK +forge*changelog.txt diff --git a/OminousDarkness-main/LICENSE b/OminousDarkness-main/LICENSE new file mode 100644 index 0000000..aa7b9fb --- /dev/null +++ b/OminousDarkness-main/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 dcaedll + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OminousDarkness-main/OminousDarkness-forge-1.20.1-1.3.0.jar b/OminousDarkness-main/OminousDarkness-forge-1.20.1-1.3.0.jar new file mode 100644 index 0000000..b063a31 --- /dev/null +++ b/OminousDarkness-main/OminousDarkness-forge-1.20.1-1.3.0.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6d0bf53bda239c1d26383af7b8d5a075e633186f12db31b4fbe65f49d553fac +size 185566 diff --git a/OminousDarkness-main/README.md b/OminousDarkness-main/README.md new file mode 100644 index 0000000..42cad9e --- /dev/null +++ b/OminousDarkness-main/README.md @@ -0,0 +1,7 @@ + + +# Ominous Darkness +Being in the darkness for too long is now life-threatening, as you start feeling the presence of something evil within. + +Find out more: https://www.curseforge.com/minecraft/mc-mods/ominous-darkness +Download: https://www.curseforge.com/minecraft/mc-mods/ominous-darkness/files \ No newline at end of file diff --git a/OminousDarkness-main/build.gradle b/OminousDarkness-main/build.gradle new file mode 100644 index 0000000..a70a0f6 --- /dev/null +++ b/OminousDarkness-main/build.gradle @@ -0,0 +1,94 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://maven.parchmentmc.org' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath 'org.parchmentmc:librarian:1.+' + } +} + +plugins { + id 'eclipse' + id 'maven-publish' +} +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.parchmentmc.librarian.forgegradle' + +version = project.mod_version +group = project.developer + '.' + project.mod_id +archivesBaseName = "${project.archives_base_name}-forge-${project.mc_display_version}" + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" +minecraft { + mappings channel: 'parchment', version: '2022.03.13-1.18.2' + + runs { + client { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + mods { + ominousdarkness { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + mods { + ominousdarkness { + source sourceSets.main + } + } + } + } +} + +dependencies { + minecraft 'net.minecraftforge:forge:' + project.minecraft_version + '-' + project.forge_version +} + +jar { + manifest { + attributes([ + "Specification-Title" : project.mod_id, + "Specification-Vendor" : project.developer, + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Version" : project.jar.archiveVersion, + "Implementation-Vendor" : project.developer, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +jar.finalizedBy('reobfJar') + +publishing { + publications { + mavenJava(MavenPublication) { + artifact jar + } + } + repositories { + maven { + url "file://${project.projectDir}/mcmodsrepo" + } + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' +} diff --git a/OminousDarkness-main/changelog.txt b/OminousDarkness-main/changelog.txt new file mode 100644 index 0000000..abbf20a --- /dev/null +++ b/OminousDarkness-main/changelog.txt @@ -0,0 +1,29 @@ +1.2.0: + - Added the darkness sound effect; + - Added the configuration options for toggling darkness overlay and sound effect on/off; + - Added the configuration option for changing the sound effect's volume; + - Slightly increased the default darkness growth time. + +1.1.1: + - Ensured compatibility with Forge major version 38+ (mc 1.18.x); + - Updated base filename. + +1.1.0: + - New configuration option: dimension black/whitelist; + - Added the missing death message string for when a player was recently hurt by something else, but ultimately died to the darkness; + - Removed the explicit dependence on Minecraft 1.18.2. + +1.0.2: + - Updated base filename; + - Asset pack now has a correct id; + - Minor decorative changes. + + QoL: + - Made overlay effect slightly more bright and also upped its alpha threshold; + - Players in spectator gamemode no longer get processed and killed. Overlay effect is also no longer rendered for them. + +1.0.1: + - Updated death message string. + +1.0.0: + - Initial release. \ No newline at end of file diff --git a/OminousDarkness-main/gradle.properties b/OminousDarkness-main/gradle.properties new file mode 100644 index 0000000..90371ab --- /dev/null +++ b/OminousDarkness-main/gradle.properties @@ -0,0 +1,13 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false + +mod_id=ominousdarkness +mod_version=1.2.1 +developer=dcaedll +archives_base_name=OminousDarkness + +minecraft_version=1.18.2 +mc_display_version=1.18.x +forge_version=40.1.0 \ No newline at end of file diff --git a/OminousDarkness-main/gradle/wrapper/gradle-wrapper.jar b/OminousDarkness-main/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..c4868df --- /dev/null +++ b/OminousDarkness-main/gradle/wrapper/gradle-wrapper.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89 +size 59536 diff --git a/OminousDarkness-main/gradle/wrapper/gradle-wrapper.properties b/OminousDarkness-main/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..41dfb87 --- /dev/null +++ b/OminousDarkness-main/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/OminousDarkness-main/gradlew b/OminousDarkness-main/gradlew new file mode 100644 index 0000000..c53aefa --- /dev/null +++ b/OminousDarkness-main/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/OminousDarkness-main/gradlew.bat b/OminousDarkness-main/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/OminousDarkness-main/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessDamageSource.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessDamageSource.java new file mode 100644 index 0000000..b4e1613 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessDamageSource.java @@ -0,0 +1,9 @@ +package dcaedll.ominousdarkness; + +import net.minecraft.world.damagesource.*; + +public class DarknessDamageSource +{ + public static final DamageSource DARKNESS + = (new DamageSource(OminousDarkness.MODID.concat(".darkness"))).bypassArmor().bypassInvul(); +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessEffect.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessEffect.java new file mode 100644 index 0000000..b758cbc --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessEffect.java @@ -0,0 +1,92 @@ +package dcaedll.ominousdarkness; + +import javax.annotation.*; + +import dcaedll.ominousdarkness.util.*; +import net.minecraft.core.*; +import net.minecraft.resources.*; +import net.minecraft.world.effect.*; +import net.minecraft.world.entity.player.*; + +public class DarknessEffect +{ + private MobEffect _mobEffect; + private String _name; + private boolean _indefinite; + private int _duration = 40; + private int _power = 1; + private float _factor = 0.0f; + + public String get_registryName() + { + return _name; + } + + public int get_duration() + { + return _duration; + } + + public void set_duration(int duration) + { + _duration = (int)MathHelper.clamp(duration, 0, Integer.MAX_VALUE); + set_indefinite(false); + } + + public int get_power() + { + return _power; + } + + public void set_power(int value) + { + _power = (int)MathHelper.clamp(value, 1, Integer.MAX_VALUE); + } + + public float get_factor() + { + return _factor; + } + + public void set_factor(float value) + { + _factor = MathHelper.clamp(value, 0.0f, 1.0f); + } + + public boolean get_indefinite() + { + return _indefinite; + } + + public void set_indefinite(boolean value) + { + _indefinite = value; + } + + @Nullable + public MobEffect get_mobEffect() + { + return _mobEffect; + } + + @SuppressWarnings("deprecation") + public DarknessEffect(@Nonnull String registryName) + { + _name = registryName; + _mobEffect = Registry.MOB_EFFECT.get(new ResourceLocation(get_registryName())); + set_indefinite(true); + } + + public void apply(@Nonnull Player player) + { + if (_mobEffect != null) + player.addEffect(newEffectInstance()); + } + + private MobEffectInstance newEffectInstance() + { + MobEffectInstance i = new MobEffectInstance(_mobEffect, get_duration(), get_power() - 1); + i.setNoCounter(get_indefinite()); + return i; + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessProcessor.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessProcessor.java new file mode 100644 index 0000000..0fd8d6a --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/DarknessProcessor.java @@ -0,0 +1,341 @@ +package dcaedll.ominousdarkness; + +import java.util.*; + +import javax.annotation.*; + +import dcaedll.ominousdarkness.capability.*; +import dcaedll.ominousdarkness.config.*; +import dcaedll.ominousdarkness.net.*; +import net.minecraft.client.*; +import net.minecraft.client.player.*; +import net.minecraft.server.level.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.item.*; +import net.minecraftforge.api.distmarker.*; +import net.minecraftforge.network.*; + +public class DarknessProcessor +{ + public static final int EFFECT_REAPPLICATION_RATE = 10; + + private static DarknessEffect[] _eff; + private static float _effLowerBound = 0.0f; + + public static void tickPlayer(@Nonnull final ServerPlayer player) + { + if (player.isCreative() || player.isSpectator()) + return; + + player.getCapability(DarknessHandlerProvider.CAP).ifPresent(cap -> + { + if (cap instanceof DarknessHandler) + { + DarknessHandler dh = (DarknessHandler)cap; + if (_validatePlayerDim(player, dh)) + { + _tickDarkness(player, dh); + _shareDarknessUpdate(player, dh); + } + } + }); + } + + public static void onConfigSetUp() + { + reloadEffects(); + } + + public static void reloadEffects() + { + _eff = _parseEffects(ConfigHandler.getCommonCustom().effects.get(), ConfigHandler.getCommonCustom().growth.get().floatValue() * 20.0f); + _updateEffectsLowerBound(); + } + + @SuppressWarnings("resource") + @OnlyIn(Dist.CLIENT) + public static void receiveDarknessUpdate(float factor) + { + LocalPlayer player = Minecraft.getInstance().player; + if (player != null) + { + player.getCapability(DarknessHandlerProvider.CAP).ifPresent(cap -> ((DarknessHandler)cap).set_factor(factor)); + } + } + + private static void _shareDarknessUpdate(ServerPlayer player, DarknessHandler dh) + { + if (dh.dirty) + { + DarknessPacket packet = new DarknessPacket(dh.get_factor()); + PacketHandler.CHANNEL_INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), packet); + dh.dirty = false; + } + } + + private static void _tickDarkness(final Player player, final DarknessHandler dh) + { + int th = _getLightLevelThreshold(); + int total = _calcTotalLightValue(player); + if (total <= th) + { + if (dh.update(true) && _getDarknessKills()) + { + _kill(player); + return; + } + if (dh.aboveZero()) + { + _handleEffects(player, dh); + } + } + else + { + if (dh.update(false)) + { + dh.reappliedEffects.clear(); + dh.damageDelayCounter = 0; + dh.damageCounter = 0; + } + dh.effectCounter = 0; + } + + if (dh.aboveZero()) + { + if (dh.damageDelayCounter + 1 >= _getDamageDelay() * 20) + { + dh.damageCounter--; + if (dh.damageCounter <= 0) + { + _damage(player); + dh.damageCounter = (int)(_getDamageInterval() * 20); + } + } + else dh.damageDelayCounter++; + if (dh.reTickCounter++ >= EFFECT_REAPPLICATION_RATE) + { + _reapplyEffects(player, dh); + dh.reTickCounter = 0; + } + } + } + + private static void _kill(Player player) + { + player.hurt(DarknessDamageSource.DARKNESS, Float.MAX_VALUE); + } + + private static void _damage(Player player) + { + player.hurt(DarknessDamageSource.DARKNESS, _getDamage()); + } + + private static DarknessEffect[] _parseEffects(List effs, float growthTicks) + { + DarknessEffect[] arr = new DarknessEffect[effs.size()]; + for (int j = 0; j < effs.size(); j++) + { + String s = (String)effs.get(j); + String[] split = s.split("(?=\\[)"); + DarknessEffect de = new DarknessEffect(split[0]); + if (de.get_mobEffect() == null) + continue; + + if (split.length > 1) + { + for (int i = 1; i < split.length; i++) + { + if (split[i].length() >= 5 && split[i].startsWith("[") && split[i].endsWith("]")) + { + String[] paramSplit = split[i].split("\\="); + if (paramSplit.length == 2 && paramSplit[0].length() > 1 && paramSplit[1].length() > 1) + { + paramSplit[0] = paramSplit[0].substring(1); + paramSplit[1] = paramSplit[1].substring(0, paramSplit[1].length() - 1); + + String param = paramSplit[0].toLowerCase(); + try + { + if (param.equals("duration")) + { + de.set_duration(Integer.parseInt(paramSplit[1]) * 20); + } + else if (param.equals("level")) + { + de.set_power(Integer.parseInt(paramSplit[1])); + } + else if (param.equals("timing")) + { + String dim = paramSplit[1].substring(paramSplit[1].length() - 1); + float num = Float.valueOf(paramSplit[1].substring(0, paramSplit[1].length() - 1)); + if (dim.equals("%")) + { + de.set_factor(num / 100.0f); + } + else if (dim.equals("s")) + { + de.set_factor(num * 20.0f / growthTicks); + } + } + } + catch (Exception e) + { + _logEffectParameterError(paramSplit[0], paramSplit[1]); + } + } + } + } + } + + arr[j] = de; + } + + // sort by factor in asc order + for (int i = 0; i < arr.length; i++) + { + for (int j = 0; j > i && j < arr.length; j++) + { + if (arr[i].get_factor() < arr[j].get_factor()) + { + DarknessEffect de = arr[i]; + arr[i] = arr[j]; + arr[j] = de; + } + } + } + + return arr; + } + + private static void _logEffectParameterError(String param, String value) + { + OminousDarkness.LOGGER.error("Invalid effect parameter {} with value {}", param, value); + } + + private static void _updateEffectsLowerBound() + { + _effLowerBound = Float.MAX_VALUE; + for (DarknessEffect eff : _eff) + { + if (eff.get_factor() <= _effLowerBound) + _effLowerBound = eff.get_factor(); + } + } + + private static boolean _validatePlayerDim(ServerPlayer player, DarknessHandler dh) + { + if (player.getLevel().dimension().location() != dh.dim) + { + String dim = (dh.dim = player.getLevel().dimension().location()).toString(); + dh.isInSuitableDim = _dimIsWhitelist() ? _dimContains(dim) : !_dimContains(dim); + } + return dh.isInSuitableDim; + } + + private static boolean _dimContains(String dim) + { + return ConfigHandler.getCommonCustom().dimBlacklist.get().contains(dim); + } + + private static boolean _dimIsWhitelist() + { + return ConfigHandler.getCommonCustom().dimListAsWhitelist.get().booleanValue(); + } + + private static int _calcTotalLightValue(Player player) + { + return player.level.getMaxLocalRawBrightness(player.blockPosition()) + + _getShinyValueForItems(player.getMainHandItem().getItem(), player.getOffhandItem().getItem()); + } + + private static int _getLightLevelThreshold() + { + return ConfigHandler.getCommonCustom().lightLevelThreshold.get().intValue(); + } + + private static boolean _getDarknessKills() + { + return ConfigHandler.getCommonCustom().darknessKills.get().booleanValue(); + } + + private static float _getDamageInterval() + { + return ConfigHandler.getCommonCustom().damageInterval.get().floatValue(); + } + + private static float _getDamageDelay() + { + return ConfigHandler.getCommonCustom().damageDelay.get().floatValue(); + } + + private static float _getDamage() + { + return ConfigHandler.getCommonCustom().damage.get().floatValue(); + } + + private static int _getShinyValueForItems(Item item1, Item item2) + { + boolean flag1 = false; + boolean flag2 = false; + int val = 0; + List shiny = ConfigHandler.getCommonCustom().shinyItems.get(); + + for (Object item : shiny) + { + String[] split = _splitShinyItemString((String)item); + if (!flag1 && item1.getRegistryName().toString().equals(split[0])) + { + val += (split.length >= 2 ? _getShinyValueForItem(item1, split[1]) : 0xF); + flag1 = true; + } + if (!flag2 && item2.getRegistryName().toString().equals(split[0])) + { + val += (split.length >= 2 ? _getShinyValueForItem(item2, split[1]) : 0xF); + flag2 = true; + } + if (flag1 && flag2) break; + } + + return val; + } + + private static String[] _splitShinyItemString(String item) + { + return item.split("\\$"); + } + + private static int _getShinyValueForItem(Item item, String val) + { + try + { + return Integer.parseInt(val); + } + catch(NumberFormatException e) {}; + return 0; + } + + private static void _handleEffects(Player player, DarknessHandler dh) + { + float factor = dh.get_factor(); + if (factor < _effLowerBound) + return; + + for (; dh.effectCounter < _eff.length && factor >= _eff[dh.effectCounter].get_factor(); dh.effectCounter++) + { + DarknessEffect de = _eff[dh.effectCounter]; + de.apply(player); + if (de.get_indefinite() && !dh.reappliedEffects.contains(de)) + { + dh.reappliedEffects.add(de); + } + } + } + + private static void _reapplyEffects(Player player, DarknessHandler dh) + { + for (DarknessEffect de : dh.reappliedEffects) + { + de.apply(player); + } + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/ICompoundTagSerializable.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/ICompoundTagSerializable.java new file mode 100644 index 0000000..b5d4aa7 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/ICompoundTagSerializable.java @@ -0,0 +1,10 @@ +package dcaedll.ominousdarkness; + +import net.minecraft.nbt.*; + +public interface ICompoundTagSerializable +{ + void serializeNBT(CompoundTag tag); + + void deserializeNBT(CompoundTag tag); +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/OminousDarkness.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/OminousDarkness.java new file mode 100644 index 0000000..059d4be --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/OminousDarkness.java @@ -0,0 +1,51 @@ +package dcaedll.ominousdarkness; + +import org.apache.logging.log4j.*; + +import dcaedll.ominousdarkness.client.*; +import dcaedll.ominousdarkness.config.*; +import dcaedll.ominousdarkness.event.*; +import dcaedll.ominousdarkness.net.*; +import dcaedll.ominousdarkness.sound.*; +import net.minecraftforge.common.*; +import net.minecraftforge.eventbus.api.*; +import net.minecraftforge.fml.common.*; +import net.minecraftforge.fml.event.lifecycle.*; +import net.minecraftforge.fml.javafmlmod.*; + +@Mod(OminousDarkness.MODID) +public class OminousDarkness +{ + public static final String MODID = "ominousdarkness"; + public static final Logger LOGGER = LogManager.getLogger(); + + static + { + ConfigHandler.init(); + } + + public OminousDarkness() + { + ConfigHandler.register(); + + IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); + + eventBus.addListener(ConfigHandler::configLoading); + eventBus.addListener(ConfigHandler::configReloading); + eventBus.addListener(this::_setup); + eventBus.addListener(this::_clientSetup); + MinecraftForge.EVENT_BUS.register(new EventHandler()); + SoundEventHandler.register(eventBus); + } + + private void _setup(final FMLCommonSetupEvent event) + { + LOGGER.info("Embracing the darkness..."); + PacketHandler.init(); + } + + private void _clientSetup(final FMLClientSetupEvent event) + { + DarknessGuiHandler.init(); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandler.java new file mode 100644 index 0000000..384b1c1 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandler.java @@ -0,0 +1,178 @@ +package dcaedll.ominousdarkness.capability; + +import java.util.*; + +import dcaedll.ominousdarkness.*; +import dcaedll.ominousdarkness.config.*; +import dcaedll.ominousdarkness.util.*; +import net.minecraft.nbt.*; +import net.minecraft.resources.*; + +public class DarknessHandler implements IDarknessEmbrace +{ + public ResourceLocation dim; + public boolean isInSuitableDim; + + public final List reappliedEffects = new ArrayList<>(); + public int effectCounter; + public int reTickCounter; + public int damageDelayCounter; + public int damageCounter; + public boolean dirty = true; + + private float _factor; + private float _growthTime; + private float _growthTimeTicks; + private float _growthStep; + private float _falloffTime; + private float _falloffTimeTicks; + private float _falloffStep; + + private float _delayValue; + private float _delay; + private float _delayTicks; + + @Override + public float get_factor() + { + return _factor; + } + + @Override + public void set_factor(float factor) + { + float f = _factor; + _factor = MathHelper.clamp(factor, 0.0f, 1.0f); + if (_factor != f) + dirty = true; + } + + public float get_growthTime() + { + return _growthTime; + } + + public void set_growthTime(float value) + { + _growthTime = MathHelper.clamp(value, 0, Float.MAX_VALUE); + _growthTimeTicks = _growthTime * 20; + _growthStep = getGrowthInTicks() > 0 ? 1 / getGrowthInTicks() : 1; + } + + public float get_falloffTime() + { + return _falloffTime; + } + + public void set_falloffTime(float value) + { + _falloffTime = MathHelper.clamp(value, 0, Float.MAX_VALUE); + _falloffTimeTicks = _falloffTime * 20; + _falloffStep = getFalloffInTicks() > 0 ? 1 / getFalloffInTicks() : 1; + } + + public float get_delay() + { + return _delay; + } + + public void set_delay(float value) + { + _delay = MathHelper.clamp(value, 0, Float.MAX_VALUE); + _delayTicks = _delay * 20; + } + + public float get_delayValue() + { + return _delayValue; + } + + public void set_delayValue(float value) + { + _delayValue = MathHelper.clamp(value, 0.0f, getDelayInTicks()); + } + + public DarknessHandler() + { + set_growthTime(ConfigHandler.getCommonCustom().growth.get().floatValue()); + set_falloffTime(ConfigHandler.getCommonCustom().falloff.get().floatValue()); + set_delay(ConfigHandler.getCommonCustom().delay.get().floatValue()); + } + + public float getGrowthInTicks() + { + return _growthTimeTicks; + } + + public float getFalloffInTicks() + { + return _falloffTimeTicks; + } + + public float getDelayInTicks() + { + return _delayTicks; + } + + public boolean atFull() + { + return get_factor() >= 1; + } + + public boolean atZero() + { + return get_factor() <= 0; + } + + public boolean aboveZero() + { + return get_factor() > 0; + } + + public boolean delayFinished() + { + return aboveZero() || (getDelayInTicks() > 0 ? get_delayValue() / getDelayInTicks() >= 1 : true); + } + + public boolean update(boolean grow) + { + if (aboveZero()) + set_delayValue(0); + + if (grow) + { + if (!_tickDelay()) + { + return false; + } + set_factor(get_factor() + _growthStep); + return atFull(); + } + set_factor(get_factor() - _falloffStep); + return atZero(); + } + + @Override + public void serializeNBT(CompoundTag tag) + { + tag.putFloat("factor", get_factor()); + tag.putFloat("delay", get_delayValue()); + tag.putInt("damageDelayCounter", damageDelayCounter); + tag.putInt("damageCounter", damageCounter); + } + + @Override + public void deserializeNBT(CompoundTag tag) + { + set_factor(tag.getFloat("factor")); + set_delayValue(tag.getFloat("delay")); + damageDelayCounter = tag.getInt("damageDelayCounter"); + damageCounter = tag.getInt("damageCounter"); + } + + private boolean _tickDelay() + { + set_delayValue(get_delayValue() + 1); + return delayFinished(); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandlerProvider.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandlerProvider.java new file mode 100644 index 0000000..97f0b1b --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/DarknessHandlerProvider.java @@ -0,0 +1,45 @@ +package dcaedll.ominousdarkness.capability; + +import javax.annotation.*; + +import dcaedll.ominousdarkness.*; +import net.minecraft.core.*; +import net.minecraft.nbt.*; +import net.minecraft.resources.*; +import net.minecraftforge.common.capabilities.*; +import net.minecraftforge.common.util.*; + +public class DarknessHandlerProvider implements ICapabilitySerializable +{ + public static final ResourceLocation RESOURCE = new ResourceLocation(OminousDarkness.MODID, "darkness_handler"); + public static final Capability CAP = CapabilityManager.get(new CapabilityToken<>() {}); + + private final IDarknessEmbrace _cap; + private final LazyOptional _lazyOpt; + + public DarknessHandlerProvider() + { + _cap = new DarknessHandler(); + _lazyOpt = LazyOptional.of(() -> _cap); + } + + @Override + public @Nonnull LazyOptional getCapability(@Nonnull final Capability cap, @Nullable final Direction side) + { + return CAP.orEmpty(cap, _lazyOpt); + } + + @Override + public CompoundTag serializeNBT() + { + CompoundTag tag = new CompoundTag(); + _cap.serializeNBT(tag); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag nbt) + { + _cap.deserializeNBT(nbt); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/IDarknessEmbrace.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/IDarknessEmbrace.java new file mode 100644 index 0000000..45e7c0b --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/capability/IDarknessEmbrace.java @@ -0,0 +1,10 @@ +package dcaedll.ominousdarkness.capability; + +import dcaedll.ominousdarkness.*; + +public interface IDarknessEmbrace extends ICompoundTagSerializable +{ + float get_factor(); + + void set_factor(float factor); +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/DarknessGuiHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/DarknessGuiHandler.java new file mode 100644 index 0000000..1af2f27 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/DarknessGuiHandler.java @@ -0,0 +1,69 @@ +package dcaedll.ominousdarkness.client; + +import org.lwjgl.opengl.*; + +import com.mojang.blaze3d.systems.*; +import com.mojang.blaze3d.vertex.*; + +import dcaedll.ominousdarkness.capability.*; +import dcaedll.ominousdarkness.config.*; +import net.minecraft.client.*; +import net.minecraft.client.player.*; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.texture.*; +import net.minecraft.world.level.block.*; +import net.minecraftforge.api.distmarker.*; +import net.minecraftforge.client.gui.*; + +@SuppressWarnings("deprecation") +@OnlyIn(Dist.CLIENT) +public class DarknessGuiHandler +{ + public static void init() + { + OverlayRegistry.registerOverlayAbove(ForgeIngameGui.VIGNETTE_ELEMENT, "darknesstakeme.vignette", DarknessGuiHandler::_renderDarknessEffect); + } + + private static void _renderDarknessEffect(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int screenWidth, int screenHeight) + { + if (!ConfigHandler.getCommonCustom().showOverlay.get()) + return; + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + if (player.isCreative() || player.isSpectator()) + return; + + player.getCapability(DarknessHandlerProvider.CAP).ifPresent(cap -> + { + if (cap.get_factor() <= 0) + return; + + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS); + RenderSystem.setShaderColor(0.107f, 0.083f, 0.201f, cap.get_factor() * 0.96f); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + _renderPortalIcon(mc, screenWidth, screenHeight); + RenderSystem.disableBlend(); + RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); + }); + } + + private static void _renderPortalIcon(Minecraft mc, int screenWidth, int screenHeight) + { + TextureAtlasSprite portalSprite = mc.getBlockRenderer().getBlockModelShaper().getParticleIcon(Blocks.NETHER_PORTAL.defaultBlockState()); + float u0 = portalSprite.getU0(); + float v0 = portalSprite.getV0(); + float u1 = portalSprite.getU1(); + float v1 = portalSprite.getV1(); + + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + bufferbuilder.vertex(0.0D, (double)screenHeight, -90.0d).uv(u0, v1).endVertex(); + bufferbuilder.vertex((double)screenWidth, (double)screenHeight, -90.0d).uv(u1, v1).endVertex(); + bufferbuilder.vertex((double)screenWidth, 0.0D, -90.0d).uv(u1, v0).endVertex(); + bufferbuilder.vertex(0.0D, 0.0D, -90.0d).uv(u0, v0).endVertex(); + tesselator.end(); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/SoundPlayback.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/SoundPlayback.java new file mode 100644 index 0000000..4e1a788 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/client/SoundPlayback.java @@ -0,0 +1,40 @@ +package dcaedll.ominousdarkness.client; + +import dcaedll.ominousdarkness.capability.*; +import dcaedll.ominousdarkness.config.*; +import dcaedll.ominousdarkness.sound.*; +import net.minecraft.client.*; +import net.minecraft.client.multiplayer.*; +import net.minecraft.client.player.*; +import net.minecraft.sounds.*; + +public class SoundPlayback +{ + public static DarknessSoundInstance soundInstance; + + public static final void playDarknessSoundEffects(LocalPlayer player) + { + if (player.isCreative() || player.isSpectator() || !ConfigHandler.getCommonCustom().playSoundEffect.get()) + { + if (soundInstance != null) soundInstance.doStop(); + return; + } + + if (soundInstance == null || soundInstance.isStopped()) + { + soundInstance = new DarknessSoundInstance(SoundEventHandler.DARKNESS_SOUND_EVENT.get(), SoundSource.AMBIENT); + Minecraft.getInstance().getSoundManager().play(soundInstance); + } + player.getCapability(DarknessHandlerProvider.CAP).ifPresent(cap -> + { + float factor = cap.get_factor(); + soundInstance.factor = factor; + soundInstance.setPos(player.getEyePosition()); + }); + } + + public static final void onClientLevelLoad(ClientLevel level) + { + soundInstance = null; + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigCommon.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigCommon.java new file mode 100644 index 0000000..7e7fe9a --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigCommon.java @@ -0,0 +1,182 @@ +package dcaedll.ominousdarkness.config; + +import java.util.*; + +import net.minecraftforge.common.*; +import net.minecraftforge.common.ForgeConfigSpec.*; + +public class ConfigCommon +{ + public final IntValue lightLevelThreshold; + public final DoubleValue delay; + public final DoubleValue growth; + public final DoubleValue falloff; + public final BooleanValue darknessKills; + public final ConfigValue> dimBlacklist; + public final BooleanValue dimListAsWhitelist; + + public final DoubleValue damage; + public final DoubleValue damageInterval; + public final DoubleValue damageDelay; + + public final BooleanValue showOverlay; + public final BooleanValue playSoundEffect; + public final DoubleValue soundEffectVolume; + public final ConfigValue> shinyItems; + public final ConfigValue> effects; + + public ConfigCommon(ForgeConfigSpec.Builder builder) + { + builder.comment("The basic configuration for how the darkness should behave").push("darkness"); + + int max = 65536; + lightLevelThreshold = builder + .comment("", "The light level threshold (inclusive), at and below which the darkness will start consuming a player over time") + .defineInRange("light_level_threshold", 4, -max, max); + delay = builder + .comment("", "The time (in seconds) a player has to spend in the darkness before it starts accumulating", + "The timer gets reset once the player is in a lit enough area, and starts ticking again once in the darkness and the player's darkness level is at 0") + .defineInRange("delay", 4.0f, 0.0f, max); + growth = builder + .comment("", "The time (in seconds) it takes for the darkness to fully consume a player", + "In this context, 0 would mean that the darkness should consume the player instantly, once in an unlit area") + .defineInRange("growth_time", 10.0f, 0.0f, max); + falloff = builder + .comment("", "The time (in seconds) it takes for the darkness to fall off", + "In this context, 0 would mean that the darkness should fall off instantly, once in a lit enough area") + .defineInRange("falloff_time", 2.0f, 0.0f, max); + darknessKills = builder + .comment("", "Whether the darkness should kill a player upon fully consuming them") + .define("darkness_kills", true); + + builder.comment("Any dimension-related configuration").push("dimension"); + + List dimPath = new ArrayList(); + dimPath.add("dim_blacklist"); + + dimBlacklist = builder + .comment("", "The list of dimension registry names where the effects of the darkness should be disabled", + "e.g., \"minecraft:overworld\", \"minecraft:the_nether\", \"minecraft:the_end\"") + .defineListAllowEmpty(dimPath, () -> new ArrayList<>(), ConfigCommon::_itemIsNotBlankString); + dimListAsWhitelist = builder + .comment("", "Whether to use dimension blacklist as whitelist instead") + .define("dim_blacklist_as_whitelist", false); + + builder.pop(); + builder.comment("Any damage-over-time-related configuration").push("damage"); + + damage = builder + .comment("", "The amount of damage (in half-hearts) the darkness deals at customizable [damage_interval] intervals") + .defineInRange("damage", 0.0f, 0.0f, max); + damageInterval = builder + .comment("", "The interval (in seconds) at which the darkness damages a player", + "For example, 3 would mean that the darkness will hit the player every 3 seconds") + .defineInRange("damage_interval", 3.0f, 0.0f, max); + damageDelay = builder + .comment("", "The delay (in seconds) after which a player will start taking damage", + "This timer starts ticking once the darkness begins consuming the player") + .defineInRange("damage_delay", 0.0f, 0.0f, max); + + builder.pop(); + builder.comment("Miscellaneous configuration").push("misc"); + + showOverlay = builder + .comment("", "Whether to show the darkness overlay") + .define("show_overlay", true); + playSoundEffect = builder + .comment("", "Whether to play the darkness sound effect") + .define("play_sound_effect", true); + soundEffectVolume = builder + .comment("", "The darkness sound effect's volume") + .defineInRange("sound_effect_volume", .8f, 0.0f, 1.0f); + + List shinyItemsPath = new ArrayList(); + shinyItemsPath.add("shiny_items"); + List shinyItemsDef = _initVanillaShinyItems(); + + shinyItems = builder + .comment("", "Items that should add to the total light value when a player is holding them in either hand", + "An item should be included as follows: \"item_registry_name$N\", where N is an additive light value", + "$N can be omitted, in this case it is implied that the item has the light value of 15", + "If the player is holding two items specified in this list (one in each hand), their light values are summed", + "Stack size does not participate in calculations") + .defineListAllowEmpty(shinyItemsPath, () -> shinyItemsDef, ConfigCommon::_itemIsNotBlankString); + + List effectsPath = new ArrayList(); + effectsPath.add("effects"); + List effectsDef = new ArrayList(); + + effects = builder + .comment("", "Any additional effects to apply to a player", + "An effect should be included as follows: \"effect_registry_name[duration=A][level=B][timing=C]\"", + "Duration is a number and determines the duration of the effect in seconds, defaults to infinite (for as long as the darkness level persists)", + "Level is a number and determines the power of the effect, defaults to 1", + "Timing is a number followed by either '%' or 's' (for percentage or seconds respectively) and determines the timestamp at which the effect occurs, defaults to 0s", + "Any parameters can be omitted, in this case they are set to their default values", + "Examples:", + "\"minecraft:hunger[duration=2][timing=50%]\" would apply Hunger I to a player for 2 seconds roughly halfway through (that is, if growth_time is set to 20, the effect would be applied at 10 seconds)", + "\"minecraft:slowness[timing=2.8s][level=2]\" would apply Slowness II to a player for as long as they are being consumed by the darkness, starting at 2.8 seconds", + "\"minecraft:strength\" would apply Strength I to a player right after they start gaining the darkness level, with the effect persisting for as long as their darkness level is higher than 0") + .defineListAllowEmpty(effectsPath, () -> effectsDef, ConfigCommon::_itemIsNotBlankString); + } + + private static boolean _itemIsNotBlankString(Object item) + { + return item instanceof String && !((String)item).isBlank(); + } + + private static ArrayList _initVanillaShinyItems() + { + ArrayList list = new ArrayList(); + String[] shiny = new String[] + { + "beacon$8", + "conduit$8", + "glowstone$8", + "jack_o_lantern$8", + "lantern$8", + "soul_lantern$5", + "sea_lantern$8", + "shroomlight$8", + "glow_berries$3", + "end_rod$7", + "torch$7", + "crying_obsidian$5", + "enchanting_table$4", + "ender_chest$4", + "glow_lichen$4", + "redstone_torch$2", + "small_amethyst_bud$1", + "medium_amethyst_bud$1", + "large_amethyst_bud$2", + "amethyst_cluster$3", + "magma_block$2", + "brewing_stand$1", + "brown_mushroom$1", + "dragon_egg$1", + "end_portal_frame$1", + "light$8", + "ender_pearl$1", + "ender_eye$1", + "experience_bottle$1", + "redstone$1", + "lava_bucket$8", + "spectral_arrow$3", + "enchanted_golden_apple$3", + "glow_ink_sac$2", + "amethyst_shard$1", + "nether_star$8", + "glistering_melon_slice$2", + "glowstone_dust$4", + "blaze_powder$1", + "blaze_rod$1", + "magma_cream$1", + }; + for (int i = 0; i < shiny.length; i++) + { + list.add("minecraft:".concat(shiny[i])); + } + + return list; + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigHandler.java new file mode 100644 index 0000000..60287ee --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/config/ConfigHandler.java @@ -0,0 +1,42 @@ +package dcaedll.ominousdarkness.config; + +import java.util.*; + +import org.apache.commons.lang3.tuple.*; + +import dcaedll.ominousdarkness.*; +import net.minecraftforge.common.*; +import net.minecraftforge.fml.*; +import net.minecraftforge.fml.config.*; +import net.minecraftforge.fml.event.config.*; + +public class ConfigHandler +{ + public static final List> configList = new ArrayList<>(); + public static Pair common; + + public static void init() + { + configList.add(common = new ForgeConfigSpec.Builder().configure(ConfigCommon::new)); + } + + public static void register() + { + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, common.getRight()); + } + + public static void configLoading(final ModConfigEvent.Loading event) + { + DarknessProcessor.onConfigSetUp(); + } + + public static void configReloading(final ModConfigEvent.Reloading event) + { + DarknessProcessor.onConfigSetUp(); + } + + public static ConfigCommon getCommonCustom() + { + return common.getLeft(); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/event/EventHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/event/EventHandler.java new file mode 100644 index 0000000..a17a91b --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/event/EventHandler.java @@ -0,0 +1,62 @@ +package dcaedll.ominousdarkness.event; + +import dcaedll.ominousdarkness.*; +import dcaedll.ominousdarkness.capability.*; +import dcaedll.ominousdarkness.client.*; +import net.minecraft.client.multiplayer.*; +import net.minecraft.client.player.*; +import net.minecraft.server.level.*; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.*; +import net.minecraft.world.level.*; +import net.minecraftforge.api.distmarker.*; +import net.minecraftforge.common.capabilities.*; +import net.minecraftforge.event.*; +import net.minecraftforge.event.world.*; +import net.minecraftforge.eventbus.api.*; +import net.minecraftforge.fml.*; + +public class EventHandler +{ + @SubscribeEvent + public void registerCapabilities(final RegisterCapabilitiesEvent event) + { + event.register(IDarknessEmbrace.class); + } + + @SubscribeEvent + public void attachCapabilities(final AttachCapabilitiesEvent event) + { + if (!(event.getObject() instanceof Player)) return; + + event.addCapability(DarknessHandlerProvider.RESOURCE, new DarknessHandlerProvider()); + } + + @SubscribeEvent + public void playerTick(final TickEvent.PlayerTickEvent event) + { + if (event.phase == TickEvent.Phase.END && event.side == LogicalSide.SERVER && event.player instanceof ServerPlayer) + { + DarknessProcessor.tickPlayer((ServerPlayer)event.player); + } + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public void localPlayerTick(final TickEvent.PlayerTickEvent event) + { + if (event.phase == TickEvent.Phase.END && event.side == LogicalSide.CLIENT && event.player instanceof LocalPlayer) + { + SoundPlayback.playDarknessSoundEffects((LocalPlayer)event.player); + } + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public void localLevelLoad(final WorldEvent.Load event) + { + LevelAccessor level = event.getWorld(); + if (level instanceof ClientLevel) + SoundPlayback.onClientLevelLoad((ClientLevel)level); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/DarknessPacket.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/DarknessPacket.java new file mode 100644 index 0000000..6dfbb5e --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/DarknessPacket.java @@ -0,0 +1,48 @@ +package dcaedll.ominousdarkness.net; + +import java.util.function.*; + +import dcaedll.ominousdarkness.*; +import net.minecraft.network.*; +import net.minecraftforge.api.distmarker.*; +import net.minecraftforge.fml.*; +import net.minecraftforge.network.*; + +public class DarknessPacket +{ + public float factor; + + public DarknessPacket() + { + + } + + public DarknessPacket(float factor) + { + this.factor = factor; + } + + public static void encode(DarknessPacket packet, FriendlyByteBuf buf) + { + buf.writeFloat(packet.factor); + } + + public static DarknessPacket decode(FriendlyByteBuf buf) + { + DarknessPacket packet = new DarknessPacket(); + packet.factor = buf.readFloat(); + return packet; + } + + public static void handle(DarknessPacket packet, Supplier ctx) + { + ctx.get().enqueueWork(() -> + { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + { + DarknessProcessor.receiveDarknessUpdate(packet.factor); + }); + }); + ctx.get().setPacketHandled(true); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/PacketHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/PacketHandler.java new file mode 100644 index 0000000..7e34812 --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/net/PacketHandler.java @@ -0,0 +1,23 @@ +package dcaedll.ominousdarkness.net; + +import dcaedll.ominousdarkness.*; +import net.minecraft.resources.*; +import net.minecraftforge.network.*; +import net.minecraftforge.network.simple.*; + +public class PacketHandler +{ + private static int _packetId = 0; + + public static final String PROTOCOL_VERSION = "1"; + public static final SimpleChannel CHANNEL_INSTANCE = NetworkRegistry.newSimpleChannel( + new ResourceLocation(OminousDarkness.MODID, "main"), + () -> PROTOCOL_VERSION, + PROTOCOL_VERSION::equals, + PROTOCOL_VERSION::equals); + + public static void init() + { + CHANNEL_INSTANCE.registerMessage(_packetId++, DarknessPacket.class, DarknessPacket::encode, DarknessPacket::decode, DarknessPacket::handle); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/DarknessSoundInstance.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/DarknessSoundInstance.java new file mode 100644 index 0000000..7e7ef8c --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/DarknessSoundInstance.java @@ -0,0 +1,43 @@ +package dcaedll.ominousdarkness.sound; + +import dcaedll.ominousdarkness.config.*; +import net.minecraft.client.resources.sounds.*; +import net.minecraft.sounds.*; +import net.minecraft.world.phys.*; + +public class DarknessSoundInstance extends AbstractTickableSoundInstance +{ + public float factor = 0; + public float maxVolume = ConfigHandler.getCommonCustom().soundEffectVolume.get().floatValue(); + + public DarknessSoundInstance(SoundEvent event, SoundSource source) + { + super(event, source); + volume = 0; + delay = 0; + looping = true; + } + + @Override + public void tick() + { + volume = factor * maxVolume; + } + + public void setPos(Vec3 pos) + { + x = pos.x; + y = pos.y; + z = pos.z; + } + + public boolean canStartSilent() + { + return true; + } + + public void doStop() + { + stop(); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/SoundEventHandler.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/SoundEventHandler.java new file mode 100644 index 0000000..417707a --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/sound/SoundEventHandler.java @@ -0,0 +1,23 @@ +package dcaedll.ominousdarkness.sound; + +import dcaedll.ominousdarkness.*; +import net.minecraft.resources.*; +import net.minecraft.sounds.*; +import net.minecraftforge.eventbus.api.*; +import net.minecraftforge.registries.*; + +public class SoundEventHandler +{ + public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, OminousDarkness.MODID); + public static final RegistryObject DARKNESS_SOUND_EVENT = registerSoundEvent("darkness_hissing"); + + public static final RegistryObject registerSoundEvent(String name) + { + return SOUND_EVENTS.register(name, () -> new SoundEvent(new ResourceLocation(OminousDarkness.MODID, name))); + } + + public static final void register(IEventBus eventBus) + { + SOUND_EVENTS.register(eventBus); + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/util/MathHelper.java b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/util/MathHelper.java new file mode 100644 index 0000000..1ebd90b --- /dev/null +++ b/OminousDarkness-main/src/main/java/dcaedll/ominousdarkness/util/MathHelper.java @@ -0,0 +1,17 @@ +package dcaedll.ominousdarkness.util; + +public class MathHelper +{ + public static float clamp(float value, float min, float max) + { + if (min >= max) + return min; + + if (value < min) + return min; + else if (value > max) + return max; + + return value; + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/resources/META-INF/mods.toml b/OminousDarkness-main/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..97f2771 --- /dev/null +++ b/OminousDarkness-main/src/main/resources/META-INF/mods.toml @@ -0,0 +1,28 @@ +modLoader="javafml" +loaderVersion="[38,)" +license="https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/LICENSE" +issueTrackerURL="https://github.com/dcaedll/OminousDarkness/issues" + +[[mods]] +modId="ominousdarkness" +version="${file.jarVersion}" +displayName="Ominous Darkness" +updateJSONURL="https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/update.json" +displayURL="https://github.com/dcaedll/OminousDarkness" +logoFile="ominous_darkness_logo.png" +credits="toujourspareil https://twitter.com/toujourspareil_" +authors="dcaedll" +description=''' +Being in the darkness for too long is now life-threatening, as you start feeling the presence of something evil within. + +This mod makes exploration and adventures a whole lot more difficult; now you're hunted by the darkness itself! +Simply being out in the darkness for too long kills you (this behavior can be changed in the config), effectively rendering your exploration capabilities limited. +Watch out and make sure to bring some light with you to dispel the darkness! +''' + +[[dependencies.ominousdarkness]] + modId="forge" + mandatory=true + versionRange="[38,)" + ordering="NONE" + side="BOTH" diff --git a/OminousDarkness-main/src/main/resources/assets/ominousdarkness/lang/en_us.json b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/lang/en_us.json new file mode 100644 index 0000000..7e22a6f --- /dev/null +++ b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "death.attack.ominousdarkness.darkness": "%s fell into the darkness", + "death.attack.ominousdarkness.darkness.player": "%s fell into the darkness" +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds.json b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds.json new file mode 100644 index 0000000..04d2d30 --- /dev/null +++ b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds.json @@ -0,0 +1,8 @@ +{ + "darkness_hissing": { + "category": "ambient", + "sounds": [ + "ominousdarkness:darkness_hissing" + ] + } +} \ No newline at end of file diff --git a/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds/darkness_hissing.ogg b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds/darkness_hissing.ogg new file mode 100644 index 0000000..2cc815d --- /dev/null +++ b/OminousDarkness-main/src/main/resources/assets/ominousdarkness/sounds/darkness_hissing.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7552eb1ea410be55bdce7c58d80efa20f5d696de47eda07bd317b8bf8fdb023 +size 148364 diff --git a/OminousDarkness-main/src/main/resources/ominous_darkness_logo.png b/OminousDarkness-main/src/main/resources/ominous_darkness_logo.png new file mode 100644 index 0000000..2fcbd06 --- /dev/null +++ b/OminousDarkness-main/src/main/resources/ominous_darkness_logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:251331be7fc6c2170a9327687f4c6d8930c7ac66963603cb655593d3f360759d +size 883 diff --git a/OminousDarkness-main/src/main/resources/pack.mcmeta b/OminousDarkness-main/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..f335b9f --- /dev/null +++ b/OminousDarkness-main/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "examplemod resources", + "pack_format": 9 + } +} diff --git a/OminousDarkness-main/update.json b/OminousDarkness-main/update.json new file mode 100644 index 0000000..eaed8d2 --- /dev/null +++ b/OminousDarkness-main/update.json @@ -0,0 +1,52 @@ +{ + "homepage": "https://www.curseforge.com/minecraft/mc-mods/ominous-darkness/files", + "1.19": + { + "1.1.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/mc1.19/changelog.txt", + "1.0.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/mc1.19/changelog.txt" + }, + "1.18.2": + { + "1.2.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt", + "1.1.1": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt", + "1.1.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt", + "1.0.2": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt", + "1.0.1": "Updated death message string", + "1.0.0": "Initial release" + }, + "1.18.1": + { + "1.1.1": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt" + }, + "1.18": + { + "1.1.1": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/main/changelog.txt" + }, + "1.17.1": + { + "1.2.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/mc1.17.1/changelog.txt", + "1.1.0": "New configuration option: dimension black/whitelist", + "1.0.0": "Initial release" + }, + "1.16.5": + { + "1.2.0": "https://raw.githubusercontent.com/dcaedll/OminousDarkness/mc1.16.5/changelog.txt", + "1.1.0": "New configuration option: dimension black/whitelist", + "1.0.0": "Initial release" + }, + "promos": + { + "1.19-latest": "1.1.0", + "1.19-recommended": "1.1.0", + "1.18.2-latest": "1.2.0", + "1.18.2-recommended": "1.2.0", + "1.18.1-latest": "1.1.1", + "1.18.1-recommended": "1.1.1", + "1.18-latest": "1.1.1", + "1.18-recommended": "1.1.1", + "1.17.1-latest": "1.2.0", + "1.17.1-recommended": "1.2.0", + "1.16.5-latest": "1.2.0", + "1.16.5-recommended": "1.2.0" + } +}