diff --git a/.github/prepare_keystore.sh b/.github/prepare_keystore.sh deleted file mode 100755 index fa332eb..0000000 --- a/.github/prepare_keystore.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -echo "$RELEASE_KEYSTORE" > release.keystore.asc -gpg -d --quiet --passphrase "$RELEASE_KEYSTORE_PASSPHRASE" --batch -o release.keystore release.keystore.asc \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e85caa..84e0b73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,22 +1,23 @@ name: Mod CI -on: - push: - branches: - - main +on: [ push, pull_request ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true - - name: Set up JDK 1.17 + - name: Set up JDK 1.21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' - cache: 'gradle' + java-version: '21' - name: Build with Gradle - run: ./gradlew build \ No newline at end of file + uses: gradle/actions/setup-gradle@v3 + with: + arguments: build \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3cf4d18..fcff63e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,24 +10,20 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Setup keystore - env: - RELEASE_KEYSTORE: ${{ secrets.RELEASE_KEYSTORE }} - RELEASE_KEYSTORE_PASSPHRASE: ${{ secrets.RELEASE_KEYSTORE_PASSPHRASE }} - run: ./.github/prepare_keystore.sh + with: + fetch-depth: 0 + fetch-tags: true - - name: Set up JDK 1.17 + - name: Set up JDK 1.21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - name: Build with Gradle - env: - ORG_GRADLE_PROJECT_keyStore: ./release.keystore - ORG_GRADLE_PROJECT_keyStoreAlias: ${{ secrets.KEYSTORE_ALIAS }} - ORG_GRADLE_PROJECT_keyStorePass: ${{ secrets.KEYSTORE_PASS }} - run: ./gradlew build + uses: gradle/actions/setup-gradle@v3 + with: + arguments: build - uses: actions/upload-artifact@v4 with: @@ -49,7 +45,7 @@ jobs: - name: Create Release id: create_release - uses: ncipollo/release-action@v1.14.0 + uses: ncipollo/release-action@v1.15.0 with: artifacts: "./libs/*.jar" token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 1319d28..31d2550 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,7 @@ build # other eclipse run -classes \ No newline at end of file +runs +run-data + +repo \ No newline at end of file diff --git a/LICENSE b/LICENSE index 65c5ca8..153d416 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -162,4 +162,4 @@ General Public License ever published by the Free Software Foundation. whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the -Library. +Library. \ No newline at end of file diff --git a/build.gradle b/build.gradle index fc0b54e..5d5168d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,180 +1,130 @@ -plugins { + plugins { + id 'java-library' id 'eclipse' + id 'idea' id 'maven-publish' - id 'net.neoforged.gradle' version '[6.0,6.2)' - id 'org.parchmentmc.librarian.forgegradle' version '1.+' + id 'net.neoforged.gradle.userdev' version '7.0.176' } -version = mod_version -group = "se.gory_moon" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = "Chargers-$mc_version" - -// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. -java.toolchain.languageVersion = JavaLanguageVersion.of(17) - -if (System.getenv().GITHUB_RUN_NUMBER != null) { //adds the build number to the end of the version string if on a build server - version += ".${System.getenv().GITHUB_RUN_NUMBER}" +tasks.named('wrapper', Wrapper).configure { + // Define wrapper values here so as to not have to always do so when updating gradlew.properties. + // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with + // documentation attached on cursor hover of gradle classes and methods. However, this comes with increased + // file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards. + // (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`) + distributionType = Wrapper.DistributionType.BIN } -println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" -minecraft { - mappings channel: mappings_channel, version: mappings_version - - //accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - properties 'forge.logging.markers': 'CORE,LOADING,REGISTRIES' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'chargers' - - // Make mixins work on dependencies - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" +version = mod_version +group = mod_group_id - mods { - chargers { - source sourceSets.main - } +repositories { + mavenLocal() + maven { url = "https://maven.covers1624.net/" } + maven { + name = "OctoStudios" + url = uri("https://maven.octo-studios.com/releases") + } + exclusiveContent { + forRepository { + maven { + url = "https://cursemaven.com" } } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - properties 'forge.logging.markers': 'CORE,LOADING,REGISTRIES' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'chargers' - - // Make mixins work on dependencies - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - - mods { - chargers { - source sourceSets.main - } - } + filter { + includeGroup "curse.maven" } + } +} +base { + archivesName = "Chargers-$minecraft_version" +} - gameTestServer { - workingDirectory project.file('run') +java { + withSourcesJar() - // Recommended logging data for a userdev environment - properties 'forge.logging.markers': 'REGISTRIES' + // Mojang ships Java 21 to end users starting in 1.20.5, so mods should target Java 21. + toolchain.languageVersion = JavaLanguageVersion.of(21) +} - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' +if (System.getenv().GITHUB_RUN_NUMBER != null) { //adds the build number to the end of the version string if on a build server + version += ".${System.getenv().GITHUB_RUN_NUMBER}" +} - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'chargers' +runs { + configureEach { + // Recommended logging data for a userdev environment + systemProperty 'forge.logging.markers', 'REGISTRIES' - // Make mixins work on dependencies - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + // Recommended logging level for the console + systemProperty 'forge.logging.console.level', 'debug' - mods { - chargers { - source sourceSets.main - } - } - } + modSource project.sourceSets.main + } - data { - workingDirectory project.file('run') + client { + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - // Recommended logging data for a userdev environment - properties 'forge.logging.markers': 'REGISTRIES' + devLogin { + enabled true + } + } - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' + server { - args '--mod', 'chargers', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + arguments.add '--nogui' + } - // Make mixins work on dependencies - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'forge.enabledGameTestNamespaces', project.mod_id + } - mods { - chargers { - source sourceSets.main - } - } - } + data { + arguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } } +// Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } - -jarJar.enable() -tasks.jarJar.finalizedBy('reobfJarJar') - -repositories { - mavenCentral() - maven { url = "https://maven.covers1624.net/" } - maven { // curios - url "https://maven.theillusivec4.top/" - } - maven { // Registrate - url "https://maven.tterrag.com/" - } - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } +// Sets up a dependency configuration called 'localRuntime'. +// This configuration should be used instead of 'runtimeOnly' to declare +// a dependency that will be present for runtime testing but that is +// "optional", meaning it will not be pulled by dependents of this mod. +configurations { + runtimeClasspath.extendsFrom localRuntime } dependencies { - // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed - // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft "net.neoforged:forge:${mc_version}-${neo_version}" + // Specify the version of Minecraft to use. + // Depending on the plugin applied there are several options. We will assume you applied the userdev plugin as shown above. + // The group for userdev is net.neoforged, the module name is neoforge, and the version is the same as the neoforge version. + // You can however also use the vanilla plugin (net.neoforged.gradle.vanilla) to use a version of Minecraft without the neoforge loader. + // And its provides the option to then use net.minecraft as the group, and one of; client, server or joined as the module name, plus the game version as version. + // For all intends and purposes: You can treat this dependency as if it is a normal library you would use. + implementation "net.neoforged:neoforge:${neo_version}" - runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}") - compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api") + implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}" - runtimeOnly fg.deobf("io.codechicken:CodeChickenLib:${mc_version}-${ccl_version}:universal") - runtimeOnly fg.deobf("com.brandon3055.draconicevolution:Draconic-Evolution:${mc_version}-3.1.2.588:universal") - implementation fg.deobf("com.brandon3055.brandonscore:BrandonsCore:${mc_version}-${brandon_core_version}:universal") + // localRuntime "io.codechicken:CodeChickenLib:${mc_version}-${ccl_version}:universal" + // localRuntime "com.brandon3055.draconicevolution:Draconic-Evolution:${minecraft_version}-3.1.2.588:universal" + // implementation "com.brandon3055.brandonscore:BrandonsCore:${minecraft_version}-${bc_version}:universal" - implementation fg.deobf("curse.maven:flux-networks-248020:${flux_version}") + // For testing + localRuntime "curse.maven:immersive-engineering-231951:5828000" - implementation fg.deobf("curse.maven:titanium-287342:5468426") - implementation fg.deobf("curse.maven:industrial-foregoing-266515:${if_version}") - - implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") - jarJar(group: 'com.tterrag.registrate', name: 'Registrate', version: "[MC1.20,MC1.21)") -} - -reobf { - jarJar {} -} + implementation "curse.maven:flux-networks-248020:${flux_version}" -tasks.jarJar.configure { - // remove '-all' from jarJar jar file - archiveClassifier.set('') -} - -tasks.register('sourcesJar', Jar) { - dependsOn classes - description = 'Creates a JAR containing the source code.' - from sourceSets.main.allSource - archiveClassifier.set('sources') + implementation "curse.maven:titanium-287342:${titanium_version}" + implementation "curse.maven:industrial-foregoing-266515:${if_version}" } tasks.register('deobfJar', Jar) { @@ -183,31 +133,38 @@ tasks.register('deobfJar', Jar) { archiveClassifier.set('deobf') } -tasks.register('forgelibJar', Jar) { - description = 'Creates a compiled JAR which also contains raw sources.' - from sourceSets.main.output - from sourceSets.main.allJava - archiveClassifier.set('forgelib') -} - artifacts { archives sourcesJar archives deobfJar - archives forgelibJar } -jar { - archiveClassifier.set('slim') - manifest { - attributes([ - "Specification-Title": "Chargers", - "Specification-Vendor": "Gory_Moon", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": project.jar.archiveVersion, - "Implementation-Vendor" :"Gory_Moon", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) +// This block of code expands all declared replace properties in the specified resource targets. +// A missing property will result in an error. Properties are expanded using ${} Groovy notation. +// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments. +// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html +tasks.withType(ProcessResources).configureEach { + var replaceProperties = [ + minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + neo_version_range : neo_version_range, + loader_version_range : loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_version : mod_version, + mod_authors : mod_authors, + mod_description : mod_description, + + curios_version_range : curios_version_range, + if_version_range : if_version_range, + bc_version_range : bc_version_range, + flux_version_range : flux_version_range + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties } } @@ -215,23 +172,10 @@ tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } -// Jar Signing -import net.minecraftforge.gradle.common.tasks.SignJar -tasks.register('signJar', SignJar) { - onlyIf { - project.hasProperty('keyStore') - } - - if (project.hasProperty('keyStore')) { - project.logger.info("Signing jar ${tasks.jarJar.archiveFileName.get()}"); - - keyStore = project.findProperty('keyStore') - alias = project.findProperty('keyStoreAlias') - storePass = project.findProperty('keyStorePass') - keyPass = project.findProperty('keyStorePass') - inputFile = tasks.jarJar.archiveFile.get() - outputFile = tasks.jarJar.archiveFile.get() - } else { - project.logger.log(LogLevel.WARN, "Could not sign ${tasks.jarJar.archiveFileName.get()}. No keyStore property could be found") +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true } } diff --git a/gradle.properties b/gradle.properties index 4e5040e..c93206d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,44 @@ -org.gradle.jvmargs=-Xmx3G +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +org.gradle.jvmargs=-Xmx1G org.gradle.daemon=false +org.gradle.debug=false -mod_version=6.1.0 -neo_version=47.1.106 -mappings_channel=parchment -mappings_version=2023.09.03-1.20.1 -mc_version=1.20.1 +# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started +neogradle.subsystems.parchment.minecraftVersion=1.21.1 +neogradle.subsystems.parchment.mappingsVersion=2024.11.17 +neogradle.subsystems.devLogin.enabled=true -curios_version=5.10.0+1.20.1 -registrate_version=MC1.20-1.3.11 +# Environment Properties +minecraft_version=1.21.1 +minecraft_version_range=[1.21,1.21.1) +neo_version=21.1.92 +neo_version_range=[21.1,) +loader_version_range=[4,) -ccl_version=4.4.0.+ -brandon_core_version=3.2.1.+ +# Mod info +mod_id=chargers +mod_name=Chargers +mod_license=LGPL-3.0-or-later +mod_version=7.0.0 +mod_group_id=se.gorymoon +mod_authors=Gory_Moon +mod_description=A mod that adds item charger blocks in tiers and a wireless one -# Flux-Networks-1.20.1-7.2.1 -flux_version=5234697 -# industrial-foregoing-1.20.1-3.5.17 -if_version=5355551 \ No newline at end of file +# Dependencies +curios_version=9.0.15+1.21.1 +curios_version_range=[9.0.10+1.21.1,) + +# ccl_version=4.4.0.+ +# bc_version=3.2.1.+ +bc_version_range=[3.2.1.+,) + +# Flux-Networks-1.21.1-8.0.0 +flux_version=6089446 +flux_version_range=[8.0,) + +# industrialforegoing-1.21-3.6.10 +if_version=6030556 +if_version_range=[1.21-3.6.15,) +# titanium-1.21-4.0.30 +titanium_version=5897690 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fae0804..adda1f2 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.12-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/gradlew b/gradlew index 79a61d4..b26d411 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# 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/. @@ -83,10 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# 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"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +134,13 @@ 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. + 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. @@ -144,7 +148,7 @@ 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=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then 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. + +# 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" \ @@ -241,4 +249,4 @@ eval "set -- $( tr '\n' ' ' )" '"$@"' -exec "$JAVACMD" "$@" +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..f46bb52 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 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 @@ -57,11 +59,11 @@ 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. +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 @@ -89,4 +91,4 @@ exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega +:omega \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b9f4594..b976617 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,11 @@ pluginManagement { repositories { + mavenLocal() gradlePluginPortal() - maven { url = 'https://maven.neoforged.net/' } - maven { url = 'https://maven.parchmentmc.org' } + maven { url = 'https://maven.neoforged.net/releases' } } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0' } \ No newline at end of file diff --git a/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 b/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 new file mode 100644 index 0000000..3455360 --- /dev/null +++ b/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 @@ -0,0 +1,2 @@ +// 1.21.1 2024-12-31T12:14:10.041600075 Pack Metadata +da443e64d1249ea5f9082fd5ad13b397fb1fad3e pack.mcmeta diff --git a/src/generated/resources/.cache/1ea27f99d9d3e8c1ad19e09de42ac03f91992ac6 b/src/generated/resources/.cache/1ea27f99d9d3e8c1ad19e09de42ac03f91992ac6 new file mode 100644 index 0000000..d7d555d --- /dev/null +++ b/src/generated/resources/.cache/1ea27f99d9d3e8c1ad19e09de42ac03f91992ac6 @@ -0,0 +1,2 @@ +// 1.21.1 2025-01-20T20:48:06.0097864 Languages: en_us for mod: chargers +d58199e22345e15cbb3b2b7a5586eaa4d9a67963 assets/chargers/lang/en_us.json diff --git a/src/generated/resources/.cache/331a184d89345b608cefca3c417575b2e760aa4d b/src/generated/resources/.cache/331a184d89345b608cefca3c417575b2e760aa4d new file mode 100644 index 0000000..ec21b1b --- /dev/null +++ b/src/generated/resources/.cache/331a184d89345b608cefca3c417575b2e760aa4d @@ -0,0 +1,5 @@ +// 1.21.1 2024-12-31T12:33:14.326789587 Tags for minecraft:block mod id chargers +9596b69eed507a7c84470fb89813addc3bb046e2 data/minecraft/tags/block/mineable/pickaxe.json +6620d130a62bf575f058803e24e7cb739222acd3 data/minecraft/tags/block/needs_diamond_tool.json +2832bc540df3fe30f4f5fca04a116987d8f869e1 data/minecraft/tags/block/needs_iron_tool.json +3886d5089b5c880b453d1273311b88b3b9def584 data/minecraft/tags/block/needs_stone_tool.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d new file mode 100644 index 0000000..b34fb78 --- /dev/null +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -0,0 +1,7 @@ +// 1.21.1 2025-01-01T17:38:42.744750916 Loot Tables +8df32fce4b9b1f8902475dbc19f4f6498a468e57 data/chargers/loot_table/blocks/charger_creative.json +d4b77b1e7481aae4777e249752a1ebbab8f988ce data/chargers/loot_table/blocks/charger_t1.json +7528fa35e1f43e206f0157ce90bdcc0009bc17ef data/chargers/loot_table/blocks/charger_t2.json +642deb08cbc6eb68ba5bb61a94cb421d0c958d70 data/chargers/loot_table/blocks/charger_t3.json +6b45fca6dc229ca20ed14e8bec212eae6f5d4e07 data/chargers/loot_table/blocks/charger_t4.json +06f9a4a3b1a21351fcfe496d0b0fece73de3cf9c data/chargers/loot_table/blocks/wireless_charger.json diff --git a/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 b/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 deleted file mode 100644 index d73bdb3..0000000 --- a/src/generated/resources/.cache/910218e7c3efcae493640079456ad43bd5253459 +++ /dev/null @@ -1,42 +0,0 @@ -// 1.20.1 2024-09-14T02:48:06.7045754 Registrate Provider for chargers [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider] -8414d2f8dd66709fee6bb6384ed6003c3dee1e5a assets/chargers/blockstates/charger_creative.json -3792e9381196c8ffa0a6965a2a05d389f60b5c95 assets/chargers/blockstates/charger_t1.json -25bdc385d9e5cf3dbb17b546a5af3659ba985819 assets/chargers/blockstates/charger_t2.json -d212b963fcdf9ae026f36c24bf90c47eb118a9f5 assets/chargers/blockstates/charger_t3.json -baee84976ea206a8ec2d5b4a02e5c20b7adfa1b3 assets/chargers/blockstates/charger_t4.json -38da81727571161309afa868262fea2aea5529d8 assets/chargers/blockstates/wireless_charger.json -825536c186d8fe2adb678d47c128a0a9adb8b098 assets/chargers/lang/en_ud.json -aab3656baf0e353c0ff89a24c9546473d043ced0 assets/chargers/lang/en_us.json -359e60783bbc261e58cf72b368da076f82988a0e assets/chargers/models/block/charger_tier_1.json -fbd6ce8fe00f240dd45f6e5e4266ea922d1b63c7 assets/chargers/models/block/charger_tier_2.json -d7fe7d288133b9666add9ceadab3bf989acc94c2 assets/chargers/models/block/charger_tier_3.json -46716e8843f56cae848de7907cfa673c8af9332b assets/chargers/models/block/charger_tier_4.json -f680b517ce9701b731adaa2a69e549cff2a1574e assets/chargers/models/block/creative_charger.json -47489096cca4f17d70a6f1b884f55d8a2e572b90 assets/chargers/models/block/wireless_charger_disabled.json -67b8e5962c2e28aa1deaaaf79cbb4ada1e1dfffa assets/chargers/models/block/wireless_charger_enabled.json -4dd89249b1f3c7f290a8e332d87d628de6f745d8 assets/chargers/models/item/charger_creative.json -0fc9a642f00b4db755843f9466651a70d6c3394b assets/chargers/models/item/charger_t1.json -102a411024d8e97b9d94596e798df64aca0bb07b assets/chargers/models/item/charger_t2.json -45b99d71fa9b56472af76bb94239afeff6b2a2d4 assets/chargers/models/item/charger_t3.json -27f093709bcd7647ed5487cdacd67fbd3d9205ba assets/chargers/models/item/charger_t4.json -220e4fff52d1b790bf7d637fc707b8f99392787e assets/chargers/models/item/wireless_charger.json -47b77c2a5f4e79f87664bf1cab230ac931e985b5 data/chargers/advancements/recipes/redstone/charger_t1.json -89a2912122aaf2f58856224981d69ca720f104c5 data/chargers/advancements/recipes/redstone/charger_t2.json -78d83a3a9319b9323295ad1e2df00eef0d7fd2c3 data/chargers/advancements/recipes/redstone/charger_t3.json -bebd8067b527a5a32d76c9f628228c4f8eb50701 data/chargers/advancements/recipes/redstone/charger_t4.json -1a6249f76304d9b4532736a54a372233f9394c89 data/chargers/advancements/recipes/redstone/wireless_charger.json -1afd73af2888f4da76bfeb16b8a064d4bac2a52e data/chargers/loot_tables/blocks/charger_creative.json -2dc52b6ea1bd571dd7aa9693a3abec16b205be6d data/chargers/loot_tables/blocks/charger_t1.json -84f2bbe76a985fad77fbdbc37876d3d753e659db data/chargers/loot_tables/blocks/charger_t2.json -c12925fb1262d9633194929d06b0ae9667bc7e7b data/chargers/loot_tables/blocks/charger_t3.json -c610f3da72900665a3d8ecf635c3c19516dd1eb6 data/chargers/loot_tables/blocks/charger_t4.json -72531419e763c3a2c618133660ba16e6e54b5bc3 data/chargers/loot_tables/blocks/wireless_charger.json -099d104d6c3e2a0984f62e863e632562615455f2 data/chargers/recipes/charger_t1.json -19c28cb03513db6835c9bb037dd9ffaf5f853c32 data/chargers/recipes/charger_t2.json -d496b5cd2857e3454712e00350a955d5a3f7a2b4 data/chargers/recipes/charger_t3.json -323b7848ed1635dbc4412048dc27a829c2f33ce2 data/chargers/recipes/charger_t4.json -872e0ee42c60419233ccce24b8e907215c940520 data/chargers/recipes/wireless_charger.json -9596b69eed507a7c84470fb89813addc3bb046e2 data/minecraft/tags/blocks/mineable/pickaxe.json -6620d130a62bf575f058803e24e7cb739222acd3 data/minecraft/tags/blocks/needs_diamond_tool.json -2832bc540df3fe30f4f5fca04a116987d8f869e1 data/minecraft/tags/blocks/needs_iron_tool.json -3886d5089b5c880b453d1273311b88b3b9def584 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e new file mode 100644 index 0000000..330fcd5 --- /dev/null +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -0,0 +1,11 @@ +// 1.21.1 2024-12-31T12:24:49.412746019 Recipes +2cfd79292eaa78b08cbc69102a42d27224b975fd data/chargers/advancement/recipes/redstone/charger_t1.json +96307402e0ad6c679ee3ba76e3023cc0820899ac data/chargers/advancement/recipes/redstone/charger_t2.json +4b0330c71f59dcdf0773e0478bb24c66dc91f9b0 data/chargers/advancement/recipes/redstone/charger_t3.json +572e570005ae9c03a0d3414aa545c4036dd54040 data/chargers/advancement/recipes/redstone/charger_t4.json +0f235969d9fbe44f8030cbf9e06424094da19387 data/chargers/advancement/recipes/redstone/wireless_charger.json +e80d338fbaa6dc80c23ebdde7cb4b7988680a0db data/chargers/recipe/charger_t1.json +0da181dcde4b6d204d2e8b222d9f11599c4fef96 data/chargers/recipe/charger_t2.json +c3ce375ae00b93ac31d4d84810f393113f3c9f67 data/chargers/recipe/charger_t3.json +5a532df7cf3b5d3b1c4efb830a56feafba88ec0b data/chargers/recipe/charger_t4.json +2ad261b18c5ac5922c02f4eae3925fe09f340545 data/chargers/recipe/wireless_charger.json diff --git a/src/generated/resources/.cache/b6f0acede259fbd4a2082320ce4a5cd62d89c445 b/src/generated/resources/.cache/b6f0acede259fbd4a2082320ce4a5cd62d89c445 new file mode 100644 index 0000000..9380d9a --- /dev/null +++ b/src/generated/resources/.cache/b6f0acede259fbd4a2082320ce4a5cd62d89c445 @@ -0,0 +1,7 @@ +// 1.21.1 2024-12-31T11:53:17.544923596 Item Models: chargers +4488feb216526cd438e97ecc265c1f671fc6ccab assets/chargers/models/item/charger_creative.json +0fc9a642f00b4db755843f9466651a70d6c3394b assets/chargers/models/item/charger_t1.json +102a411024d8e97b9d94596e798df64aca0bb07b assets/chargers/models/item/charger_t2.json +45b99d71fa9b56472af76bb94239afeff6b2a2d4 assets/chargers/models/item/charger_t3.json +27f093709bcd7647ed5487cdacd67fbd3d9205ba assets/chargers/models/item/charger_t4.json +220e4fff52d1b790bf7d637fc707b8f99392787e assets/chargers/models/item/wireless_charger.json diff --git a/src/generated/resources/.cache/ffad2062eac4ce6ed09179c4c3e09e5b65b7ef0b b/src/generated/resources/.cache/ffad2062eac4ce6ed09179c4c3e09e5b65b7ef0b new file mode 100644 index 0000000..5a519d3 --- /dev/null +++ b/src/generated/resources/.cache/ffad2062eac4ce6ed09179c4c3e09e5b65b7ef0b @@ -0,0 +1,14 @@ +// 1.21.1 2024-12-31T11:53:17.543922257 Block States: chargers +fffab3efe310ff9820eeea32890698097fd0f834 assets/chargers/blockstates/charger_creative.json +3792e9381196c8ffa0a6965a2a05d389f60b5c95 assets/chargers/blockstates/charger_t1.json +25bdc385d9e5cf3dbb17b546a5af3659ba985819 assets/chargers/blockstates/charger_t2.json +d212b963fcdf9ae026f36c24bf90c47eb118a9f5 assets/chargers/blockstates/charger_t3.json +baee84976ea206a8ec2d5b4a02e5c20b7adfa1b3 assets/chargers/blockstates/charger_t4.json +38da81727571161309afa868262fea2aea5529d8 assets/chargers/blockstates/wireless_charger.json +f680b517ce9701b731adaa2a69e549cff2a1574e assets/chargers/models/block/charger_creative.json +359e60783bbc261e58cf72b368da076f82988a0e assets/chargers/models/block/charger_tier_1.json +fbd6ce8fe00f240dd45f6e5e4266ea922d1b63c7 assets/chargers/models/block/charger_tier_2.json +d7fe7d288133b9666add9ceadab3bf989acc94c2 assets/chargers/models/block/charger_tier_3.json +46716e8843f56cae848de7907cfa673c8af9332b assets/chargers/models/block/charger_tier_4.json +47489096cca4f17d70a6f1b884f55d8a2e572b90 assets/chargers/models/block/wireless_charger_disabled.json +67b8e5962c2e28aa1deaaaf79cbb4ada1e1dfffa assets/chargers/models/block/wireless_charger_enabled.json diff --git a/src/generated/resources/assets/chargers/blockstates/charger_creative.json b/src/generated/resources/assets/chargers/blockstates/charger_creative.json index f7ee796..ce53b78 100644 --- a/src/generated/resources/assets/chargers/blockstates/charger_creative.json +++ b/src/generated/resources/assets/chargers/blockstates/charger_creative.json @@ -1,7 +1,7 @@ { "variants": { "": { - "model": "chargers:block/creative_charger" + "model": "chargers:block/charger_creative" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/chargers/lang/en_ud.json b/src/generated/resources/assets/chargers/lang/en_ud.json deleted file mode 100644 index b6ba473..0000000 --- a/src/generated/resources/assets/chargers/lang/en_ud.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "block.chargers.charger_creative": "ɹǝbɹɐɥƆ ǝʌıʇɐǝɹƆ", - "block.chargers.charger_t1": "I ɹǝı⟘ ɹǝbɹɐɥƆ", - "block.chargers.charger_t2": "II ɹǝı⟘ ɹǝbɹɐɥƆ", - "block.chargers.charger_t3": "III ɹǝı⟘ ɹǝbɹɐɥƆ", - "block.chargers.charger_t4": "ΛI ɹǝı⟘ ɹǝbɹɐɥƆ", - "block.chargers.wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM", - "block.chargers.wireless_charger.desc": "ɹǝʍod ǝuoʇspǝɹ ɥʇıʍ pǝןqɐsıp ǝq uɐƆ", - "chargers.chat.disabled": "pǝןqɐsıᗡ", - "chargers.chat.enabled": "pǝןqɐuƎ", - "chargers.chat.stored.infinite.info": "ƎℲ ∞ :ɹǝʍoԀ", - "chargers.chat.stored.info": "ƎℲ %s/%s :ɹǝʍoԀ", - "chargers.chat.wireless_charger.info": "ƎℲ %s/%s :ɹǝʍoԀ '%s :snʇɐʇS", - "chargers.gui.details.in": "ʇ/ƎℲ %s :uI", - "chargers.gui.details.out": "ʇ/ƎℲ %s :ʇnO", - "chargers.gui.energy": "ƎℲ %s/%s", - "chargers.gui.energy.infinite": "ƎℲ ∞", - "chargers.gui.io": "ʇ/ƎℲ %s :O/I", - "chargers.gui.io.more": "sןıɐʇǝp O/I ǝɹoɯ ɹoɟ ʇɟıɥs pןoH", - "chargers.gui.max_in": "ʇ/ƎℲ %s :uI xɐW", - "chargers.gui.max_out": "ʇ/ƎℲ %s :ʇnO xɐW", - "itemGroup.chargers.chargers": "sɹǝbɹɐɥƆ" -} \ No newline at end of file diff --git a/src/generated/resources/assets/chargers/lang/en_us.json b/src/generated/resources/assets/chargers/lang/en_us.json index 102684f..2e5301c 100644 --- a/src/generated/resources/assets/chargers/lang/en_us.json +++ b/src/generated/resources/assets/chargers/lang/en_us.json @@ -5,19 +5,29 @@ "block.chargers.charger_t3": "Charger Tier III", "block.chargers.charger_t4": "Charger Tier IV", "block.chargers.wireless_charger": "Wireless Charger", - "block.chargers.wireless_charger.desc": "Can be disabled with redstone power", "chargers.chat.disabled": "Disabled", "chargers.chat.enabled": "Enabled", - "chargers.chat.stored.infinite.info": "Power: ∞ FE", - "chargers.chat.stored.info": "Power: %s/%s FE", - "chargers.chat.wireless_charger.info": "Status: %s, Power: %s/%s FE", - "chargers.gui.details.in": "In: %s FE/t", - "chargers.gui.details.out": "Out: %s FE/t", - "chargers.gui.energy": "%s/%s FE", - "chargers.gui.energy.infinite": "∞ FE", - "chargers.gui.io": "I/O: %s FE/t", + "chargers.chat.wireless_charger.info": "Status: %s, %s", + "chargers.configuration.chargers": "Chargers", + "chargers.configuration.compat": "Compatability", + "chargers.configuration.curios_compat": "Curios", + "chargers.configuration.max_input": "Max Input", + "chargers.configuration.max_output": "Max Output", + "chargers.configuration.range": "Range", + "chargers.configuration.storage": "Storage", + "chargers.configuration.tier_1": "Charger Tier 1", + "chargers.configuration.tier_2": "Charger Tier 2", + "chargers.configuration.tier_3": "Charger Tier 3", + "chargers.configuration.tier_4": "Charger Tier 4", + "chargers.configuration.wireless": "Wireless Charger", + "chargers.gui.details.in": "In: %s", + "chargers.gui.details.out": "Out: %s", + "chargers.gui.io": "I/O: %s", "chargers.gui.io.more": "Hold shift for more I/O details", - "chargers.gui.max_in": "Max In: %s FE/t", - "chargers.gui.max_out": "Max Out: %s FE/t", - "itemGroup.chargers.chargers": "Chargers" + "chargers.gui.max_in": "Max In: %s", + "chargers.gui.max_out": "Max Out: %s", + "chargers.misc.power.info": "Power: %s", + "chargers.tooltip.wireless_charger": "Can be disabled with redstone power", + "itemGroup.chargers.chargers": "Chargers", + "pack.chargers.description": "Chargers mod resources" } \ No newline at end of file diff --git a/src/generated/resources/assets/chargers/models/block/creative_charger.json b/src/generated/resources/assets/chargers/models/block/charger_creative.json similarity index 100% rename from src/generated/resources/assets/chargers/models/block/creative_charger.json rename to src/generated/resources/assets/chargers/models/block/charger_creative.json diff --git a/src/generated/resources/assets/chargers/models/item/charger_creative.json b/src/generated/resources/assets/chargers/models/item/charger_creative.json index 7f3c321..cfc3dec 100644 --- a/src/generated/resources/assets/chargers/models/item/charger_creative.json +++ b/src/generated/resources/assets/chargers/models/item/charger_creative.json @@ -1,3 +1,3 @@ { - "parent": "chargers:block/creative_charger" + "parent": "chargers:block/charger_creative" } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t1.json b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t1.json similarity index 79% rename from src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t1.json rename to src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t1.json index 3e2530e..ae19a4f 100644 --- a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t1.json +++ b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t1.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "forge:dusts/redstone" + "items": "#c:dusts/redstone" } ] }, @@ -15,7 +15,7 @@ "conditions": { "items": [ { - "tag": "forge:ingots/iron" + "items": "#c:ingots/iron" } ] }, @@ -25,7 +25,7 @@ "conditions": { "items": [ { - "tag": "forge:storage_blocks/redstone" + "items": "#c:storage_blocks/redstone" } ] }, @@ -40,16 +40,15 @@ }, "requirements": [ [ + "has_the_recipe", "has_ingots_iron", "has_dusts_redstone", - "has_storage_blocks_redstone", - "has_the_recipe" + "has_storage_blocks_redstone" ] ], "rewards": { "recipes": [ "chargers:charger_t1" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t2.json b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t2.json similarity index 74% rename from src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t2.json rename to src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t2.json index 1e2d3c0..8feaea5 100644 --- a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t2.json +++ b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t2.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "chargers:charger_t1" - ] + "items": "chargers:charger_t1" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_charger_t1", - "has_the_recipe" + "has_the_recipe", + "has_charger_t1" ] ], "rewards": { "recipes": [ "chargers:charger_t2" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t3.json b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t3.json similarity index 74% rename from src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t3.json rename to src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t3.json index 5d3556e..c959a4b 100644 --- a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t3.json +++ b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t3.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "chargers:charger_t2" - ] + "items": "chargers:charger_t2" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_charger_t2", - "has_the_recipe" + "has_the_recipe", + "has_charger_t2" ] ], "rewards": { "recipes": [ "chargers:charger_t3" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t4.json b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t4.json similarity index 74% rename from src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t4.json rename to src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t4.json index 1c7e76f..71a1bbb 100644 --- a/src/generated/resources/data/chargers/advancements/recipes/redstone/charger_t4.json +++ b/src/generated/resources/data/chargers/advancement/recipes/redstone/charger_t4.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "chargers:charger_t3" - ] + "items": "chargers:charger_t3" } ] }, @@ -22,14 +20,13 @@ }, "requirements": [ [ - "has_charger_t3", - "has_the_recipe" + "has_the_recipe", + "has_charger_t3" ] ], "rewards": { "recipes": [ "chargers:charger_t4" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/advancements/recipes/redstone/wireless_charger.json b/src/generated/resources/data/chargers/advancement/recipes/redstone/wireless_charger.json similarity index 79% rename from src/generated/resources/data/chargers/advancements/recipes/redstone/wireless_charger.json rename to src/generated/resources/data/chargers/advancement/recipes/redstone/wireless_charger.json index 5afb531..752e9ae 100644 --- a/src/generated/resources/data/chargers/advancements/recipes/redstone/wireless_charger.json +++ b/src/generated/resources/data/chargers/advancement/recipes/redstone/wireless_charger.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "tag": "forge:dusts/redstone" + "items": "#c:dusts/redstone" } ] }, @@ -15,7 +15,7 @@ "conditions": { "items": [ { - "tag": "forge:ender_pearls" + "items": "#c:ender_pearls" } ] }, @@ -25,7 +25,7 @@ "conditions": { "items": [ { - "tag": "forge:ingots/iron" + "items": "#c:ingots/iron" } ] }, @@ -35,7 +35,7 @@ "conditions": { "items": [ { - "tag": "forge:storage_blocks/redstone" + "items": "#c:storage_blocks/redstone" } ] }, @@ -50,17 +50,16 @@ }, "requirements": [ [ + "has_the_recipe", "has_ender_pearls", "has_ingots_iron", "has_dusts_redstone", - "has_storage_blocks_redstone", - "has_the_recipe" + "has_storage_blocks_redstone" ] ], "rewards": { "recipes": [ "chargers:wireless_charger" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/charger_creative.json b/src/generated/resources/data/chargers/loot_table/blocks/charger_creative.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/charger_creative.json rename to src/generated/resources/data/chargers/loot_table/blocks/charger_creative.json index b696226..86e2027 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/charger_creative.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/charger_creative.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:charger_creative" } ], diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t1.json b/src/generated/resources/data/chargers/loot_table/blocks/charger_t1.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/charger_t1.json rename to src/generated/resources/data/chargers/loot_table/blocks/charger_t1.json index 9771108..702b7df 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t1.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/charger_t1.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:charger_t1" } ], diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t2.json b/src/generated/resources/data/chargers/loot_table/blocks/charger_t2.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/charger_t2.json rename to src/generated/resources/data/chargers/loot_table/blocks/charger_t2.json index 07559e3..7941ade 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t2.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/charger_t2.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:charger_t2" } ], diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t3.json b/src/generated/resources/data/chargers/loot_table/blocks/charger_t3.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/charger_t3.json rename to src/generated/resources/data/chargers/loot_table/blocks/charger_t3.json index 34eb020..42b4e82 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t3.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/charger_t3.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:charger_t3" } ], diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t4.json b/src/generated/resources/data/chargers/loot_table/blocks/charger_t4.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/charger_t4.json rename to src/generated/resources/data/chargers/loot_table/blocks/charger_t4.json index 8a1070a..d5ead99 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/charger_t4.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/charger_t4.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:charger_t4" } ], diff --git a/src/generated/resources/data/chargers/loot_tables/blocks/wireless_charger.json b/src/generated/resources/data/chargers/loot_table/blocks/wireless_charger.json similarity index 58% rename from src/generated/resources/data/chargers/loot_tables/blocks/wireless_charger.json rename to src/generated/resources/data/chargers/loot_table/blocks/wireless_charger.json index 5e3e6a2..5d9c44b 100644 --- a/src/generated/resources/data/chargers/loot_tables/blocks/wireless_charger.json +++ b/src/generated/resources/data/chargers/loot_table/blocks/wireless_charger.json @@ -11,6 +11,16 @@ "entries": [ { "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name", + "chargers:energy" + ], + "source": "block_entity" + } + ], "name": "chargers:wireless_charger" } ], diff --git a/src/generated/resources/data/chargers/recipes/charger_t1.json b/src/generated/resources/data/chargers/recipe/charger_t1.json similarity index 52% rename from src/generated/resources/data/chargers/recipes/charger_t1.json rename to src/generated/resources/data/chargers/recipe/charger_t1.json index 92cdc52..359d7c3 100644 --- a/src/generated/resources/data/chargers/recipes/charger_t1.json +++ b/src/generated/resources/data/chargers/recipe/charger_t1.json @@ -3,13 +3,13 @@ "category": "redstone", "key": { "B": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" }, "I": { - "tag": "forge:ingots/iron" + "tag": "c:ingots/iron" }, "R": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -18,7 +18,7 @@ "IRI" ], "result": { - "item": "chargers:charger_t1" - }, - "show_notification": true + "count": 1, + "id": "chargers:charger_t1" + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/recipes/charger_t2.json b/src/generated/resources/data/chargers/recipe/charger_t2.json similarity index 58% rename from src/generated/resources/data/chargers/recipes/charger_t2.json rename to src/generated/resources/data/chargers/recipe/charger_t2.json index 8d9b827..3eb8d24 100644 --- a/src/generated/resources/data/chargers/recipes/charger_t2.json +++ b/src/generated/resources/data/chargers/recipe/charger_t2.json @@ -3,16 +3,16 @@ "category": "redstone", "key": { "B": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" }, "C": { "item": "chargers:charger_t1" }, "G": { - "tag": "forge:ingots/gold" + "tag": "c:ingots/gold" }, "R": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -21,7 +21,7 @@ "GCG" ], "result": { - "item": "chargers:charger_t2" - }, - "show_notification": true + "count": 1, + "id": "chargers:charger_t2" + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/recipes/charger_t3.json b/src/generated/resources/data/chargers/recipe/charger_t3.json similarity index 58% rename from src/generated/resources/data/chargers/recipes/charger_t3.json rename to src/generated/resources/data/chargers/recipe/charger_t3.json index d855a62..912cfec 100644 --- a/src/generated/resources/data/chargers/recipes/charger_t3.json +++ b/src/generated/resources/data/chargers/recipe/charger_t3.json @@ -3,16 +3,16 @@ "category": "redstone", "key": { "B": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" }, "C": { "item": "chargers:charger_t2" }, "D": { - "tag": "forge:gems/diamond" + "tag": "c:gems/diamond" }, "R": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -21,7 +21,7 @@ "DCD" ], "result": { - "item": "chargers:charger_t3" - }, - "show_notification": true + "count": 1, + "id": "chargers:charger_t3" + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/recipes/charger_t4.json b/src/generated/resources/data/chargers/recipe/charger_t4.json similarity index 57% rename from src/generated/resources/data/chargers/recipes/charger_t4.json rename to src/generated/resources/data/chargers/recipe/charger_t4.json index 928e9a7..6c00e1b 100644 --- a/src/generated/resources/data/chargers/recipes/charger_t4.json +++ b/src/generated/resources/data/chargers/recipe/charger_t4.json @@ -3,16 +3,16 @@ "category": "redstone", "key": { "B": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" }, "C": { "item": "chargers:charger_t3" }, "N": { - "tag": "forge:ingots/netherite" + "tag": "c:ingots/netherite" }, "R": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -21,7 +21,7 @@ "NCN" ], "result": { - "item": "chargers:charger_t4" - }, - "show_notification": true + "count": 1, + "id": "chargers:charger_t4" + } } \ No newline at end of file diff --git a/src/generated/resources/data/chargers/recipes/wireless_charger.json b/src/generated/resources/data/chargers/recipe/wireless_charger.json similarity index 50% rename from src/generated/resources/data/chargers/recipes/wireless_charger.json rename to src/generated/resources/data/chargers/recipe/wireless_charger.json index 9a60330..8144095 100644 --- a/src/generated/resources/data/chargers/recipes/wireless_charger.json +++ b/src/generated/resources/data/chargers/recipe/wireless_charger.json @@ -3,16 +3,16 @@ "category": "redstone", "key": { "B": { - "tag": "forge:storage_blocks/redstone" + "tag": "c:storage_blocks/redstone" }, "E": { - "tag": "forge:ender_pearls" + "tag": "c:ender_pearls" }, "I": { - "tag": "forge:ingots/iron" + "tag": "c:ingots/iron" }, "R": { - "tag": "forge:dusts/redstone" + "tag": "c:dusts/redstone" } }, "pattern": [ @@ -21,7 +21,7 @@ "IRI" ], "result": { - "item": "chargers:wireless_charger" - }, - "show_notification": true + "count": 1, + "id": "chargers:wireless_charger" + } } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json rename to src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json rename to src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json rename to src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json similarity index 100% rename from src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json rename to src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json diff --git a/src/generated/resources/pack.mcmeta b/src/generated/resources/pack.mcmeta new file mode 100644 index 0000000..ffae5c2 --- /dev/null +++ b/src/generated/resources/pack.mcmeta @@ -0,0 +1,12 @@ +{ + "pack": { + "description": { + "translate": "pack.chargers.description" + }, + "pack_format": 48, + "supported_formats": [ + 0, + 2147483647 + ] + } +} \ No newline at end of file diff --git a/src/main/java/se/gory_moon/chargers/ChargersMod.java b/src/main/java/se/gory_moon/chargers/ChargersMod.java index a02933f..7e749fe 100644 --- a/src/main/java/se/gory_moon/chargers/ChargersMod.java +++ b/src/main/java/se/gory_moon/chargers/ChargersMod.java @@ -1,62 +1,70 @@ package se.gory_moon.chargers; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.providers.ProviderType; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraftforge.common.util.Lazy; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraft.DetectedVersion; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.data.metadata.PackMetadataGenerator; +import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.metadata.pack.PackMetadataSection; +import net.minecraft.util.InclusiveRange; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; import se.gory_moon.chargers.block.BlockRegistry; import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.crafting.RecipeSerializers; +import se.gory_moon.chargers.data.*; +import se.gory_moon.chargers.handler.CapabilityRegistrationHandler; +import se.gory_moon.chargers.item.ChargerDataComponents; import se.gory_moon.chargers.item.ItemRegistry; -import se.gory_moon.chargers.network.PacketHandler; +import se.gory_moon.chargers.network.PayloadRegister; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; @Mod(Constants.MOD_ID) public class ChargersMod { - private static final Lazy REGISTRATE = Lazy.of(() -> Registrate.create(Constants.MOD_ID)); - - public ChargersMod() { - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::gatherData); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - BlockRegistry.init(); - BlockEntityRegistry.init(); - ItemRegistry.init(); - RecipeSerializers.RECIPE_SERIALIZERS.register(FMLJavaModLoadingContext.get().getModEventBus()); - ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Configs.serverSpec); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Configs.commonSpec); - } + public ChargersMod(IEventBus modBus, ModContainer container) { + modBus.addListener(this::gatherData); + modBus.addListener(PayloadRegister::onPayloadRegister); + modBus.addListener(CapabilityRegistrationHandler::registerCapabilities); - public static Registrate getRegistrate() { - return REGISTRATE.get(); - } + BlockRegistry.BLOCKS.register(modBus);; + BlockRegistry.BLOCK_TYPES.register(modBus); + BlockEntityRegistry.BlOCK_ENTITIES.register(modBus); + BlockEntityRegistry.MENU_TYPES.register(modBus); + ItemRegistry.ITEMS.register(modBus); + ItemRegistry.CREATIVE_TABS.register(modBus); + ChargerDataComponents.DATA_COMPONENTS.register(modBus); - private void setup(FMLCommonSetupEvent event) { - PacketHandler.init(); + RecipeSerializers.RECIPE_SERIALIZER.register(modBus); + container.registerConfig(ModConfig.Type.SERVER, Configs.serverSpec); } private void gatherData(GatherDataEvent event) { - getRegistrate().addDataGenerator(ProviderType.LANG, prov -> { - prov.addTooltip(BlockRegistry.WIRELESS_CHARGER, "Can be disabled with redstone power"); - prov.add(LangKeys.CHAT_WIRELESS_CHARGER_INFO.key(), "Status: %s, Power: %s/%s FE"); - prov.add(LangKeys.CHAT_ENABLED.key(), "Enabled"); - prov.add(LangKeys.CHAT_DISABLED.key(), "Disabled"); - prov.add(LangKeys.CHAT_STORED_INFO.key(), "Power: %s/%s FE"); - prov.add(LangKeys.CHAT_STORED_INFINITE_INFO.key(), "Power: ∞ FE"); - - prov.add(LangKeys.GUI_ENERGY.key(), "%s/%s FE"); - prov.add(LangKeys.GUI_ENERGY_INFINITE.key(), "∞ FE"); - prov.add(LangKeys.GUI_MAX_IN.key(), "Max In: %s FE/t"); - prov.add(LangKeys.GUI_MAX_OUT.key(), "Max Out: %s FE/t"); - prov.add(LangKeys.GUI_IO.key(), "I/O: %s FE/t"); - prov.add(LangKeys.GUI_IO_MORE.key(), "Hold shift for more I/O details"); - prov.add(LangKeys.GUI_DETAILS_IN.key(), "In: %s FE/t"); - prov.add(LangKeys.GUI_DETAILS_OUT.key(), "Out: %s FE/t"); - }); + DataGenerator gen = event.getGenerator(); + PackOutput packOutput = gen.getPackOutput(); + CompletableFuture lookupProvider = event.getLookupProvider(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + + gen.addProvider(true, new PackMetadataGenerator(packOutput) + .add(PackMetadataSection.TYPE, new PackMetadataSection( + Component.translatable(LangKeys.PACK_DESCRIPTION.key()), + DetectedVersion.BUILT_IN.getPackVersion(PackType.SERVER_DATA), + Optional.of(new InclusiveRange<>(0, Integer.MAX_VALUE))))); + + gen.addProvider(event.includeClient(), new ChargerLanguageProvider(packOutput)); + gen.addProvider(event.includeClient(), new ChargerBlockStateProvider(packOutput, existingFileHelper)); + gen.addProvider(event.includeClient(), new ChargerItemModelProvider(packOutput, existingFileHelper)); + + gen.addProvider(event.includeServer(), new ChargerBlockTagsProvider(packOutput, lookupProvider, existingFileHelper)); + gen.addProvider(event.includeServer(), new ChargerRecipeProvider(packOutput, lookupProvider)); + gen.addProvider(event.includeServer(), new ChargerLootTableProvider(packOutput, lookupProvider)); } } diff --git a/src/main/java/se/gory_moon/chargers/ChargersModClient.java b/src/main/java/se/gory_moon/chargers/ChargersModClient.java new file mode 100644 index 0000000..70eec48 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/ChargersModClient.java @@ -0,0 +1,26 @@ +package se.gory_moon.chargers; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; +import net.neoforged.neoforge.client.gui.ConfigurationScreen; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; +import se.gory_moon.chargers.client.ChargerScreen; + +@Mod(value = Constants.MOD_ID, dist = Dist.CLIENT) +public class ChargersModClient { + + public ChargersModClient(IEventBus modBus, ModContainer container) { + modBus.addListener(this::registerScreens); + + // Register the configuration screen + container.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); + } + + private void registerScreens(RegisterMenuScreensEvent event) { + event.register(BlockEntityRegistry.CHARGER_MENU.get(), ChargerScreen::new); + } +} diff --git a/src/main/java/se/gory_moon/chargers/Configs.java b/src/main/java/se/gory_moon/chargers/Configs.java index b5a2adb..971f253 100644 --- a/src/main/java/se/gory_moon/chargers/Configs.java +++ b/src/main/java/se/gory_moon/chargers/Configs.java @@ -1,26 +1,17 @@ package se.gory_moon.chargers; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.neoforge.common.ModConfigSpec; import org.apache.commons.lang3.tuple.Pair; -@Mod.EventBusSubscriber(modid = Constants.MOD_ID) public class Configs { public static final Server SERVER; - public static final ForgeConfigSpec serverSpec; - - public static final Common COMMON; - public static final ForgeConfigSpec commonSpec; + public static final ModConfigSpec serverSpec; static { - Pair configSpecPairServer = new ForgeConfigSpec.Builder().configure(Server::new); + Pair configSpecPairServer = new ModConfigSpec.Builder().configure(Server::new); serverSpec = configSpecPairServer.getRight(); SERVER = configSpecPairServer.getLeft(); - - Pair configSpecPairCommon = new ForgeConfigSpec.Builder().configure(Common::new); - commonSpec = configSpecPairCommon.getRight(); - COMMON = configSpecPairCommon.getLeft(); } public static class Server { @@ -30,7 +21,9 @@ public static class Server { public Tier tier4; public Wireless wireless; - Server(ForgeConfigSpec.Builder builder) { + public ModConfigSpec.BooleanValue curiosCompat; + + Server(ModConfigSpec.Builder builder) { builder.comment("Chargers configs") .push("chargers"); @@ -53,16 +46,25 @@ public static class Server { builder.push("wireless"); wireless = new Wireless(builder, 200000, 4000, 4000, 24); builder.pop(2); + + builder.comment("Compat configs") + .push("compat"); + + curiosCompat = builder + .comment("If the wireless charger should charge curios items") + .define("curios_compat", true); + + builder.pop(); } public static class Tier { - public ForgeConfigSpec.LongValue storage; + public ModConfigSpec.LongValue storage; - public ForgeConfigSpec.LongValue maxInput; + public ModConfigSpec.LongValue maxInput; - public ForgeConfigSpec.LongValue maxOutput; + public ModConfigSpec.LongValue maxOutput; - private Tier(ForgeConfigSpec.Builder builder, int storage, int in, int out) { + private Tier(ModConfigSpec.Builder builder, int storage, int in, int out) { this.storage = builder .comment("The amount of energy the charger can hold") .worldRestart() @@ -82,12 +84,12 @@ private Tier(ForgeConfigSpec.Builder builder, int storage, int in, int out) { public static class Wireless { - public ForgeConfigSpec.LongValue storage; - public ForgeConfigSpec.LongValue maxInput; - public ForgeConfigSpec.LongValue maxOutput; - public ForgeConfigSpec.IntValue range; + public ModConfigSpec.LongValue storage; + public ModConfigSpec.LongValue maxInput; + public ModConfigSpec.LongValue maxOutput; + public ModConfigSpec.IntValue range; - protected Wireless(ForgeConfigSpec.Builder builder, int storage, int in, int out, int range) { + protected Wireless(ModConfigSpec.Builder builder, int storage, int in, int out, int range) { this.storage = builder .comment("The amount of energy the wireless charger can hold") .worldRestart() @@ -109,22 +111,4 @@ protected Wireless(ForgeConfigSpec.Builder builder, int storage, int in, int out } } } - - public static class Common { - public ForgeConfigSpec.BooleanValue curiosCompat; - - Common(ForgeConfigSpec.Builder builder) { - builder.comment("Common configs") - .push("common"); - - builder.comment("Compat configs") - .push("compat"); - - curiosCompat = builder - .comment("If curios compat should be enabled") - .define("curios_compat", true); - - builder.pop(2); - } - } } diff --git a/src/main/java/se/gory_moon/chargers/Constants.java b/src/main/java/se/gory_moon/chargers/Constants.java index cd579e8..c0b8f22 100644 --- a/src/main/java/se/gory_moon/chargers/Constants.java +++ b/src/main/java/se/gory_moon/chargers/Constants.java @@ -1,31 +1,14 @@ package se.gory_moon.chargers; -import net.minecraft.resources.ResourceLocation; - public class Constants { public static final String MOD_ID = "chargers"; - public static ResourceLocation NET_ID = new ResourceLocation(MOD_ID, "net"); - public static final String CHARGER_T1_BLOCK = "charger_t1"; - public static final String CHARGER_T1_NAME = "Charger Tier I"; - public static final String CHARGER_T2_BLOCK = "charger_t2"; - public static final String CHARGER_T2_NAME = "Charger Tier II"; - public static final String CHARGER_T3_BLOCK = "charger_t3"; - public static final String CHARGER_T3_NAME = "Charger Tier III"; - public static final String CHARGER_T4_BLOCK = "charger_t4"; - public static final String CHARGER_T4_NAME = "Charger Tier IV"; - public static final String CHARGER_CREATIVE_BLOCK = "charger_creative"; - public static final String CHARGER_CREATIVE_NAME = "Creative Charger"; - - public static final String CHARGER_BLOCK_ENTITY = "charger"; - public static final String CHARGER_CONTAINER = "charger"; - public static final String WIRELESS_CHARGER_BLOCK = "wireless_charger"; - public static final String WIRELESS_CHARGER_NAME = "Wireless Charger"; - public static final String WIRELESS_CHARGER_BLOCK_ENTITY = WIRELESS_CHARGER_BLOCK; + + public static final String CHARGER_BLOCK = "charger"; } diff --git a/src/main/java/se/gory_moon/chargers/EnergyFormatting.java b/src/main/java/se/gory_moon/chargers/EnergyFormatting.java new file mode 100644 index 0000000..ea86d10 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/EnergyFormatting.java @@ -0,0 +1,51 @@ +package se.gory_moon.chargers; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.energy.IEnergyStorage; +import se.gory_moon.chargers.power.CustomEnergyStorage; + +import java.text.DecimalFormat; +import java.util.List; + +public class EnergyFormatting { + + public static Component FE = Component.literal(" FE").withStyle(ChatFormatting.DARK_AQUA); + public static Component SLASH = Component.literal("/").withStyle(ChatFormatting.GOLD); + public static Component FE_TICK = FE.copy().append(SLASH).append(Component.literal("t").withStyle(ChatFormatting.DARK_AQUA)); + public static Component POSITIVE = Component.literal("+").withStyle(ChatFormatting.GREEN); + public static Component NEGATIVE = Component.literal("-").withStyle(ChatFormatting.RED); + public static Component INFINITE = Component.literal("∞").withStyle(ChatFormatting.WHITE).append(FE); + + public static Component formatAndClean(long number) { + return Component.literal(new DecimalFormat().format(number)).withStyle(ChatFormatting.WHITE); + } + + public static Component formatEnergyPerTick(long energy) { + return formatAndClean(Math.abs(energy)).copy().append(FE_TICK).withStyle(ChatFormatting.WHITE); + } + + public static Component formatFilledCapacity(long amount, long capacity) { + return Component.translatable(LangKeys.POWER_INFO.key(), + formatAndClean(amount).copy().append(SLASH).append(formatAndClean(capacity)).append(FE) + ).withStyle(ChatFormatting.GOLD); + } + + public static void addEnergyTooltip(ItemStack stack, List tooltip) { + IEnergyStorage energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (energyStorage != null) { + long stored; + long max; + if (energyStorage instanceof CustomEnergyStorage storage) { + stored = storage.getLongEnergyStored(); + max = storage.getLongMaxEnergyStored(); + } else { + stored = energyStorage.getEnergyStored(); + max = energyStorage.getMaxEnergyStored(); + } + tooltip.add(formatFilledCapacity(stored, max)); + } + } +} \ No newline at end of file diff --git a/src/main/java/se/gory_moon/chargers/LangKeys.java b/src/main/java/se/gory_moon/chargers/LangKeys.java index aff5534..c46e41d 100644 --- a/src/main/java/se/gory_moon/chargers/LangKeys.java +++ b/src/main/java/se/gory_moon/chargers/LangKeys.java @@ -4,23 +4,43 @@ public enum LangKeys { CHAT_WIRELESS_CHARGER_INFO("chat.wireless_charger.info"), CHAT_ENABLED("chat.enabled"), CHAT_DISABLED("chat.disabled"), - CHAT_STORED_INFO("chat.stored.info"), - CHAT_STORED_INFINITE_INFO("chat.stored.infinite.info"), - GUI_ENERGY("gui.energy"), - GUI_ENERGY_INFINITE("gui.energy.infinite"), + POWER_INFO("misc.power.info"), + GUI_MAX_IN("gui.max_in"), GUI_MAX_OUT("gui.max_out"), GUI_IO("gui.io"), GUI_DETAILS_IN("gui.details.in"), GUI_DETAILS_OUT("gui.details.out"), - GUI_IO_MORE("gui.io.more"); + GUI_IO_MORE("gui.io.more"), + + CONFIG_CHARGERS("configuration.chargers"), + CONFIG_COMPAT("configuration.compat"), + CONFIG_CURIOS_COMPAT("configuration.curios_compat"), + CONFIG_MAX_INPUT("configuration.max_input"), + CONFIG_MAX_OUTPUT("configuration.max_output"), + CONFIG_STORAGE("configuration.storage"), + CONFIG_RANGE("configuration.range"), + + CONFIG_WIRELESS("configuration.wireless"), + CONFIG_TIER_1("configuration.tier_1"), + CONFIG_TIER_2("configuration.tier_2"), + CONFIG_TIER_3("configuration.tier_3"), + CONFIG_TIER_4("configuration.tier_4"), + TOOLTIP_WIRELESS_CHARGER("tooltip.wireless_charger"), + + CREATIVE_TAB("itemGroup.chargers.chargers", true), + PACK_DESCRIPTION("pack.chargers.description", true); private final String key; LangKeys(String key) { - this.key = Constants.MOD_ID + "." + key; + this(key, false); + } + + LangKeys(String key, boolean raw) { + this.key = raw ? key : Constants.MOD_ID + "." + key; } public String key() { diff --git a/src/main/java/se/gory_moon/chargers/Utils.java b/src/main/java/se/gory_moon/chargers/Utils.java deleted file mode 100644 index 95f4e7e..0000000 --- a/src/main/java/se/gory_moon/chargers/Utils.java +++ /dev/null @@ -1,35 +0,0 @@ -package se.gory_moon.chargers; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import se.gory_moon.chargers.power.CustomEnergyStorage; - -import java.text.NumberFormat; -import java.util.List; - -public class Utils { - - public static String clean(String in) { - return in.replaceAll("\u00A0", " "); - } - - public static String formatAndClean(long number) { - return clean(NumberFormat.getInstance().format(number)); - } - - public static void addEnergyTooltip(ItemStack stack, List tooltip) { - stack.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(energyStorage -> { - String stored; - String max; - if (energyStorage instanceof CustomEnergyStorage storage) { - stored = formatAndClean(storage.getLongEnergyStored()); - max = formatAndClean(storage.getLongMaxEnergyStored()); - } else { - stored = formatAndClean(energyStorage.getEnergyStored()); - max = formatAndClean(energyStorage.getMaxEnergyStored()); - } - tooltip.add(Component.translatable(LangKeys.CHAT_STORED_INFO.key(), stored, max)); - }); - } -} \ No newline at end of file diff --git a/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java b/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java index 06f9c9b..bc9fe06 100644 --- a/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java +++ b/src/main/java/se/gory_moon/chargers/block/BlockRegistry.java @@ -1,223 +1,92 @@ package se.gory_moon.chargers.block; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.DataIngredient; -import com.tterrag.registrate.util.entry.BlockEntry; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.tags.BlockTags; -import net.minecraft.world.item.Rarity; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MapColor; -import net.minecraftforge.common.Tags; -import se.gory_moon.chargers.ChargersMod; -import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; -import se.gory_moon.chargers.crafting.UpgradeChargerRecipeBuilder; -import se.gory_moon.chargers.item.ChargerBlockItem; -import se.gory_moon.chargers.item.ItemRegistry; -import se.gory_moon.chargers.item.WirelessChargerBlockItem; - -import static se.gory_moon.chargers.Constants.*; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import se.gory_moon.chargers.Constants; public final class BlockRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Constants.MOD_ID); + public static final DeferredRegister> BLOCK_TYPES = DeferredRegister.create(BuiltInRegistries.BLOCK_TYPE, Constants.MOD_ID); - public static final BlockEntry CHARGER_BLOCK_T1 = REGISTRATE.object(CHARGER_T1_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T1_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T1 = BLOCKS.registerBlock( + Constants.CHARGER_T1_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.I, properties), + Block.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_GRAY) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_1", - provider.modLoc("block/charger_tier_1_side"), - provider.modLoc("block/charger_tier_1"), - provider.modLoc("block/charger_tier_1_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.COMMON)) - .recipe((context, provider) -> { - DataIngredient iron = DataIngredient.tag(Tags.Items.INGOTS_IRON); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - - var builder = ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, context.get()) - .define('I', iron) - .define('R', redstone) - .define('B', redstoneBlock); - builder.pattern("IRI").pattern("IBI").pattern("IRI"); - builder.unlockedBy("has_" + provider.safeName(iron), iron.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstone), redstone.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstoneBlock), redstoneBlock.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_T2 = REGISTRATE.object(CHARGER_T2_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T2_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T2 = BLOCKS.registerBlock( + Constants.CHARGER_T2_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.II, properties), + BlockBehaviour.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.GOLD) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_STONE_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_2", - provider.modLoc("block/charger_tier_2_side"), - provider.modLoc("block/charger_tier_2"), - provider.modLoc("block/charger_tier_2_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .recipe((context, provider) -> { - DataIngredient gold = DataIngredient.tag(Tags.Items.INGOTS_GOLD); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t1 = DataIngredient.items(ItemRegistry.CHARGER_T1_ITEM.get()); - - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('G', gold) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t1); - builder.pattern("GRG").pattern("GBG").pattern("GCG"); - builder.unlockedBy("has_" + provider.safeName(charger_t1), charger_t1.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_T3 = REGISTRATE.object(CHARGER_T3_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T3_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T3 = BLOCKS.registerBlock( + Constants.CHARGER_T3_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.III, properties), + Block.Properties.of() .strength(10, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_CYAN) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_IRON_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_3", - provider.modLoc("block/charger_tier_3_side"), - provider.modLoc("block/charger_tier_3"), - provider.modLoc("block/charger_tier_3_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.RARE)) - .recipe((context, provider) -> { - DataIngredient diamond = DataIngredient.tag(Tags.Items.GEMS_DIAMOND); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t2 = DataIngredient.items(ItemRegistry.CHARGER_T2_ITEM.get()); + .requiresCorrectToolForDrops() + ); - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('D', diamond) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t2); - builder.pattern("DRD").pattern("DBD").pattern("DCD"); - builder.unlockedBy("has_" + provider.safeName(charger_t2), charger_t2.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); - - public static final BlockEntry CHARGER_BLOCK_T4 = REGISTRATE.object(CHARGER_T4_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_T4_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_T4 = BLOCKS.registerBlock( + Constants.CHARGER_T4_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.IV, properties), + BlockBehaviour.Properties.of() .strength(30, 1200) .sound(SoundType.NETHERITE_BLOCK) .mapColor(MapColor.COLOR_BLACK) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_DIAMOND_TOOL) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("charger_tier_4", - provider.modLoc("block/charger_tier_4_side"), - provider.modLoc("block/charger_tier_4"), - provider.modLoc("block/charger_tier_4_top")))) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.EPIC)) - .recipe((context, provider) -> { - DataIngredient netherite = DataIngredient.tag(Tags.Items.INGOTS_NETHERITE); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient charger_t3 = DataIngredient.items(ItemRegistry.CHARGER_T3_ITEM.get()); - - var builder = UpgradeChargerRecipeBuilder.builder(RecipeCategory.REDSTONE, context.get()) - .define('N', netherite) - .define('R', redstone) - .define('B', redstoneBlock) - .define('C', charger_t3); - builder.pattern("NRN").pattern("NBN").pattern("NCN"); - builder.unlockedBy("has_" + provider.safeName(charger_t3), charger_t3.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry CHARGER_BLOCK_CREATIVE = REGISTRATE.object(CHARGER_CREATIVE_BLOCK) - .block(ChargerBlock::new) - .lang(CHARGER_CREATIVE_NAME) - .properties(properties -> properties + public static final DeferredBlock CHARGER_BLOCK_CREATIVE = BLOCKS.registerBlock( + Constants.CHARGER_CREATIVE_BLOCK, + properties -> new ChargerBlock(ChargerBlock.Tier.C, properties), + BlockBehaviour.Properties.of() .strength(50, 1200) .sound(SoundType.NETHERITE_BLOCK) .mapColor(MapColor.COLOR_PURPLE) - .requiresCorrectToolForDrops()) - .blockstate((ctx, provider) -> provider.simpleBlock(ctx.get(), - provider.models().cubeBottomTop("creative_charger", - provider.modLoc("block/charger_creative_side"), - provider.modLoc("block/charger_creative"), - provider.modLoc("block/charger_creative_top")))) - .tag(BlockTags.MINEABLE_WITH_PICKAXE, BlockTags.NEEDS_DIAMOND_TOOL) - .item(ChargerBlockItem::new) - .properties(p -> p.rarity(Rarity.EPIC)) - .build() - .register(); + .requiresCorrectToolForDrops() + ); - public static final BlockEntry WIRELESS_CHARGER = REGISTRATE.object(WIRELESS_CHARGER_BLOCK) - .block(WirelessChargerBlock::new) - .simpleBlockEntity(WirelessChargerBlockEntity::new) - .lang(WIRELESS_CHARGER_NAME) - .properties(properties -> properties + public static final DeferredBlock WIRELESS_CHARGER = BLOCKS.registerBlock( + Constants.WIRELESS_CHARGER_BLOCK, + WirelessChargerBlock::new, + BlockBehaviour.Properties.of() .strength(5, 10) .sound(SoundType.METAL) .mapColor(MapColor.COLOR_GRAY) - .requiresCorrectToolForDrops()) - .tag(BlockTags.MINEABLE_WITH_PICKAXE) - .blockstate((ctx, provider) -> provider.getVariantBuilder(ctx.get()) - .partialState().with(WirelessChargerBlock.POWERED, false) - .modelForState().modelFile(provider.models().cubeAll("wireless_charger_disabled", provider.modLoc("block/wireless_charger_disabled"))).addModel() - .partialState().with(WirelessChargerBlock.POWERED, true) - .modelForState().modelFile(provider.models().cubeAll("wireless_charger_enabled", provider.modLoc("block/wireless_charger_enabled"))).addModel() - ) - .item(WirelessChargerBlockItem::new) - .model((context, provider) -> provider.blockItem(() -> context.get().getBlock(), "_disabled")) - .recipe((context, provider) -> { - DataIngredient iron = DataIngredient.tag(Tags.Items.INGOTS_IRON); - DataIngredient redstone = DataIngredient.tag(Tags.Items.DUSTS_REDSTONE); - DataIngredient redstoneBlock = DataIngredient.tag(Tags.Items.STORAGE_BLOCKS_REDSTONE); - DataIngredient enderPearls = DataIngredient.tag(Tags.Items.ENDER_PEARLS); - - ShapedRecipeBuilder builder = ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, context.get()) - .define('I', iron) - .define('R', redstone) - .define('B', redstoneBlock) - .define('E', enderPearls); - builder.pattern("IEI").pattern("IBI").pattern("IRI"); - builder.unlockedBy("has_" + provider.safeName(enderPearls), enderPearls.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(iron), iron.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstone), redstone.getCritereon(provider)) - .unlockedBy("has_" + provider.safeName(redstoneBlock), redstoneBlock.getCritereon(provider)); - builder.save(provider, provider.safeId(context.get())); - }) - .build() - .register(); - - - private BlockRegistry() {} - - public static void init() {} + .requiresCorrectToolForDrops() + ); + + public static final DeferredHolder, MapCodec> CHARGER_CODEC = BLOCK_TYPES.register( + Constants.CHARGER_BLOCK, + () -> RecordCodecBuilder.mapCodec(instance -> + instance.group( + ChargerBlock.Tier.CODEC.fieldOf("tier").forGetter(ChargerBlock::getTier), + BlockBehaviour.propertiesCodec() + ).apply(instance, ChargerBlock::new)) + ); + + public static final DeferredHolder, MapCodec> WIRELESS_CHARGER_CODEC = BLOCK_TYPES.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> BlockBehaviour.simpleCodec(WirelessChargerBlock::new) + ); } diff --git a/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java b/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java index 7828b16..0202c3a 100644 --- a/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/ChargerBlock.java @@ -1,48 +1,57 @@ package se.gory_moon.chargers.block; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.StringRepresentable; import net.minecraft.world.Containers; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.util.NonNullSupplier; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.Configs; +import se.gory_moon.chargers.LangKeys; +import se.gory_moon.chargers.EnergyFormatting; import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.block.entity.ChargerBlockEntity; import javax.annotation.Nullable; +import java.util.List; +import java.util.function.Supplier; public class ChargerBlock extends EnergyBlock { - public ChargerBlock(Block.Properties properties) { + private final Tier tier; + + public ChargerBlock(Tier tier, Block.Properties properties) { super(properties); + this.tier = tier; } @Override - public @NotNull InteractionResult use(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult result) { - if (level.isClientSide) - return InteractionResult.SUCCESS; - - BlockEntity blockEntity = level.getBlockEntity(pos); - if (blockEntity instanceof ChargerBlockEntity) { - if (player.isShiftKeyDown()) - return InteractionResult.FAIL; + protected @NotNull MapCodec codec() { + return BlockRegistry.CHARGER_CODEC.value(); + } - player.openMenu((ChargerBlockEntity) blockEntity); - } + @Override + public @NotNull InteractionResult useWithoutItem(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull BlockHitResult result) { + if (!level.isClientSide && player instanceof ServerPlayer) + player.openMenu(state.getMenuProvider(level, pos)); - return InteractionResult.SUCCESS; + return InteractionResult.sidedSuccess(level.isClientSide); } @Override @@ -50,8 +59,9 @@ public void onRemove(@NotNull BlockState state, Level level, @NotNull BlockPos p if (!level.isClientSide) { BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof ChargerBlockEntity chargerEntity) { - for(int i = 0; i < chargerEntity.inventoryHandler.getSlots(); ++i) { - ItemStack stack = chargerEntity.inventoryHandler.getStackInSlot(i); + var inventoryHandler = chargerEntity.getInventoryHandler(); + for(int i = 0; i < inventoryHandler.getSlots(); ++i) { + ItemStack stack = inventoryHandler.getStackInSlot(i); if (!stack.isEmpty()) Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), stack); } @@ -61,46 +71,48 @@ public void onRemove(@NotNull BlockState state, Level level, @NotNull BlockPos p } @Override - public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - if (stack.hasCustomHoverName()) { - BlockEntity blockEntity = level.getBlockEntity(pos); - if (blockEntity instanceof ChargerBlockEntity) { - ((ChargerBlockEntity)blockEntity).setCustomName(stack.getHoverName()); - } - } - super.setPlacedBy(level, pos, state, placer, stack); + public void appendHoverText(@NotNull ItemStack stack, @NotNull Item.TooltipContext context, @NotNull List tooltip, @NotNull TooltipFlag tooltipFlag) { + Tier tier = getTier(); + if (tier.isCreative()) + tooltip.add(Component.translatable(LangKeys.POWER_INFO.key(), EnergyFormatting.INFINITE).withStyle(ChatFormatting.GOLD)); + else + EnergyFormatting.addEnergyTooltip(stack, tooltip); } - @Nullable @Override - public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { - ChargerBlockEntity charger = BlockEntityRegistry.CHARGER_BE.create(pos, state); - charger.setTier(Tier.byBlock(this)); - return charger; + public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { + return createEnergyTicker(level, type, BlockEntityRegistry.CHARGER_BE.get()); } @Nullable @Override - public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { - return createEnergyTicker(level, type, BlockEntityRegistry.CHARGER_BE.get()); + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return new ChargerBlockEntity(pos, state, tier); + } + + public Tier getTier() { + return tier; } - public enum Tier { - I(0, () -> Configs.SERVER.tier1), - II(1, () -> Configs.SERVER.tier2), - III(2, () -> Configs.SERVER.tier3), - IV(3, () -> Configs.SERVER.tier4), - C(4, () -> Configs.SERVER.tier4); + public enum Tier implements StringRepresentable { + I(0, "tier_1", () -> Configs.SERVER.tier1), + II(1, "tier_2", () -> Configs.SERVER.tier2), + III(2, "tier_3", () -> Configs.SERVER.tier3), + IV(3, "tier_4", () -> Configs.SERVER.tier4), + C(4, "creative", () -> Configs.SERVER.tier4); private final int id; - private final NonNullSupplier tierSupplier; + private final String name; + private final Supplier tierSupplier; @Nullable private Configs.Server.Tier tier = null; - private static final ChargerBlock.Tier[] ID_LOOKUP = new ChargerBlock.Tier[values().length]; - Tier(int id, NonNullSupplier tierSupplier) { + public static final Codec CODEC = StringRepresentable.fromEnum(Tier::values); + + Tier(int id, String name, Supplier tierSupplier) { this.id = id; + this.name = name; this.tierSupplier = tierSupplier; } @@ -113,52 +125,26 @@ public boolean isCreative() { } public long getStorage() { - return getTier().storage.get(); + return getTierConfig().storage.get(); } public long getMaxIn() { - return getTier().maxInput.get(); + return getTierConfig().maxInput.get(); } public long getMaxOut() { - return getTier().maxOutput.get(); + return getTierConfig().maxOutput.get(); } - private Configs.Server.Tier getTier() { + private Configs.Server.Tier getTierConfig() { if (tier == null) tier = tierSupplier.get(); return tier; } - public static Tier byID(int id) { - if (id < 0 || id >= ID_LOOKUP.length) { - id = 0; - } - - return ID_LOOKUP[id]; - } - - public static Tier byItem(BlockItem item) { - return byBlock(item.getBlock()); - } - - public static Tier byBlock(Block block) { - if (BlockRegistry.CHARGER_BLOCK_T2.is(block)) - return Tier.II; - else if (BlockRegistry.CHARGER_BLOCK_T3.is(block)) - return Tier.III; - else if (BlockRegistry.CHARGER_BLOCK_T4.is(block)) - return Tier.IV; - else if (BlockRegistry.CHARGER_BLOCK_CREATIVE.is(block)) - return Tier.C; - - return Tier.I; - } - - static { - for (Tier tier : values()) { - ID_LOOKUP[tier.getId()] = tier; - } + @Override + public @NotNull String getSerializedName() { + return name; } } } diff --git a/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java b/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java index c325c8c..1090455 100644 --- a/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/EnergyBlock.java @@ -1,9 +1,5 @@ package se.gory_moon.chargers.block; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; @@ -12,14 +8,8 @@ import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.block.entity.EnergyHolderBlockEntity; -import se.gory_moon.chargers.item.ChargerBlockItem; -import se.gory_moon.chargers.item.WirelessChargerBlockItem; -import se.gory_moon.chargers.power.CustomEnergyStorage; import javax.annotation.Nullable; @@ -38,32 +28,4 @@ protected static BlockEntityTicker createEnergyTicker return RenderShape.MODEL; } - @Override - public void playerDestroy(Level level, @NotNull Player player, @NotNull BlockPos pos, @NotNull BlockState state, @Nullable BlockEntity entity, @NotNull ItemStack stack) { - if (!level.isClientSide && !level.restoringBlockSnapshots) { - ItemStack drop = new ItemStack(this, 1); - - if (entity instanceof EnergyHolderBlockEntity energyBlock && energyBlock.getStorage() != null) { - drop.getOrCreateTag().putLong(CustomEnergyStorage.ENERGY_TAG, energyBlock.getStorage().getLongEnergyStored()); - } - - popResource(level, pos, drop); - } - } - - @Override - public void setPlacedBy(@NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - if ((stack.getItem() instanceof WirelessChargerBlockItem || stack.getItem() instanceof ChargerBlockItem) && stack.getCapability(ForgeCapabilities.ENERGY).isPresent()) { - BlockEntity blockEntity = level.getBlockEntity(pos); - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); - - if (blockEntity instanceof EnergyHolderBlockEntity energyHolderBlock) { - capability.ifPresent(energyStorage -> { - if (energyStorage instanceof CustomEnergyStorage && energyHolderBlock.getStorage() != null) { - energyHolderBlock.getStorage().deserializeNBT(((CustomEnergyStorage) energyStorage).serializeNBT()); - } - }); - } - } - } } diff --git a/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java b/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java index c75f689..790172b 100644 --- a/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java +++ b/src/main/java/se/gory_moon/chargers/block/WirelessChargerBlock.java @@ -1,13 +1,17 @@ package se.gory_moon.chargers.block; +import com.mojang.serialization.MapCodec; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; @@ -18,14 +22,20 @@ import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.LangKeys; -import se.gory_moon.chargers.Utils; +import se.gory_moon.chargers.EnergyFormatting; import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; import javax.annotation.Nullable; +import java.util.List; public class WirelessChargerBlock extends EnergyBlock { + @Override + protected @NotNull MapCodec codec() { + return BlockRegistry.WIRELESS_CHARGER_CODEC.value(); + } + public static BooleanProperty POWERED = BooleanProperty.create("powered"); public WirelessChargerBlock(Block.Properties properties) { @@ -34,15 +44,12 @@ public WirelessChargerBlock(Block.Properties properties) { } @Override - public InteractionResult use(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull InteractionHand hand, @NotNull BlockHitResult result) { + public @NotNull InteractionResult useWithoutItem(@NotNull BlockState state, Level level, @NotNull BlockPos pos, @NotNull Player player, @NotNull BlockHitResult result) { if (level.isClientSide) return InteractionResult.SUCCESS; BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof WirelessChargerBlockEntity changerEntity && changerEntity.getStorage() != null) { - if (player.isShiftKeyDown()) - return InteractionResult.FAIL; - boolean powered = changerEntity.isPowered(); Component status = Component.translatable((powered ? LangKeys.CHAT_DISABLED.key() : LangKeys.CHAT_ENABLED.key())) .setStyle(Style.EMPTY.withColor(powered ? ChatFormatting.RED : ChatFormatting.GREEN)); @@ -50,14 +57,20 @@ public InteractionResult use(@NotNull BlockState state, Level level, @NotNull Bl var storage = changerEntity.getStorage(); var text = Component.translatable(LangKeys.CHAT_WIRELESS_CHARGER_INFO.key(), status, - Utils.formatAndClean(storage.getLongEnergyStored()), - Utils.formatAndClean(storage.getLongMaxEnergyStored())); + EnergyFormatting.formatFilledCapacity(storage.getLongEnergyStored(), storage.getLongMaxEnergyStored())) + .withStyle(ChatFormatting.GOLD); player.displayClientMessage(text, true); } return InteractionResult.SUCCESS; } + @Override + public void appendHoverText(@NotNull ItemStack stack, @NotNull Item.TooltipContext context, @NotNull List tooltip, @NotNull TooltipFlag tooltipFlag) { + EnergyFormatting.addEnergyTooltip(stack, tooltip); + tooltip.add(Component.translatable(LangKeys.TOOLTIP_WIRELESS_CHARGER.key())); + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(POWERED); @@ -65,13 +78,13 @@ protected void createBlockStateDefinition(StateDefinition.Builder BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + public BlockEntityTicker getTicker(@NotNull Level level, @NotNull BlockState state, @NotNull BlockEntityType type) { return createEnergyTicker(level, type, BlockEntityRegistry.WIRELESS_CHARGER_BE.get()); } } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java b/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java index e9cd5ca..414f8d9 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/BlockEntityRegistry.java @@ -1,32 +1,41 @@ package se.gory_moon.chargers.block.entity; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.entry.BlockEntityEntry; -import com.tterrag.registrate.util.entry.MenuEntry; -import net.minecraftforge.registries.ForgeRegistries; -import se.gory_moon.chargers.ChargersMod; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; -import se.gory_moon.chargers.client.ChargerScreen; +import se.gory_moon.chargers.block.BlockRegistry; import se.gory_moon.chargers.inventory.ChargerMenu; -import static se.gory_moon.chargers.Constants.CHARGER_BLOCK_ENTITY; -import static se.gory_moon.chargers.Constants.WIRELESS_CHARGER_BLOCK_ENTITY; -import static se.gory_moon.chargers.block.BlockRegistry.*; +import java.util.function.Supplier; public final class BlockEntityRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); + public static final DeferredRegister> BlOCK_ENTITIES = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, Constants.MOD_ID); + public static final DeferredRegister> MENU_TYPES = DeferredRegister.create(BuiltInRegistries.MENU, Constants.MOD_ID); - public static final BlockEntityEntry CHARGER_BE = REGISTRATE.object(CHARGER_BLOCK_ENTITY) - .blockEntity(ChargerBlockEntity::new) - .validBlocks(CHARGER_BLOCK_T1, CHARGER_BLOCK_T2, CHARGER_BLOCK_T3, CHARGER_BLOCK_T4, CHARGER_BLOCK_CREATIVE) - .register(); + public static final Supplier> CHARGER_BE = BlOCK_ENTITIES.register( + Constants.CHARGER_BLOCK, + () -> BlockEntityType.Builder.of( + ChargerBlockEntity::new, + BlockRegistry.CHARGER_BLOCK_T1.get(), + BlockRegistry.CHARGER_BLOCK_T2.get(), + BlockRegistry.CHARGER_BLOCK_T3.get(), + BlockRegistry.CHARGER_BLOCK_T4.get(), + BlockRegistry.CHARGER_BLOCK_CREATIVE.get() + ).build(null)); - public static final BlockEntityEntry WIRELESS_CHARGER_BE = BlockEntityEntry.cast(REGISTRATE.get(WIRELESS_CHARGER_BLOCK_ENTITY, ForgeRegistries.Keys.BLOCK_ENTITY_TYPES)); + public static final Supplier> WIRELESS_CHARGER_BE = BlOCK_ENTITIES.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> BlockEntityType.Builder.of( + WirelessChargerBlockEntity::new, + BlockRegistry.WIRELESS_CHARGER.get() + ).build(null) + ); - public static final MenuEntry CHARGER_CONTAINER = REGISTRATE.object(Constants.CHARGER_CONTAINER) - .menu(ChargerMenu::new, () -> ChargerScreen::new) - .register(); + public static final Supplier> CHARGER_MENU = MENU_TYPES.register( + Constants.CHARGER_BLOCK, + () -> new MenuType<>(ChargerMenu::new, FeatureFlags.DEFAULT_FLAGS)); - private BlockEntityRegistry() {} - public static void init() {} } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java index fbcefa8..1c719ae 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/ChargerBlockEntity.java @@ -1,22 +1,15 @@ package se.gory_moon.chargers.block.entity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; import net.minecraft.world.MenuProvider; -import net.minecraft.world.Nameable; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import se.gory_moon.chargers.block.ChargerBlock; @@ -24,126 +17,79 @@ import se.gory_moon.chargers.inventory.ChargerMenu; import se.gory_moon.chargers.power.CustomEnergyStorage; -public class ChargerBlockEntity extends EnergyHolderBlockEntity implements Nameable, MenuProvider { +public class ChargerBlockEntity extends EnergyHolderBlockEntity implements MenuProvider { - public static final String CUSTOM_NAME_TAG = "CustomName"; - public static final String INVENTORY_TAG = "Inventory"; - public static final String TIER_TAG = "Tier"; public static final int INPUT_SLOT = 0; public static final int OUTPUT_SLOT = 1; public static final int CHARGE_SLOT = 2; - public ChargerItemStackHandler inventoryHandler; - private final LazyOptional lazyInventory = LazyOptional.of(() -> inventoryHandler); - private ChargerBlock.Tier tier = ChargerBlock.Tier.I; + private final ChargerItemStackHandler inventoryHandler; - @Nullable - private Component customName; - - public ChargerBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { - super(blockEntityType, pos, state); + public ChargerBlockEntity(BlockPos pos, BlockState state, ChargerBlock.Tier tier) { + super(BlockEntityRegistry.CHARGER_BE.get(), pos, state); inventoryHandler = new ChargerItemStackHandler() { @Override protected void onContentsChanged(int slot) { setChanged(); } }; + setTier(tier); + } + + public ChargerBlockEntity(BlockPos pos, BlockState state) { + this(pos, state, ((ChargerBlock) state.getBlock()).getTier()); + } + + public ChargerItemStackHandler getInventoryHandler() { + return inventoryHandler; } public void setTier(ChargerBlock.Tier tier) { - this.tier = tier; setStorage(new CustomEnergyStorage(tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative())); } @Override public void tickServer() { - if (getLevel() != null && !getLevel().isClientSide) { - CustomEnergyStorage storage = getStorage(); - if (storage != null) { - // Try to charge the block with the provided item - ItemStack charge = inventoryHandler.getStackInSlot(CHARGE_SLOT); - if (!charge.isEmpty()) - ChargeCompat.INSTANCE.dischargeItem(charge, storage, this::setChanged); - - // Try to charge the item in the input slot - ItemStack input = inventoryHandler.getStackInSlot(INPUT_SLOT); - ItemStack output = inventoryHandler.getStackInSlot(OUTPUT_SLOT); - if (!input.isEmpty() && input.getCount() == 1 && storage.getLongEnergyStored() > 0) { - boolean isFull = ChargeCompat.INSTANCE.chargeItem(input, storage, t -> { - storage.extractLongEnergy(t, false); - setChanged(); - }); - - if (isFull && output.isEmpty()) { - inventoryHandler.setStackInSlot(OUTPUT_SLOT, input); - inventoryHandler.setStackInSlot(INPUT_SLOT, ItemStack.EMPTY); - } + CustomEnergyStorage storage = getStorage(); + if (storage != null) { + // Try to charge the block with the provided item + ItemStack charge = inventoryHandler.getStackInSlot(CHARGE_SLOT); + if (!charge.isEmpty()) + ChargeCompat.INSTANCE.dischargeItem(charge, storage, this::setChanged); + + // Try to charge the item in the input slot + ItemStack input = inventoryHandler.getStackInSlot(INPUT_SLOT); + ItemStack output = inventoryHandler.getStackInSlot(OUTPUT_SLOT); + if (!input.isEmpty() && input.getCount() == 1 && storage.getLongEnergyStored() > 0) { + boolean isFull = ChargeCompat.INSTANCE.chargeItem(input, storage, t -> { + storage.extractLongEnergy(t, false); + setChanged(); + }); + + if (isFull && output.isEmpty()) { + inventoryHandler.setStackInSlot(OUTPUT_SLOT, input); + inventoryHandler.setStackInSlot(INPUT_SLOT, ItemStack.EMPTY); } } - super.tickServer(); - } - } - - @Override - public void load(@NotNull CompoundTag compound) { - inventoryHandler.deserializeNBT(compound.getCompound(INVENTORY_TAG)); - setTier(ChargerBlock.Tier.byID(compound.getInt(TIER_TAG))); - if (compound.contains(CUSTOM_NAME_TAG, Tag.TAG_STRING)) - this.customName = Component.Serializer.fromJson(compound.getString(CUSTOM_NAME_TAG)); - - super.load(compound); - } - - @Override - protected void saveAdditional(@NotNull CompoundTag tag) { - super.saveAdditional(tag); - tag.put(INVENTORY_TAG, inventoryHandler.serializeNBT()); - tag.putInt(TIER_TAG, tier.getId()); - if (this.customName != null) - tag.putString(CUSTOM_NAME_TAG, Component.Serializer.toJson(this.customName)); - } - - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER) - return lazyInventory.cast(); - return super.getCapability(cap, side); - } - - public void setCustomName(@Nullable Component name) { - this.customName = name; - } - - @Override - public @NotNull Component getName() { - Component name = getCustomName(); - if (name == null) { - name = getBlockState().getBlock().getName(); } - return name; + super.tickServer(); } @Override - public boolean hasCustomName() { - return customName != null; + public void loadAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + inventoryHandler.deserializeNBT(registries, tag); } @Override - public @NotNull Component getDisplayName() { - //noinspection ConstantConditions - return hasCustomName() ? getCustomName() : getName(); - } - - @Nullable - @Override - public Component getCustomName() { - return customName; + protected void saveAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + tag.merge(inventoryHandler.serializeNBT(registries)); } @Nullable @Override public AbstractContainerMenu createMenu(int containerId, @NotNull Inventory playerInventory, @NotNull Player playerEntity) { - return new ChargerMenu(BlockEntityRegistry.CHARGER_CONTAINER.get(), containerId, playerInventory, inventoryHandler, energyData, ContainerLevelAccess.create(getLevel(), getBlockPos())); + return new ChargerMenu(containerId, playerInventory, inventoryHandler, energyData, ContainerLevelAccess.create(level, getBlockPos())); } } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java b/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java index d228faa..37b4c1a 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/ChargerItemStackHandler.java @@ -2,10 +2,8 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.items.ItemStackHandler; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.ItemStackHandler; import javax.annotation.Nonnull; @@ -29,11 +27,11 @@ public int getSlotLimit(int slot) { @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { if (!stack.isEmpty()) { - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); + var storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); if (slot == 0) { - return capability.map(energyStorage -> energyStorage.receiveEnergy(1, true)).orElse(0) > 0; + return (storage != null ? storage.receiveEnergy(1, true) : 0) > 0; } else if (slot == 2) { - return capability.map(energyStorage -> energyStorage.extractEnergy(1, true)).orElse(0) > 0; + return (storage != null ? storage.extractEnergy(1, true) : 0) > 0; } } return false; @@ -54,8 +52,8 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { if (slot == 0) return ItemStack.EMPTY; if (slot == 2) { - LazyOptional capability = getStackInSlot(2).getCapability(ForgeCapabilities.ENERGY); - if (capability.map(energyStorage -> energyStorage.extractEnergy(1, true)).orElse(0) > 0) + var storage = getStackInSlot(2).getCapability(Capabilities.EnergyStorage.ITEM); + if ((storage != null ? storage.extractEnergy(1, true) : 0) > 0) return ItemStack.EMPTY; } return super.extractItem(slot, amount, simulate); diff --git a/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java index 9e7c24e..01ded44 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/EnergyHolderBlockEntity.java @@ -1,38 +1,33 @@ package se.gory_moon.chargers.block.entity; -import it.unimi.dsi.fastutil.Pair; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.Nameable; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - -import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat; -import se.gory_moon.chargers.compat.fn.FluxNetworksCompat; import se.gory_moon.chargers.inventory.ChargerData; +import se.gory_moon.chargers.item.ChargerDataComponents; import se.gory_moon.chargers.power.CustomEnergyStorage; -import java.util.HashMap; -import java.util.Map; - -public abstract class EnergyHolderBlockEntity extends BlockEntity { +public abstract class EnergyHolderBlockEntity extends BlockEntity implements Nameable { public static final String STORAGE_TAG = "Storage"; + public static final String CUSTOM_NAME_TAG = "CustomName"; + @Nullable + protected Component name; @Nullable private CustomEnergyStorage storage = null; - private LazyOptional lazyStorage = LazyOptional.of(() -> storage); - - private final Map, Pair>> compatWrappers = new HashMap<>(); protected final ChargerData energyData = new ChargerData() { public long get(int index) { @@ -62,27 +57,7 @@ public EnergyHolderBlockEntity(BlockEntityType blockEntityType, BlockPos pos, public void setStorage(CustomEnergyStorage storage) { this.storage = storage; - lazyStorage.invalidate(); - lazyStorage = LazyOptional.of(() -> storage); - - if (BrandonsCoreCompat.INSTANCE.isLoaded()) { - BrandonsCoreCompat.INSTANCE.createOpWrapper(storage, compatWrappers); - } - - if (FluxNetworksCompat.INSTANCE.isLoaded()) { - FluxNetworksCompat.INSTANCE.createFNWrapper(storage, compatWrappers); - } - } - - @Override - public void invalidateCaps() { - if (lazyStorage != null) - lazyStorage.invalidate(); - lazyStorage = null; - compatWrappers.forEach((capability, lazyOptionalPair) -> lazyOptionalPair.second().invalidate()); - compatWrappers.clear(); - - super.invalidateCaps(); + invalidateCapabilities(); } @Nullable @@ -96,17 +71,37 @@ public void tickServer() { } @Override - public void load(@NotNull CompoundTag compound) { - super.load(compound); + protected void applyImplicitComponents(@NotNull DataComponentInput componentInput) { + name = componentInput.get(DataComponents.CUSTOM_NAME); + if (storage != null) + storage.setEnergy(componentInput.getOrDefault(ChargerDataComponents.ENERGY, 0L)); + } + + @Override + protected void collectImplicitComponents(@NotNull DataComponentMap.Builder components) { + components.set(DataComponents.CUSTOM_NAME, getCustomName()); + if (storage != null) + components.set(ChargerDataComponents.ENERGY, storage.getLongEnergyStored()); + } + + @Override + public void loadAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); if (storage != null) - storage.deserializeNBT(compound.getCompound(STORAGE_TAG)); + storage.deserializeNBT(registries, tag.getCompound(STORAGE_TAG)); + + if (tag.contains(CUSTOM_NAME_TAG, Tag.TAG_STRING)) + name = parseCustomNameSafe(tag.getString(CUSTOM_NAME_TAG), registries); } @Override - protected void saveAdditional(@NotNull CompoundTag tag) { - super.saveAdditional(tag); + protected void saveAdditional(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); if (storage != null) - tag.put(STORAGE_TAG, storage.serializeNBT()); + tag.put(STORAGE_TAG, storage.serializeNBT(registries)); + + if (name != null) + tag.putString(CUSTOM_NAME_TAG, Component.Serializer.toJson(name, registries)); } @Nullable @@ -116,27 +111,39 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() { } @Override - public @NotNull CompoundTag getUpdateTag() { - return saveWithoutMetadata(); + public @NotNull CompoundTag getUpdateTag(@NotNull HolderLookup.Provider registries) { + CompoundTag tag = new CompoundTag(); + saveAdditional(tag, registries); + return tag; } - @NotNull - @Override - public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - - if (BrandonsCoreCompat.INSTANCE.isOpCapability(cap)) - return compatWrappers.get(cap).second().cast(); + public static void tickServer(Level level, BlockPos pos, BlockState state, EnergyHolderBlockEntity blockEntity) { + blockEntity.tickServer(); + } - if (FluxNetworksCompat.INSTANCE.isOpCapability(cap)) - return compatWrappers.get(cap).second().cast(); + @Override + public @NotNull Component getName() { + Component name = getCustomName(); + if (name == null) { + name = getBlockState().getBlock().getName(); + } + return name; + } - if (cap == ForgeCapabilities.ENERGY) - return lazyStorage.cast(); + @Override + public boolean hasCustomName() { + return name != null; + } - return super.getCapability(cap, side); + @Override + public @NotNull Component getDisplayName() { + //noinspection ConstantConditions + return hasCustomName() ? getCustomName() : getName(); } - public static void tickServer(Level level, BlockPos pos, BlockState state, EnergyHolderBlockEntity blockEntity) { - blockEntity.tickServer(); + @Nullable + @Override + public Component getCustomName() { + return name; } } diff --git a/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java b/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java index bade112..8455f46 100644 --- a/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java +++ b/src/main/java/se/gory_moon/chargers/block/entity/WirelessChargerBlockEntity.java @@ -3,10 +3,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.network.PacketDistributor; import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.block.WirelessChargerBlock; import se.gory_moon.chargers.compat.ChargeCompat; @@ -21,8 +18,8 @@ public class WirelessChargerBlockEntity extends EnergyHolderBlockEntity { private long lastPowered = -1; private long availableEnergy; - public WirelessChargerBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { - super(blockEntityType, pos, state); + public WirelessChargerBlockEntity(BlockPos pos, BlockState state) { + super(BlockEntityRegistry.WIRELESS_CHARGER_BE.get(), pos, state); setStorage(new CustomEnergyStorage( Configs.SERVER.wireless.storage.get(), Configs.SERVER.wireless.maxInput.get(), @@ -32,44 +29,37 @@ public WirelessChargerBlockEntity(BlockEntityType bl @Override public void setRemoved() { super.setRemoved(); - WirelessHandler.INSTANCE.unregister(this, getLevel()); registered = false; } @Override public void setChanged() { - Level level = getLevel(); - if (level != null) - { + if (level != null) { final BlockState state = level.getBlockState(getBlockPos()); - level.sendBlockUpdated(getBlockPos(), state, state, 2); + level.sendBlockUpdated(getBlockPos(), state, state, WirelessChargerBlock.UPDATE_CLIENTS); } super.setChanged(); } @Override public void tickServer() { - Level level = getLevel(); - if (level == null) - return; + if (level == null) return; - if (!level.isClientSide && !registered) { + if (!registered) { WirelessHandler.INSTANCE.register(this, level); registered = true; } - if (!level.isClientSide) { - Boolean powered = getBlockState().getValue(WirelessChargerBlock.POWERED); - if (canCharge() != powered) { - getLevel().setBlockAndUpdate(getBlockPos(), getBlockState().setValue(WirelessChargerBlock.POWERED, canCharge())); - } - } + var powered = getBlockState().getValue(WirelessChargerBlock.POWERED); + if (canCharge() != powered) { + level.setBlockAndUpdate(getBlockPos(), getBlockState().setValue(WirelessChargerBlock.POWERED, canCharge())); + } super.tickServer(); - if (getStorage() != null && (lastPowered == -1 || (lastPowered == 0 && getStorage().getLongEnergyStored() > 0) || (lastPowered > 0 && getStorage().getLongEnergyStored() == 0))) { - if (!level.isClientSide) { - PacketDistributor.TRACKING_CHUNK.with(() -> getLevel().getChunkAt(getBlockPos())).send(getUpdatePacket()); - } - lastPowered = getStorage().getLongEnergyStored(); + + CustomEnergyStorage storage = getStorage(); + if (storage != null && (lastPowered == -1 || (lastPowered == 0 && storage.getLongEnergyStored() > 0) || (lastPowered > 0 && storage.getLongEnergyStored() == 0))) { + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), WirelessChargerBlock.UPDATE_CLIENTS); + lastPowered = storage.getLongEnergyStored(); setChanged(); } } @@ -86,6 +76,7 @@ public boolean chargeItems(NonNullList items) { ItemStack stack = items.get(i); if (!stack.isEmpty()) { ChargeCompat.INSTANCE.chargeItem(stack, getStorage(), availableEnergy, (transferred) -> { + getStorage().extractLongEnergy(transferred, false); availableEnergy -= transferred; charged.set(true); }); @@ -96,12 +87,11 @@ public boolean chargeItems(NonNullList items) { } public boolean canCharge() { - return getStorage() != null && getStorage().getLongMaxEnergyStored() > 0 && !isPowered(); + return getStorage() != null && getStorage().getLongEnergyStored() > 0 && !isPowered(); } public boolean isPowered() { - //noinspection deprecation - return getLevel() != null && getLevel().isAreaLoaded(getBlockPos(), 1) && getLevel().getBestNeighborSignal(getBlockPos()) > 0; + return level != null && level.isAreaLoaded(getBlockPos(), 1) && level.getBestNeighborSignal(getBlockPos()) > 0; } public long getAvailableEnergy() { diff --git a/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java b/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java index 6ee18bd..ab44fb1 100644 --- a/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java +++ b/src/main/java/se/gory_moon/chargers/client/ChargerScreen.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.Constants; import se.gory_moon.chargers.LangKeys; -import se.gory_moon.chargers.Utils; +import se.gory_moon.chargers.EnergyFormatting; import se.gory_moon.chargers.inventory.ChargerMenu; import java.util.ArrayList; @@ -19,7 +19,7 @@ public class ChargerScreen extends AbstractContainerScreen { - private static final ResourceLocation CHARGER_GUI_TEXTURE = new ResourceLocation(Constants.MOD_ID, "textures/gui/charger.png"); + private static final ResourceLocation CHARGER_GUI_TEXTURE = ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "textures/gui/charger.png"); public ChargerScreen(ChargerMenu container, Inventory playerInventory, Component title) { super(container, playerInventory, title); @@ -36,26 +36,26 @@ protected void init() { @Override public void render(@NotNull GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) { - this.renderBackground(graphics); super.render(graphics, pMouseX, pMouseY, pPartialTick); if (pMouseX >= leftPos + 44 && pMouseX <= leftPos + 44 + 16 && pMouseY >= topPos + 14 && pMouseY <= topPos + 84) { List list = new ArrayList<>(); if (menu.isCreative()) - list.add(Component.translatable(LangKeys.GUI_ENERGY_INFINITE.key())); + list.add(Component.translatable(LangKeys.POWER_INFO.key(), EnergyFormatting.INFINITE).withStyle(ChatFormatting.GOLD)); else - list.add(Component.translatable(LangKeys.GUI_ENERGY.key(), Utils.formatAndClean(menu.getEnergy()), Utils.formatAndClean(menu.getEnergyMax()) + ChatFormatting.GRAY)); + list.add(EnergyFormatting.formatFilledCapacity(menu.getEnergy(), menu.getEnergyMax())); - list.add(Component.translatable(LangKeys.GUI_MAX_IN.key(), Utils.formatAndClean(menu.getMaxIn()) + ChatFormatting.GRAY)); - list.add(Component.translatable(LangKeys.GUI_MAX_OUT.key(), Utils.formatAndClean(menu.getMaxOut()) + ChatFormatting.GRAY)); + list.add(Component.translatable(LangKeys.GUI_MAX_IN.key(), EnergyFormatting.formatEnergyPerTick(menu.getMaxIn())).withStyle(ChatFormatting.GOLD)); + list.add(Component.translatable(LangKeys.GUI_MAX_OUT.key(), EnergyFormatting.formatEnergyPerTick(menu.getMaxOut())).withStyle(ChatFormatting.GOLD)); if (menu.getAverageIn() > 0 || menu.getAverageOut() > 0) { - if (hasShiftDown()) { - list.add(Component.translatable(LangKeys.GUI_DETAILS_IN.key(), ChatFormatting.GREEN + "+" + Utils.formatAndClean(menu.getAverageIn()) + ChatFormatting.GRAY)); - list.add(Component.translatable(LangKeys.GUI_DETAILS_OUT.key(), ChatFormatting.RED + "-" + Utils.formatAndClean(menu.getAverageOut()) + ChatFormatting.GRAY)); + list.add(Component.empty()); + if (hasShiftDown() || menu.getEnergyDiff() == 0) { + list.add(Component.translatable(LangKeys.GUI_DETAILS_IN.key(), EnergyFormatting.POSITIVE.copy().append(EnergyFormatting.formatEnergyPerTick(menu.getAverageIn()))).withStyle(ChatFormatting.GOLD)); + list.add(Component.translatable(LangKeys.GUI_DETAILS_OUT.key(), EnergyFormatting.NEGATIVE.copy().append(EnergyFormatting.formatEnergyPerTick(menu.getAverageOut()))).withStyle(ChatFormatting.GOLD)); } else { if (menu.getEnergyDiff() != 0) - list.add(Component.translatable(LangKeys.GUI_IO.key(), (menu.getEnergyDiff() > 0 ? ChatFormatting.GREEN + "+" : ChatFormatting.RED.toString()) + Utils.formatAndClean(menu.getEnergyDiff()) + ChatFormatting.GRAY)); + list.add(Component.translatable(LangKeys.GUI_IO.key(), (menu.getEnergyDiff() > 0 ? EnergyFormatting.POSITIVE : EnergyFormatting.NEGATIVE).copy().append(EnergyFormatting.formatEnergyPerTick(menu.getEnergyDiff()))).withStyle(ChatFormatting.GOLD)); list.add(Component.translatable(LangKeys.GUI_IO_MORE.key()).setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); } } diff --git a/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java b/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java index 570c6e1..0198518 100644 --- a/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java @@ -1,10 +1,11 @@ package se.gory_moon.chargers.compat; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import net.neoforged.neoforge.energy.IEnergyStorage; import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat; +import se.gory_moon.chargers.compat.fn.FluxNetworksCompat; import se.gory_moon.chargers.compat.industrial.IndustrialForegoingCompat; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -26,6 +27,20 @@ private int cap(long value) { return value > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) value; } + /** + * Registers capabilities for compatibility with other mods + * @param event The passed event used to register + */ + public static void registerCapabilities(RegisterCapabilitiesEvent event) { + if (BrandonsCoreCompat.INSTANCE.isLoaded()) { + BrandonsCoreCompat.INSTANCE.registerOPCapability(event); + } + + if (FluxNetworksCompat.INSTANCE.isLoaded()) { + FluxNetworksCompat.INSTANCE.registerFNCapability(event); + } + } + /** * Discharge an item into the block storage * @@ -34,16 +49,16 @@ private int cap(long value) { * @param callback A callback that is called when the */ public void dischargeItem(ItemStack stack, CustomEnergyStorage blockStorage, Runnable callback) { - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); - capability.ifPresent(energyStorage -> { + IEnergyStorage storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { long extractAmount = Math.min(blockStorage.getLongMaxEnergyStored() - blockStorage.getLongEnergyStored(), blockStorage.getMaxInput()); - long transferred = extractAmount(energyStorage, extractAmount); + long transferred = extractAmount(storage, extractAmount); if (transferred > 0) { blockStorage.receiveLongEnergy(transferred, false); callback.run(); } - }); + } } /** @@ -72,19 +87,19 @@ public boolean chargeItem(ItemStack stack, CustomEnergyStorage blockStorage, Con public boolean chargeItem(ItemStack stack, CustomEnergyStorage blockStorage, long overrideTransfer, Consumer transferredCallback) { AtomicBoolean charged = new AtomicBoolean(false); - LazyOptional capability = stack.getCapability(ForgeCapabilities.ENERGY); - capability.ifPresent(itemStorage -> { + IEnergyStorage storage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { var transferRequest = overrideTransfer; if (transferRequest < 0) transferRequest = blockStorage.extractLongEnergy(blockStorage.getLongMaxEnergyStored(), true); - var transferred = receiveAmount(itemStorage, transferRequest); + var transferred = receiveAmount(storage, transferRequest); if (transferred > 0) { transferredCallback.accept(transferred); } - charged.set(isStorageFull(itemStorage)); - }); + charged.set(isStorageFull(storage)); + } return charged.get(); } diff --git a/src/main/java/se/gory_moon/chargers/compat/Curios.java b/src/main/java/se/gory_moon/chargers/compat/Curios.java index c40fc33..5a48773 100644 --- a/src/main/java/se/gory_moon/chargers/compat/Curios.java +++ b/src/main/java/se/gory_moon/chargers/compat/Curios.java @@ -3,14 +3,12 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.fml.ModList; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; @@ -27,7 +25,7 @@ public class Curios { } public static boolean isLoaded() { - return loaded && Configs.COMMON.curiosCompat.get(); + return loaded && Configs.SERVER.curiosCompat.get(); } // TODO Curios inventory for gui @@ -54,7 +52,7 @@ public int getMaxStackSize() { public boolean chargeItems(Player player, WirelessChargerBlockEntity charger) { AtomicBoolean result = new AtomicBoolean(false); if (isLoaded()) { - LazyOptional lazyOptional = CuriosApi.getCuriosInventory(player); + var lazyOptional = CuriosApi.getCuriosInventory(player); lazyOptional.ifPresent(handler -> { NonNullList chargeList = NonNullList.create(); chargeList.add(ItemStack.EMPTY); diff --git a/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java b/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java index 638e20f..cf1b729 100644 --- a/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java @@ -1,16 +1,11 @@ package se.gory_moon.chargers.compat.bc; -import com.brandon3055.brandonscore.api.power.IOPStorage; -import com.brandon3055.brandonscore.capability.CapabilityOP; -import it.unimi.dsi.fastutil.Pair; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.fml.ModList; +import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import net.neoforged.neoforge.energy.IEnergyStorage; import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.power.CustomEnergyStorage; -import java.util.Map; import java.util.Optional; public class BrandonsCoreCompat { @@ -38,9 +33,9 @@ public boolean isLoaded() { * @return The amount that was successfully extracted, or empty if the storage wasn't an IOPStorage */ public Optional extractAmount(IEnergyStorage storage, long extractAmount) { - if (storage instanceof IOPStorage opStorage) { + /* if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.extractOP(extractAmount, false)); - } + }*/ return Optional.empty(); } @@ -52,9 +47,9 @@ public Optional extractAmount(IEnergyStorage storage, long extractAmount) * @return The amount that was successfully inserted, or empty if the storage wasn't an IOPStorage */ public Optional receiveAmount(IEnergyStorage storage, long receiveAmount) { - if (storage instanceof IOPStorage opStorage) { + /*if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.receiveOP(receiveAmount, false)); - } + }*/ return Optional.empty(); } @@ -65,38 +60,35 @@ public Optional receiveAmount(IEnergyStorage storage, long receiveAmount) * @return If the storage is full or not, or empty if the storage wasn't an IOPStorage */ public Optional isStorageFull(IEnergyStorage storage) { - if (storage instanceof IOPStorage opStorage) { + /*if (storage instanceof IOPStorage opStorage) { return Optional.of(opStorage.getOPStored() >= opStorage.getMaxOPStored()); - } + }*/ return Optional.empty(); } /** - * Checks if BrandonsCore is loaded and that the provided capability is an OP cap + * Registers the OP cap to the different chargers * - * @param cap The cap to check - * @param The cap type - * @return If the provided cap is a OP cap + * @param event The event used to register capabilities */ - public boolean isOpCapability(@NotNull Capability cap) { + public void registerOPCapability(@NotNull RegisterCapabilitiesEvent event) { if (loaded) { - return cap == CapabilityOP.OP; + // TODO } - - return false; } /** * Creates a wrapper around the provided storage, invalidates any previous lazy optionals if available. * * @param storage The storage to wrap - * @param compatWrappers The map holding the wrappers + * @return Returns a wrapped energy storage */ - public void createOpWrapper(CustomEnergyStorage storage, Map, Pair>> compatWrappers) { - if (compatWrappers.containsKey(CapabilityOP.OP)) { + private IEnergyStorage createOpWrapper(CustomEnergyStorage storage) { + /*if (compatWrappers.containsKey(CapabilityOP.OP)) { compatWrappers.get(CapabilityOP.OP).second().invalidate(); } var opWrapper = new OpStorageWrapper(storage); - compatWrappers.put(CapabilityOP.OP, Pair.of(opWrapper, LazyOptional.of(() -> opWrapper))); + compatWrappers.put(CapabilityOP.OP, Pair.of(opWrapper, LazyOptional.of(() -> opWrapper)));*/ + return null; } } diff --git a/src/main/java/se/gory_moon/chargers/compat/bc/OpStorageWrapper.java b/src/main/java/se/gory_moon/chargers/compat/bc/OpStorageWrapper.java index 1d6d6c9..4c2ca5e 100644 --- a/src/main/java/se/gory_moon/chargers/compat/bc/OpStorageWrapper.java +++ b/src/main/java/se/gory_moon/chargers/compat/bc/OpStorageWrapper.java @@ -1,7 +1,6 @@ package se.gory_moon.chargers.compat.bc; -import com.brandon3055.brandonscore.api.power.IOInfo; -import com.brandon3055.brandonscore.api.power.IOPStorage; +/* import org.jetbrains.annotations.Nullable; import se.gory_moon.chargers.power.CustomEnergyStorage; @@ -97,3 +96,4 @@ public long currentOutput() { } } } +*/ \ No newline at end of file diff --git a/src/main/java/se/gory_moon/chargers/compat/fn/FNStorageWrapper.java b/src/main/java/se/gory_moon/chargers/compat/fn/FNStorageWrapper.java index ef23778..7dc7892 100644 --- a/src/main/java/se/gory_moon/chargers/compat/fn/FNStorageWrapper.java +++ b/src/main/java/se/gory_moon/chargers/compat/fn/FNStorageWrapper.java @@ -1,6 +1,6 @@ package se.gory_moon.chargers.compat.fn; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.energy.IEnergyStorage; import se.gory_moon.chargers.power.CustomEnergyStorage; import sonar.fluxnetworks.api.energy.IFNEnergyStorage; diff --git a/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java b/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java index 9d172ec..08eda30 100644 --- a/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/fn/FluxNetworksCompat.java @@ -1,15 +1,19 @@ package se.gory_moon.chargers.compat.fn; -import it.unimi.dsi.fastutil.Pair; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.fml.ModList; +import net.minecraft.core.Direction; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import org.jetbrains.annotations.NotNull; -import se.gory_moon.chargers.power.CustomEnergyStorage; +import se.gory_moon.chargers.Configs; +import se.gory_moon.chargers.block.ChargerBlock; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; +import se.gory_moon.chargers.block.entity.EnergyHolderBlockEntity; +import se.gory_moon.chargers.item.ItemRegistry; +import se.gory_moon.chargers.power.CustomItemEnergyStorage; import sonar.fluxnetworks.api.FluxCapabilities; - -import java.util.Map; +import sonar.fluxnetworks.api.energy.IFNEnergyStorage; public class FluxNetworksCompat { public static FluxNetworksCompat INSTANCE = new FluxNetworksCompat(); @@ -30,31 +34,77 @@ public boolean isLoaded() { } /** - * Checks if Flux Networks is loaded and that the provided capability is an FNEnergy cap + * Registers the FNEnergy cap to the different chargers * - * @param cap The cap to check - * @param The cap type - * @return If the provided cap is a FNEnergy cap + * @param event The event used to register capabilities */ - public boolean isOpCapability(@NotNull Capability cap) { + public void registerFNCapability(@NotNull RegisterCapabilitiesEvent event) { if (loaded) { - return cap == FluxCapabilities.FN_ENERGY_STORAGE; + event.registerBlockEntity( + FluxCapabilities.BLOCK, + BlockEntityRegistry.CHARGER_BE.get(), + this::createFNWrapper + ); + + event.registerBlockEntity( + FluxCapabilities.BLOCK, + BlockEntityRegistry.WIRELESS_CHARGER_BE.get(), + this::createFNWrapper + ); + + event.registerItem( + FluxCapabilities.ITEM, + this::createFNWrapper, + ItemRegistry.CHARGER_T1_ITEM, + ItemRegistry.CHARGER_T2_ITEM, + ItemRegistry.CHARGER_T3_ITEM, + ItemRegistry.CHARGER_T4_ITEM, + ItemRegistry.CHARGER_CREATIVE_ITEM + ); + + event.registerItem( + FluxCapabilities.ITEM, + this::createWirelessFNWrapper, + ItemRegistry.CHARGER_WIRELESS_ITEM + ); } + } + + /** + * Creates a wrapper around the provided storage. + * + * @param entity The entity holding the energy storage + * @param side The side that storage is requested on + * @return Returns a wrapped energy storage + */ + private IFNEnergyStorage createFNWrapper(EnergyHolderBlockEntity entity, Direction side) { + return new FNStorageWrapper(entity.getStorage()); + } - return false; + /** + * Creates a tier wrapper around the provided stack. + * + * @param stack The stack to add the capability to + * @param context An empty context + * @return Returns a wrapped energy storage + */ + private IFNEnergyStorage createFNWrapper(ItemStack stack, Void context) { + ChargerBlock block = (ChargerBlock) ((BlockItem) stack.getItem()).getBlock(); + ChargerBlock.Tier tier = block.getTier(); + return new FNStorageWrapper(new CustomItemEnergyStorage(stack, tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative())); } /** - * Creates a wrapper around the provided storage, invalidates any previous lazy optionals if available. + * Creates a wireless wrapper around the provided stack. * - * @param storage The storage to wrap - * @param compatWrappers The map holding the wrappers + * @param stack The stack to add the capability to + * @param context An empty context + * @return Returns a wrapped energy storage */ - public void createFNWrapper(CustomEnergyStorage storage, Map, Pair>> compatWrappers) { - if (compatWrappers.containsKey(FluxCapabilities.FN_ENERGY_STORAGE)) { - compatWrappers.get(FluxCapabilities.FN_ENERGY_STORAGE).second().invalidate(); - } - var fnWrapper = new FNStorageWrapper(storage); - compatWrappers.put(FluxCapabilities.FN_ENERGY_STORAGE, Pair.of(fnWrapper, LazyOptional.of(() -> fnWrapper))); + private IFNEnergyStorage createWirelessFNWrapper(ItemStack stack, Void context) { + return new FNStorageWrapper(new CustomItemEnergyStorage(stack, + Configs.SERVER.wireless.storage.get(), + Configs.SERVER.wireless.maxInput.get(), + Configs.SERVER.wireless.maxOutput.get())); } } diff --git a/src/main/java/se/gory_moon/chargers/compat/industrial/IndustrialForegoingCompat.java b/src/main/java/se/gory_moon/chargers/compat/industrial/IndustrialForegoingCompat.java index fbd52ec..dd25428 100644 --- a/src/main/java/se/gory_moon/chargers/compat/industrial/IndustrialForegoingCompat.java +++ b/src/main/java/se/gory_moon/chargers/compat/industrial/IndustrialForegoingCompat.java @@ -1,8 +1,8 @@ package se.gory_moon.chargers.compat.industrial; import com.buuz135.industrial.item.infinity.InfinityEnergyStorage; -import net.minecraftforge.energy.IEnergyStorage; -import net.minecraftforge.fml.ModList; +import net.neoforged.fml.ModList; +import net.neoforged.neoforge.energy.IEnergyStorage; import java.util.Optional; diff --git a/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java b/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java index 5e328fd..ae72b53 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java +++ b/src/main/java/se/gory_moon/chargers/crafting/RecipeSerializers.java @@ -1,14 +1,16 @@ package se.gory_moon.chargers.crafting; +import net.minecraft.core.registries.Registries; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; public class RecipeSerializers { - public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, Constants.MOD_ID); + public static final DeferredRegister> RECIPE_SERIALIZER = DeferredRegister.create(Registries.RECIPE_SERIALIZER, Constants.MOD_ID); - public static final RegistryObject UPGRADE_SERIALIZER = RECIPE_SERIALIZERS.register("upgrade_charger", UpgradeChargerRecipeSerializer::new); + public static final DeferredHolder, UpgradeChargerRecipeSerializer> UPGRADE_SERIALIZER = RECIPE_SERIALIZER.register( + "upgrade_charger", + UpgradeChargerRecipeSerializer::new); } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java index 127d8ac..e331767 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipe.java @@ -1,24 +1,19 @@ package se.gory_moon.chargers.crafting; -import net.minecraft.core.NonNullList; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.core.HolderLookup; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapedRecipe; -import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraft.world.item.crafting.*; +import net.neoforged.neoforge.capabilities.Capabilities; import org.jetbrains.annotations.NotNull; -import se.gory_moon.chargers.item.ChargerBlockItem; +import se.gory_moon.chargers.block.EnergyBlock; import se.gory_moon.chargers.power.CustomEnergyStorage; import java.util.concurrent.atomic.AtomicLong; public class UpgradeChargerRecipe extends ShapedRecipe { - public UpgradeChargerRecipe(ResourceLocation id, String group, CraftingBookCategory category, int width, int height, NonNullList ingredients, ItemStack output) { - super(id, group, category, width, height, ingredients, output); + public UpgradeChargerRecipe(String group, CraftingBookCategory category, ShapedRecipePattern pattern, ItemStack output, boolean showNotification) { + super(group, category, pattern, output, showNotification); } @Override @@ -27,31 +22,35 @@ public UpgradeChargerRecipe(ResourceLocation id, String group, CraftingBookCateg } @Override - public @NotNull ItemStack assemble(@NotNull CraftingContainer inv, @NotNull RegistryAccess access) { - var out = getResultItem(access).copy(); + public @NotNull ItemStack assemble(@NotNull CraftingInput input, HolderLookup.@NotNull Provider registries) { + var out = getResultItem(registries).copy(); - if (out.getItem() instanceof ChargerBlockItem) { + if (out.getItem() instanceof BlockItem blockItem && blockItem.getBlock() instanceof EnergyBlock) { AtomicLong energy = new AtomicLong(); - for (int i = 0; i < inv.getContainerSize(); i++) { - ItemStack item = inv.getItem(i); - if (!item.isEmpty() && item.getItem() instanceof ChargerBlockItem) - item.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(storage -> { + for (int i = 0; i < input.size(); i++) { + ItemStack item = input.getItem(i); + if (!item.isEmpty() && item.getItem() instanceof BlockItem blockItem1 && blockItem1.getBlock() instanceof EnergyBlock) { + var storage = item.getCapability(Capabilities.EnergyStorage.ITEM); + if (storage != null) { if (storage instanceof CustomEnergyStorage customEnergyStorage) energy.addAndGet(customEnergyStorage.getLongEnergyStored()); else energy.addAndGet(storage.getEnergyStored()); - }); + } + } } - out.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(storage -> - out.getOrCreateTag().putLong(CustomEnergyStorage.ENERGY_TAG, Math.min(energy.get(), ((CustomEnergyStorage) storage).getLongMaxEnergyStored()))); + var outStorage = out.getCapability(Capabilities.EnergyStorage.ITEM); + if (outStorage instanceof CustomEnergyStorage customEnergyStorage) { + customEnergyStorage.setEnergy(Math.min(energy.get(), customEnergyStorage.getLongMaxEnergyStored())); + } return out; } - return super.assemble(inv, access); + return super.assemble(input, registries); } - public ShapedRecipe toVanilla() { - return new ShapedRecipe(getId(), getGroup(), category(), getWidth(), getHeight(), getIngredients(), getResultItem(null)); + public ShapedRecipe toVanilla(HolderLookup.Provider registries) { + return new ShapedRecipe(getGroup(), category(), pattern, getResultItem(registries)); } } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java index 0e05f04..b487535 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeBuilder.java @@ -1,68 +1,118 @@ package se.gory_moon.chargers.crafting; -import com.google.gson.JsonObject; -import net.minecraft.data.recipes.FinishedRecipe; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRequirements; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.ShapedRecipePattern; import net.minecraft.world.level.ItemLike; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; -public class UpgradeChargerRecipeBuilder extends ShapedRecipeBuilder { - public UpgradeChargerRecipeBuilder(RecipeCategory pCategory, ItemLike pResult, int pCount) { - super(pCategory, pResult, pCount); - } +public class UpgradeChargerRecipeBuilder implements RecipeBuilder { - public static UpgradeChargerRecipeBuilder builder(RecipeCategory category, ItemLike result) { - return builder(category, result, 1); - } + private final RecipeCategory category; + @Nullable + private String group; + private final List rows = Lists.newArrayList(); + private final Map key = Maps.newLinkedHashMap(); + private final Map> criteria = new LinkedHashMap<>(); + private final Item result; + private final ItemStack resultStack; - public static UpgradeChargerRecipeBuilder builder(RecipeCategory category, ItemLike result, int count) { - return new UpgradeChargerRecipeBuilder(category, result, count); + public UpgradeChargerRecipeBuilder(RecipeCategory pCategory, ItemLike pResult) { + category = pCategory; + result = pResult.asItem(); + resultStack = new ItemStack(pResult); } - @Override - public void save(@NotNull Consumer finishedRecipeConsumer, @NotNull ResourceLocation recipeId) { - Consumer dummyConsumer = recipe -> finishedRecipeConsumer.accept(new Result(recipe)); - super.save(dummyConsumer, recipeId); + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, TagKey tag) { + return define(symbol, Ingredient.of(tag)); } - public static class Result implements FinishedRecipe { - private final FinishedRecipe recipe; + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, ItemLike item) { + return define(symbol, Ingredient.of(item)); + } - public Result(FinishedRecipe recipe) { - this.recipe = recipe; + /** + * Adds a key to the recipe pattern. + */ + public UpgradeChargerRecipeBuilder define(Character symbol, Ingredient ingredient) { + if (key.containsKey(symbol)) { + throw new IllegalArgumentException("Symbol '" + symbol + "' is already defined!"); + } else if (symbol == ' ') { + throw new IllegalArgumentException("Symbol ' ' (whitespace) is reserved and cannot be defined"); + } else { + key.put(symbol, ingredient); + return this; } + } - @Override - public void serializeRecipeData(@NotNull JsonObject json) { - recipe.serializeRecipeData(json); + /** + * Adds a new entry to the patterns for this recipe. + */ + public UpgradeChargerRecipeBuilder pattern(String pattern) { + if (!rows.isEmpty() && pattern.length() != rows.getFirst().length()) { + throw new IllegalArgumentException("Pattern must be the same width on every line!"); + } else { + rows.add(pattern); + return this; } + } - @Override - public @NotNull ResourceLocation getId() { - return recipe.getId(); - } + public @NotNull UpgradeChargerRecipeBuilder unlockedBy(@NotNull String name, @NotNull Criterion criterion) { + criteria.put(name, criterion); + return this; + } - @Override - public @NotNull RecipeSerializer getType() { - return RecipeSerializers.UPGRADE_SERIALIZER.get(); - } + @Override + public @NotNull UpgradeChargerRecipeBuilder group(@Nullable String groupName) { + group = groupName; + return this; + } - @Nullable - @Override - public JsonObject serializeAdvancement() { - return recipe.serializeAdvancement(); - } + @Override + public @NotNull Item getResult() { + return result; + } - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return recipe.getAdvancementId(); - } + @Override + public void save(@NotNull RecipeOutput recipeOutput, @NotNull ResourceLocation id) { + ShapedRecipePattern shapedrecipepattern = ShapedRecipePattern.of(this.key, this.rows); + Advancement.Builder advancement$builder = recipeOutput.advancement() + .addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(id)) + .rewards(AdvancementRewards.Builder.recipe(id)) + .requirements(AdvancementRequirements.Strategy.OR); + this.criteria.forEach(advancement$builder::addCriterion); + var recipe = new UpgradeChargerRecipe( + Objects.requireNonNullElse(this.group, ""), + RecipeBuilder.determineBookCategory(this.category), + shapedrecipepattern, + this.resultStack, + true + ); + recipeOutput.accept(id, recipe, advancement$builder.build(id.withPrefix("recipes/" + this.category.getFolderName() + "/"))); } } diff --git a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java index 55cb2fd..1ab1d57 100644 --- a/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java +++ b/src/main/java/se/gory_moon/chargers/crafting/UpgradeChargerRecipeSerializer.java @@ -1,28 +1,48 @@ package se.gory_moon.chargers.crafting; -import com.google.gson.JsonObject; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.crafting.ShapedRecipePattern; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class UpgradeChargerRecipeSerializer implements RecipeSerializer { + private final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + Codec.STRING.optionalFieldOf("group", "").forGetter(ShapedRecipe::getGroup), + CraftingBookCategory.CODEC.fieldOf("category").orElse(CraftingBookCategory.MISC).forGetter(ShapedRecipe::category), + ShapedRecipePattern.MAP_CODEC.forGetter(recipe -> recipe.pattern), + ItemStack.STRICT_CODEC.fieldOf("result").forGetter(recipe -> recipe.getResultItem(null)), + Codec.BOOL.optionalFieldOf("show_notification", Boolean.TRUE).forGetter(ShapedRecipe::showNotification) + ).apply(instance, UpgradeChargerRecipe::new) + ); + + private final StreamCodec STREAM_CODEC = StreamCodec.of( + UpgradeChargerRecipeSerializer::toNetwork, UpgradeChargerRecipeSerializer::fromNetwork + ); + @Override - public @NotNull UpgradeChargerRecipe fromJson(@NotNull ResourceLocation recipeId, @NotNull JsonObject json) { - ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.fromJson(recipeId, json); - return new UpgradeChargerRecipe(basic.getId(), basic.getGroup(), basic.category(), basic.getWidth(), basic.getHeight(), basic.getIngredients(), basic.getResultItem(null)); + public @NotNull MapCodec codec() { + return CODEC; } @Override - public @Nullable UpgradeChargerRecipe fromNetwork(@NotNull ResourceLocation recipeId, @NotNull FriendlyByteBuf buffer) { - ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.fromNetwork(recipeId, buffer); - return basic != null ? new UpgradeChargerRecipe(basic.getId(), basic.getGroup(), basic.category(), basic.getWidth(), basic.getHeight(), basic.getIngredients(), basic.getResultItem(null)) : null; + public @NotNull StreamCodec streamCodec() { + return STREAM_CODEC; } - @Override - public void toNetwork(@NotNull FriendlyByteBuf buffer, UpgradeChargerRecipe recipe) { - RecipeSerializer.SHAPED_RECIPE.toNetwork(buffer, recipe.toVanilla()); + public static UpgradeChargerRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { + ShapedRecipe basic = RecipeSerializer.SHAPED_RECIPE.streamCodec().decode(buffer); + return new UpgradeChargerRecipe(basic.getGroup(), basic.category(), basic.pattern, basic.getResultItem(buffer.registryAccess()), basic.showNotification()); + } + + public static void toNetwork(@NotNull RegistryFriendlyByteBuf buffer, UpgradeChargerRecipe recipe) { + RecipeSerializer.SHAPED_RECIPE.streamCodec().encode(buffer, recipe.toVanilla(buffer.registryAccess())); } } diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java new file mode 100644 index 0000000..16a5804 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerBlockStateProvider.java @@ -0,0 +1,59 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.block.WirelessChargerBlock; + +public class ChargerBlockStateProvider extends BlockStateProvider { + + public ChargerBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { + super(output, Constants.MOD_ID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + simpleBlock(BlockRegistry.CHARGER_BLOCK_T1.get(), + models().cubeBottomTop("charger_tier_1", + modLoc("block/charger_tier_1_side"), + modLoc("block/charger_tier_1"), + modLoc("block/charger_tier_1_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T2.get(), + models().cubeBottomTop("charger_tier_2", + modLoc("block/charger_tier_2_side"), + modLoc("block/charger_tier_2"), + modLoc("block/charger_tier_2_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T3.get(), + models().cubeBottomTop("charger_tier_3", + modLoc("block/charger_tier_3_side"), + modLoc("block/charger_tier_3"), + modLoc("block/charger_tier_3_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_T4.get(), + models().cubeBottomTop("charger_tier_4", + modLoc("block/charger_tier_4_side"), + modLoc("block/charger_tier_4"), + modLoc("block/charger_tier_4_top")) + ); + + simpleBlock(BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), + models().cubeBottomTop("charger_creative", + modLoc("block/charger_creative_side"), + modLoc("block/charger_creative"), + modLoc("block/charger_creative_top")) + ); + + getVariantBuilder(BlockRegistry.WIRELESS_CHARGER.get()) + .partialState().with(WirelessChargerBlock.POWERED, false) + .modelForState().modelFile(models().cubeAll("wireless_charger_disabled", modLoc("block/wireless_charger_disabled"))).addModel() + .partialState().with(WirelessChargerBlock.POWERED, true) + .modelForState().modelFile(models().cubeAll("wireless_charger_enabled", modLoc("block/wireless_charger_enabled"))).addModel(); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java new file mode 100644 index 0000000..b7f1c7f --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerBlockTagsProvider.java @@ -0,0 +1,45 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.BlockTags; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.block.BlockRegistry; + +import java.util.concurrent.CompletableFuture; + +public class ChargerBlockTagsProvider extends BlockTagsProvider { + + public ChargerBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, Constants.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(@NotNull HolderLookup.Provider provider) { + tag(BlockTags.MINEABLE_WITH_PICKAXE) + .add( + BlockRegistry.CHARGER_BLOCK_T1.get(), + BlockRegistry.CHARGER_BLOCK_T2.get(), + BlockRegistry.CHARGER_BLOCK_T3.get(), + BlockRegistry.CHARGER_BLOCK_T4.get(), + BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), + BlockRegistry.WIRELESS_CHARGER.get() + ); + + tag(BlockTags.NEEDS_STONE_TOOL) + .add(BlockRegistry.CHARGER_BLOCK_T2.get()); + + tag(BlockTags.NEEDS_IRON_TOOL) + .add(BlockRegistry.CHARGER_BLOCK_T3.get()); + + tag(BlockTags.NEEDS_DIAMOND_TOOL) + .add( + BlockRegistry.CHARGER_BLOCK_T4.get(), + BlockRegistry.CHARGER_BLOCK_CREATIVE.get() + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java new file mode 100644 index 0000000..7ca24de --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerItemModelProvider.java @@ -0,0 +1,25 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.client.model.generators.ItemModelProvider; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.item.ItemRegistry; + +public class ChargerItemModelProvider extends ItemModelProvider { + + public ChargerItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { + super(output, Constants.MOD_ID, existingFileHelper); + } + + @Override + protected void registerModels() { + withExistingParent(ItemRegistry.CHARGER_T1_ITEM.getId().toString(), modLoc("block/charger_tier_1")); + withExistingParent(ItemRegistry.CHARGER_T2_ITEM.getId().toString(), modLoc("block/charger_tier_2")); + withExistingParent(ItemRegistry.CHARGER_T3_ITEM.getId().toString(), modLoc("block/charger_tier_3")); + withExistingParent(ItemRegistry.CHARGER_T4_ITEM.getId().toString(), modLoc("block/charger_tier_4")); + withExistingParent(ItemRegistry.CHARGER_CREATIVE_ITEM.getId().toString(), modLoc("block/charger_creative")); + + withExistingParent(ItemRegistry.CHARGER_WIRELESS_ITEM.getId().toString(), modLoc("block/wireless_charger_disabled")); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java new file mode 100644 index 0000000..0de7fb3 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerLanguageProvider.java @@ -0,0 +1,59 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.LanguageProvider; +import se.gory_moon.chargers.LangKeys; +import se.gory_moon.chargers.block.BlockRegistry; + +import static se.gory_moon.chargers.Constants.MOD_ID; + +public class ChargerLanguageProvider extends LanguageProvider { + public ChargerLanguageProvider(PackOutput packOutput) { + super(packOutput, MOD_ID, "en_us"); + } + + @Override + protected void addTranslations() { + addBlock(BlockRegistry.CHARGER_BLOCK_T1, "Charger Tier I"); + addBlock(BlockRegistry.CHARGER_BLOCK_T2, "Charger Tier II"); + addBlock(BlockRegistry.CHARGER_BLOCK_T3, "Charger Tier III"); + addBlock(BlockRegistry.CHARGER_BLOCK_T4, "Charger Tier IV"); + addBlock(BlockRegistry.CHARGER_BLOCK_CREATIVE, "Creative Charger"); + addBlock(BlockRegistry.WIRELESS_CHARGER, "Wireless Charger"); + + add(LangKeys.TOOLTIP_WIRELESS_CHARGER, "Can be disabled with redstone power"); + add(LangKeys.CREATIVE_TAB, "Chargers"); + add(LangKeys.PACK_DESCRIPTION, "Chargers mod resources"); + + add(LangKeys.CONFIG_CHARGERS, "Chargers"); + add(LangKeys.CONFIG_COMPAT, "Compatability"); + add(LangKeys.CONFIG_CURIOS_COMPAT, "Curios"); + add(LangKeys.CONFIG_MAX_INPUT, "Max Input"); + add(LangKeys.CONFIG_MAX_OUTPUT, "Max Output"); + add(LangKeys.CONFIG_STORAGE, "Storage"); + add(LangKeys.CONFIG_RANGE, "Range"); + + add(LangKeys.CONFIG_WIRELESS, "Wireless Charger"); + add(LangKeys.CONFIG_TIER_1, "Charger Tier 1"); + add(LangKeys.CONFIG_TIER_2, "Charger Tier 2"); + add(LangKeys.CONFIG_TIER_3, "Charger Tier 3"); + add(LangKeys.CONFIG_TIER_4, "Charger Tier 4"); + + add(LangKeys.CHAT_WIRELESS_CHARGER_INFO, "Status: %s, %s"); + add(LangKeys.CHAT_ENABLED, "Enabled"); + add(LangKeys.CHAT_DISABLED, "Disabled"); + + add(LangKeys.POWER_INFO, "Power: %s"); + + add(LangKeys.GUI_MAX_IN, "Max In: %s"); + add(LangKeys.GUI_MAX_OUT, "Max Out: %s"); + add(LangKeys.GUI_IO, "I/O: %s"); + add(LangKeys.GUI_IO_MORE, "Hold shift for more I/O details"); + add(LangKeys.GUI_DETAILS_IN, "In: %s"); + add(LangKeys.GUI_DETAILS_OUT, "Out: %s"); + } + + private void add(LangKeys key, String text) { + add(key.key(), text); + } +} diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java new file mode 100644 index 0000000..6530962 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerLootTableProvider.java @@ -0,0 +1,82 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; +import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import org.jetbrains.annotations.NotNull; +import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.item.ChargerDataComponents; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class ChargerLootTableProvider extends LootTableProvider { + + public ChargerLootTableProvider(PackOutput output, CompletableFuture registries) { + super(output, Set.of(), List.of( + new SubProviderEntry( + ChargerBlockLootSubProvider::new, + LootContextParamSets.BLOCK + ) + ), registries); + } + + private static class ChargerBlockLootSubProvider extends BlockLootSubProvider { + + private ChargerBlockLootSubProvider(HolderLookup.Provider registries) { + super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected @NotNull Iterable getKnownBlocks() { + return BlockRegistry.BLOCKS.getEntries() + .stream() + .map(holder -> (Block) holder.value()) + .toList(); + } + + @Override + protected void generate() { + dropEnergyBlock(BlockRegistry.CHARGER_BLOCK_T1); + dropEnergyBlock(BlockRegistry.CHARGER_BLOCK_T2); + dropEnergyBlock(BlockRegistry.CHARGER_BLOCK_T3); + dropEnergyBlock(BlockRegistry.CHARGER_BLOCK_T4); + dropEnergyBlock(BlockRegistry.CHARGER_BLOCK_CREATIVE); + dropEnergyBlock(BlockRegistry.WIRELESS_CHARGER); + } + + private void dropEnergyBlock(Supplier blockSupplier) { + var block = blockSupplier.get(); + add(block, + LootTable.lootTable().withPool( + applyExplosionCondition( + block, + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(block) + .apply( + CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY) + .include(DataComponents.CUSTOM_NAME) + .include(ChargerDataComponents.ENERGY.get()) + ) + ) + ) + ) + ); + } + } +} + + diff --git a/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java b/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java new file mode 100644 index 0000000..27c872b --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/data/ChargerRecipeProvider.java @@ -0,0 +1,96 @@ +package se.gory_moon.chargers.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.common.Tags; +import org.jetbrains.annotations.NotNull; +import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.crafting.UpgradeChargerRecipeBuilder; +import se.gory_moon.chargers.item.ItemRegistry; + +import java.util.concurrent.CompletableFuture; + +public class ChargerRecipeProvider extends RecipeProvider { + public ChargerRecipeProvider(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + + @Override + protected void buildRecipes(@NotNull RecipeOutput output) { + var chargerT1Item = ItemRegistry.CHARGER_T1_ITEM.get(); + var chargerT2Item = ItemRegistry.CHARGER_T2_ITEM.get(); + var chargerT3Item = ItemRegistry.CHARGER_T3_ITEM.get(); + var chargerT4Item = ItemRegistry.CHARGER_T4_ITEM.get(); + + var iron = Ingredient.of(Tags.Items.INGOTS_IRON); + var redstone = Ingredient.of(Tags.Items.DUSTS_REDSTONE); + var redstoneBlock = Ingredient.of(Tags.Items.STORAGE_BLOCKS_REDSTONE); + var gold = Ingredient.of(Tags.Items.INGOTS_GOLD); + var diamond = Ingredient.of(Tags.Items.GEMS_DIAMOND); + var netherite = Ingredient.of(Tags.Items.INGOTS_NETHERITE); + var enderPearls = Ingredient.of(Tags.Items.ENDER_PEARLS); + + var chargerT1 = Ingredient.of(chargerT1Item); + var chargerT2 = Ingredient.of(chargerT2Item); + var chargerT3 = Ingredient.of(chargerT3Item); + + // T1 Charger + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, chargerT1Item) + .define('I', iron) + .define('R', redstone) + .define('B', redstoneBlock) + .pattern("IRI").pattern("IBI").pattern("IRI") + .unlockedBy("has_ingots_iron", has(Tags.Items.INGOTS_IRON)) + .unlockedBy("has_dusts_redstone", has(Tags.Items.DUSTS_REDSTONE)) + .unlockedBy("has_storage_blocks_redstone", has(Tags.Items.STORAGE_BLOCKS_REDSTONE)) + .save(output); + + // T2 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT2Item) + .define('G', gold) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT1) + .pattern("GRG").pattern("GBG").pattern("GCG") + .unlockedBy("has_charger_t1", has(chargerT1Item)) + .save(output); + + // T3 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT3Item) + .define('D', diamond) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT2) + .pattern("DRD").pattern("DBD").pattern("DCD") + .unlockedBy("has_charger_t2", has(chargerT2Item)) + .save(output); + + // T4 Charger + new UpgradeChargerRecipeBuilder(RecipeCategory.REDSTONE, chargerT4Item) + .define('N', netherite) + .define('R', redstone) + .define('B', redstoneBlock) + .define('C', chargerT3) + .pattern("NRN").pattern("NBN").pattern("NCN") + .unlockedBy("has_charger_t3", has(chargerT3Item)) + .save(output); + + // Wireless charger + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, BlockRegistry.WIRELESS_CHARGER.get()) + .define('I', iron) + .define('R', redstone) + .define('B', redstoneBlock) + .define('E', enderPearls) + .pattern("IEI").pattern("IBI").pattern("IRI") + .unlockedBy("has_ender_pearls", has(Tags.Items.ENDER_PEARLS)) + .unlockedBy("has_ingots_iron", has(Tags.Items.INGOTS_IRON)) + .unlockedBy("has_dusts_redstone", has(Tags.Items.DUSTS_REDSTONE)) + .unlockedBy("has_storage_blocks_redstone", has(Tags.Items.STORAGE_BLOCKS_REDSTONE)) + .save(output); + } +} diff --git a/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java b/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java new file mode 100644 index 0000000..723c92e --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/handler/CapabilityRegistrationHandler.java @@ -0,0 +1,63 @@ +package se.gory_moon.chargers.handler; + +import net.minecraft.world.item.BlockItem; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import se.gory_moon.chargers.Configs; +import se.gory_moon.chargers.block.ChargerBlock; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; +import se.gory_moon.chargers.compat.ChargeCompat; +import se.gory_moon.chargers.item.ItemRegistry; +import se.gory_moon.chargers.power.CustomItemEnergyStorage; + +public class CapabilityRegistrationHandler { + + public static void registerCapabilities(RegisterCapabilitiesEvent event) { + + // Blocks + event.registerBlockEntity( + Capabilities.EnergyStorage.BLOCK, + BlockEntityRegistry.CHARGER_BE.get(), + (entity, side) -> entity.getStorage() + ); + + event.registerBlockEntity( + Capabilities.ItemHandler.BLOCK, + BlockEntityRegistry.CHARGER_BE.get(), + (entity, context) -> entity.getInventoryHandler() + ); + + event.registerBlockEntity( + Capabilities.EnergyStorage.BLOCK, + BlockEntityRegistry.WIRELESS_CHARGER_BE.get(), + (entity, side) -> entity.getStorage() + ); + + // Register compat capabilities + ChargeCompat.registerCapabilities(event); + + // Items + event.registerItem( + Capabilities.EnergyStorage.ITEM, + (stack, context) -> { + ChargerBlock block = (ChargerBlock) ((BlockItem) stack.getItem()).getBlock(); + ChargerBlock.Tier tier = block.getTier(); + return new CustomItemEnergyStorage(stack, tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative()); + }, + ItemRegistry.CHARGER_T1_ITEM, + ItemRegistry.CHARGER_T2_ITEM, + ItemRegistry.CHARGER_T3_ITEM, + ItemRegistry.CHARGER_T4_ITEM, + ItemRegistry.CHARGER_CREATIVE_ITEM + ); + + event.registerItem( + Capabilities.EnergyStorage.ITEM, + (stack, context) -> new CustomItemEnergyStorage(stack, + Configs.SERVER.wireless.storage.get(), + Configs.SERVER.wireless.maxInput.get(), + Configs.SERVER.wireless.maxOutput.get()), + ItemRegistry.CHARGER_WIRELESS_ITEM + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/handler/WirelessHandler.java b/src/main/java/se/gory_moon/chargers/handler/WirelessHandler.java index af21c55..b377ae5 100644 --- a/src/main/java/se/gory_moon/chargers/handler/WirelessHandler.java +++ b/src/main/java/se/gory_moon/chargers/handler/WirelessHandler.java @@ -9,9 +9,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; import se.gory_moon.chargers.Configs; import se.gory_moon.chargers.Constants; import se.gory_moon.chargers.block.entity.WirelessChargerBlockEntity; @@ -20,7 +20,7 @@ import javax.annotation.Nullable; import java.util.Iterator; -@Mod.EventBusSubscriber(modid = Constants.MOD_ID) +@EventBusSubscriber(modid = Constants.MOD_ID) public class WirelessHandler { public static WirelessHandler INSTANCE = new WirelessHandler(); @@ -40,11 +40,11 @@ public void unregister(WirelessChargerBlockEntity charger, @Nullable Level level } @SubscribeEvent - public static void playerTick(TickEvent.PlayerTickEvent event) { - if (event.side.isClient() || event.phase != TickEvent.Phase.START || event.player.isSpectator()) { + public static void playerTick(PlayerTickEvent.Pre event) { + if (event.getEntity().level().isClientSide() || event.getEntity().isSpectator()) { return; } - INSTANCE.chargeItems(event.player); + INSTANCE.chargeItems(event.getEntity()); } public void chargeItems(Player player) { @@ -71,7 +71,6 @@ public void chargeItems(Player player) { @Nullable private WirelessChargerBlockEntity getCharger(Level level, BlockPos pos) { - //noinspection deprecation if (level.isAreaLoaded(pos, 1)) { BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof WirelessChargerBlockEntity) diff --git a/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java b/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java index 961b5e0..a31c89e 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java +++ b/src/main/java/se/gory_moon/chargers/inventory/ChargerMenu.java @@ -7,38 +7,36 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.DataSlot; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.SimpleContainerData; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.event.entity.player.PlayerContainerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.network.PacketDistributor; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.player.PlayerContainerEvent; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.network.PacketDistributor; +import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.Constants; import se.gory_moon.chargers.block.BlockRegistry; +import se.gory_moon.chargers.block.entity.BlockEntityRegistry; import se.gory_moon.chargers.block.entity.ChargerItemStackHandler; -import se.gory_moon.chargers.network.PacketHandler; -import se.gory_moon.chargers.network.WindowPropPacket; -import se.gory_moon.chargers.network.WindowPropPacket.SyncPair; +import se.gory_moon.chargers.network.WindowPropPayload; +import se.gory_moon.chargers.network.WindowPropPayload.SyncPair; import java.util.ArrayList; import java.util.List; import static net.minecraft.world.inventory.InventoryMenu.*; -@Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +@EventBusSubscriber(modid = Constants.MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ChargerMenu extends AbstractContainerMenu { private static final ResourceLocation[] ARMOR_SLOT_TEXTURES = new ResourceLocation[]{EMPTY_ARMOR_SLOT_BOOTS, EMPTY_ARMOR_SLOT_LEGGINGS, EMPTY_ARMOR_SLOT_CHESTPLATE, EMPTY_ARMOR_SLOT_HELMET}; private static final EquipmentSlot[] EQUIPMENT_SLOTS = new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}; - public static final ResourceLocation EMPTY_CHARGE_SLOT = new ResourceLocation(Constants.MOD_ID, "item/empty_charge_slot"); + public static final ResourceLocation EMPTY_CHARGE_SLOT = ResourceLocation.fromNamespaceAndPath(Constants.MOD_ID, "item/empty_charge_slot"); private final IItemHandler itemHandler; private final ChargerData energyData; @@ -49,12 +47,12 @@ public class ChargerMenu extends AbstractContainerMenu { private final Slot outputSlot; private final Slot chargeSlot; - public ChargerMenu(MenuType containerType, int containerId, Inventory inventory) { - this(containerType, containerId, inventory, new ChargerItemStackHandler(), new SimpleChargerData(7), ContainerLevelAccess.NULL); + public ChargerMenu(int containerId, Inventory inventory) { + this(containerId, inventory, new ChargerItemStackHandler(), new SimpleChargerData(7), ContainerLevelAccess.NULL); } - public ChargerMenu(MenuType container, int containerId, Inventory playerInventory, ChargerItemStackHandler itemHandler, ChargerData energyData, ContainerLevelAccess access) { - super(container, containerId); + public ChargerMenu(int containerId, Inventory playerInventory, ChargerItemStackHandler itemHandler, ChargerData energyData, ContainerLevelAccess access) { + super(BlockEntityRegistry.CHARGER_MENU.get(), containerId); this.itemHandler = itemHandler; this.energyData = energyData; @@ -81,13 +79,13 @@ public int getMaxStackSize() { } @Override - public boolean mayPlace(ItemStack stack) { + public boolean mayPlace(@NotNull ItemStack stack) { return stack.canEquip(slot, playerInventory.player); } - public boolean mayPickup(Player player) { + public boolean mayPickup(@NotNull Player player) { ItemStack itemstack = this.getItem(); - return (itemstack.isEmpty() || player.isCreative() || !EnchantmentHelper.hasBindingCurse(itemstack)) && super.mayPickup(player); + return (itemstack.isEmpty() || player.isCreative() || !EnchantmentHelper.has(itemstack, EnchantmentEffectComponents.PREVENT_ARMOR_CHANGE)) && super.mayPickup(player); } }.setBackground(InventoryMenu.BLOCK_ATLAS, ARMOR_SLOT_TEXTURES[slot.getIndex()])); } @@ -107,8 +105,10 @@ public void broadcastChanges() { } if (!toSync.isEmpty()) { - PacketDistributor.PacketTarget target = PacketDistributor.NMLIST.with(usingPlayers.stream().map(serverPlayer -> serverPlayer.connection.connection)::toList); - PacketHandler.INSTANCE.send(target, new WindowPropPacket(this.containerId, toSync)); + var payload = new WindowPropPayload(this.containerId, toSync); + for (ServerPlayer player : usingPlayers) { + PacketDistributor.sendToPlayer(player, payload); + } } super.broadcastChanges(); @@ -124,7 +124,7 @@ public void setData(int id, long data) { } @Override - public ItemStack quickMoveStack(Player player, int index) { + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = slots.get(index); @@ -174,7 +174,7 @@ else if(!Curios.isLoaded() && ) */ } @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T1.get()) || stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T2.get()) || stillValid(access, player, BlockRegistry.CHARGER_BLOCK_T3.get()) || @@ -233,7 +233,7 @@ public static void onContainerOpened(PlayerContainerEvent.Open event) { for (int i = 0; i < menu.customTracked.size(); ++i) toSync.add(new SyncPair(i, menu.customTracked.get(i).get())); - PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new WindowPropPacket(menu.containerId, toSync)); + PacketDistributor.sendToPlayer(serverPlayer, new WindowPropPayload(menu.containerId, toSync)); } } diff --git a/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java b/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java index 0fd0145..bf5fc2c 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java +++ b/src/main/java/se/gory_moon/chargers/inventory/InputSlot.java @@ -2,8 +2,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; import se.gory_moon.chargers.block.entity.ChargerItemStackHandler; import javax.annotation.Nonnull; @@ -15,7 +16,7 @@ public InputSlot(IItemHandler itemHandler, int index, int xPosition, int yPositi } @Override - public boolean mayPickup(Player playerIn) { + public boolean mayPickup(@NotNull Player playerIn) { return !((ChargerItemStackHandler)getItemHandler()).extractItemInternal(getSlotIndex(), 1, true).isEmpty(); } diff --git a/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java b/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java index b97224e..b258ec2 100644 --- a/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java +++ b/src/main/java/se/gory_moon/chargers/inventory/OutputSlot.java @@ -1,8 +1,9 @@ package se.gory_moon.chargers.inventory; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.SlotItemHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import org.jetbrains.annotations.NotNull; public class OutputSlot extends SlotItemHandler { @@ -11,7 +12,7 @@ public OutputSlot(IItemHandler itemHandler, int index, int xPosition, int yPosit } @Override - public boolean mayPlace(ItemStack stack) { + public boolean mayPlace(@NotNull ItemStack stack) { return false; } } diff --git a/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java b/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java deleted file mode 100644 index 5e2f5ee..0000000 --- a/src/main/java/se/gory_moon/chargers/item/ChargerBlockItem.java +++ /dev/null @@ -1,50 +0,0 @@ -package se.gory_moon.chargers.item; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import org.jetbrains.annotations.NotNull; -import se.gory_moon.chargers.LangKeys; -import se.gory_moon.chargers.Utils; -import se.gory_moon.chargers.block.ChargerBlock.Tier; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; - -import javax.annotation.Nullable; -import java.util.List; - -public class ChargerBlockItem extends BlockItem { - - public ChargerBlockItem(Block block, Item.Properties builder) { - super(block, builder); - } - - @Nullable - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - Tier tier = Tier.byItem(this); - return new ItemEnergyCapabilityProvider(new CustomItemEnergyStorage(stack, tier.getStorage(), tier.getMaxIn(), tier.getMaxOut(), tier.isCreative())); - } - - @Override - public void onCraftedBy(ItemStack stack, @NotNull Level level, @NotNull Player player) { - stack.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(energyStorage -> energyStorage.receiveEnergy(0, false)); - } - - @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flagIn) { - Tier tier = Tier.byItem(this); - if (tier.isCreative()) - tooltip.add(Component.translatable(LangKeys.CHAT_STORED_INFINITE_INFO.key())); - else - Utils.addEnergyTooltip(stack, tooltip); - super.appendHoverText(stack, level, tooltip, flagIn); - } -} diff --git a/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java b/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java new file mode 100644 index 0000000..9e11c33 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/item/ChargerDataComponents.java @@ -0,0 +1,20 @@ +package se.gory_moon.chargers.item; + +import com.mojang.serialization.Codec; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.codec.ByteBufCodecs; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import se.gory_moon.chargers.Constants; + +public class ChargerDataComponents { + public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, Constants.MOD_ID); + + public static final DeferredHolder, DataComponentType> ENERGY = DATA_COMPONENTS.registerComponentType( + "energy", + builder -> builder + .persistent(Codec.LONG) + .networkSynchronized(ByteBufCodecs.VAR_LONG) + ); +} diff --git a/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java b/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java deleted file mode 100644 index 6ee28d0..0000000 --- a/src/main/java/se/gory_moon/chargers/item/ItemEnergyCapabilityProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package se.gory_moon.chargers.item; - -import net.minecraft.core.Direction; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.LazyOptional; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class ItemEnergyCapabilityProvider implements ICapabilityProvider { - - private CustomItemEnergyStorage storage; - private final LazyOptional lazyStorage = LazyOptional.of(() -> storage); - - public ItemEnergyCapabilityProvider(CustomItemEnergyStorage storage) { - this.storage = storage; - } - - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (cap == ForgeCapabilities.ENERGY) { - return lazyStorage.cast(); - } - return LazyOptional.empty(); - } -} diff --git a/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java b/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java index 060b46b..80c5230 100644 --- a/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java +++ b/src/main/java/se/gory_moon/chargers/item/ItemRegistry.java @@ -1,40 +1,61 @@ package se.gory_moon.chargers.item; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraftforge.registries.ForgeRegistries; -import se.gory_moon.chargers.ChargersMod; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.*; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; import se.gory_moon.chargers.Constants; +import se.gory_moon.chargers.LangKeys; +import se.gory_moon.chargers.block.BlockRegistry; + +import java.util.function.Supplier; public final class ItemRegistry { - private static final Registrate REGISTRATE = ChargersMod.getRegistrate(); - private static final RegistryEntry CHARGERS_TAB = REGISTRATE.defaultCreativeTab(Constants.MOD_ID, - b -> b.withTabsBefore(CreativeModeTabs.SPAWN_EGGS).icon(ItemRegistry.CHARGER_T1_ITEM::asStack)) - .register(); - - public static final ItemEntry CHARGER_T1_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T1_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T2_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T2_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T3_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T3_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_T4_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_T4_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_CREATIVE_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.CHARGER_CREATIVE_BLOCK, ForgeRegistries.Keys.ITEMS)); - public static final ItemEntry CHARGER_WIRELESS_ITEM = ItemEntry.cast(REGISTRATE.get(Constants.WIRELESS_CHARGER_BLOCK, ForgeRegistries.Keys.ITEMS)); - - public ItemRegistry() {} - - public static void init() { - // Manually add the items to control the order - REGISTRATE.modifyCreativeModeTab(CHARGERS_TAB.getKey(), modifier -> { - modifier.accept(CHARGER_T1_ITEM.get()); - modifier.accept(CHARGER_T2_ITEM.get()); - modifier.accept(CHARGER_T3_ITEM.get()); - modifier.accept(CHARGER_T4_ITEM.get()); - modifier.accept(CHARGER_CREATIVE_ITEM.get()); - modifier.accept(CHARGER_WIRELESS_ITEM.get()); - }); - } + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Constants.MOD_ID); + public static final DeferredRegister CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Constants.MOD_ID); + + public static final DeferredItem CHARGER_T1_ITEM = ITEMS.register( + Constants.CHARGER_T1_BLOCK, + () -> new BlockItem(BlockRegistry.CHARGER_BLOCK_T1.get(), + new Item.Properties().rarity(Rarity.COMMON).component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T2_ITEM = ITEMS.register( + Constants.CHARGER_T2_BLOCK, + () -> new BlockItem(BlockRegistry.CHARGER_BLOCK_T2.get(), + new Item.Properties().rarity(Rarity.UNCOMMON).component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T3_ITEM = ITEMS.register( + Constants.CHARGER_T3_BLOCK, + () -> new BlockItem(BlockRegistry.CHARGER_BLOCK_T3.get(), + new Item.Properties().rarity(Rarity.RARE).component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_T4_ITEM = ITEMS.register( + Constants.CHARGER_T4_BLOCK, + () -> new BlockItem(BlockRegistry.CHARGER_BLOCK_T4.get(), + new Item.Properties().rarity(Rarity.EPIC).component(ChargerDataComponents.ENERGY, 0L))); + + public static final DeferredItem CHARGER_CREATIVE_ITEM = ITEMS.register( + Constants.CHARGER_CREATIVE_BLOCK, + () -> new BlockItem(BlockRegistry.CHARGER_BLOCK_CREATIVE.get(), + new Item.Properties().rarity(Rarity.EPIC).component(ChargerDataComponents.ENERGY, Long.MAX_VALUE))); + + public static final DeferredItem CHARGER_WIRELESS_ITEM = ITEMS.register( + Constants.WIRELESS_CHARGER_BLOCK, + () -> new BlockItem(BlockRegistry.WIRELESS_CHARGER.get(), + new Item.Properties().component(ChargerDataComponents.ENERGY, 0L))); + private static final Supplier CHARGERS_TAB = CREATIVE_TABS.register(Constants.MOD_ID, () -> CreativeModeTab.builder() + .title(Component.translatable(LangKeys.CREATIVE_TAB.key())) + .icon(ItemRegistry.CHARGER_T1_ITEM::toStack) + .withTabsBefore(CreativeModeTabs.SPAWN_EGGS) + .displayItems((parameters, output) -> { + output.accept(CHARGER_T1_ITEM.get()); + output.accept(CHARGER_T2_ITEM.get()); + output.accept(CHARGER_T3_ITEM.get()); + output.accept(CHARGER_T4_ITEM.get()); + output.accept(CHARGER_CREATIVE_ITEM.get()); + output.accept(CHARGER_WIRELESS_ITEM.get()); + }).build()); } diff --git a/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java b/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java deleted file mode 100644 index c74e2f3..0000000 --- a/src/main/java/se/gory_moon/chargers/item/WirelessChargerBlockItem.java +++ /dev/null @@ -1,47 +0,0 @@ -package se.gory_moon.chargers.item; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import org.jetbrains.annotations.NotNull; -import se.gory_moon.chargers.Configs; -import se.gory_moon.chargers.Utils; -import se.gory_moon.chargers.power.CustomItemEnergyStorage; - -import javax.annotation.Nullable; -import java.util.List; - -public class WirelessChargerBlockItem extends BlockItem { - - public WirelessChargerBlockItem(Block block, Item.Properties builder) { - super(block, builder); - } - - @Nullable - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - return new ItemEnergyCapabilityProvider(new CustomItemEnergyStorage(stack, - Configs.SERVER.wireless.storage.get(), - Configs.SERVER.wireless.maxInput.get(), - Configs.SERVER.wireless.maxOutput.get())); - } - - @Override - public void onCraftedBy(ItemStack stack, @NotNull Level level, @NotNull Player player) { - stack.getCapability(ForgeCapabilities.ENERGY, null).ifPresent(energyStorage -> energyStorage.receiveEnergy(0, false)); - } - - @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - Utils.addEnergyTooltip(stack, tooltip); - tooltip.add(Component.translatable(getDescriptionId() + ".desc")); - } -} diff --git a/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java b/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java new file mode 100644 index 0000000..9dfdf40 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/ClientPayloadHandler.java @@ -0,0 +1,16 @@ +package se.gory_moon.chargers.network; + +import net.minecraft.client.Minecraft; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import se.gory_moon.chargers.inventory.ChargerMenu; + +public class ClientPayloadHandler { + + public static void handleWindowProp(final WindowPropPayload payload, final IPayloadContext ctx) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player != null && mc.player.containerMenu.containerId == payload.containerId()) { + payload.data().forEach(p -> ((ChargerMenu) mc.player.containerMenu).setData(p.id(), p.data())); + } + } + +} diff --git a/src/main/java/se/gory_moon/chargers/network/PacketHandler.java b/src/main/java/se/gory_moon/chargers/network/PacketHandler.java deleted file mode 100644 index f2cc6cb..0000000 --- a/src/main/java/se/gory_moon/chargers/network/PacketHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package se.gory_moon.chargers.network; - -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import se.gory_moon.chargers.Constants; - -import java.util.Objects; - -public class PacketHandler { - - public static SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder.named(Constants.NET_ID) - .clientAcceptedVersions(s -> Objects.equals(s, "1")) - .serverAcceptedVersions(s -> Objects.equals(s, "1")) - .networkProtocolVersion(() -> "1") - .simpleChannel(); - - public static void init() { - INSTANCE.messageBuilder(WindowPropPacket.class, 0, NetworkDirection.PLAY_TO_CLIENT) - .encoder(WindowPropPacket::encode) - .decoder(WindowPropPacket::new) - .consumerMainThread(WindowPropPacket::handle) - .add(); - } -} diff --git a/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java b/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java new file mode 100644 index 0000000..bb187c3 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/PayloadRegister.java @@ -0,0 +1,19 @@ +package se.gory_moon.chargers.network; + +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +public class PayloadRegister { + + @SubscribeEvent + public static void onPayloadRegister(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); + + registrar.playToClient( + WindowPropPayload.TYPE, + WindowPropPayload.STREAM_CODEC, + ClientPayloadHandler::handleWindowProp + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java b/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java deleted file mode 100644 index a5ad7e0..0000000 --- a/src/main/java/se/gory_moon/chargers/network/WindowPropPacket.java +++ /dev/null @@ -1,47 +0,0 @@ -package se.gory_moon.chargers.network; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import se.gory_moon.chargers.inventory.ChargerMenu; - -import java.util.List; -import java.util.function.Supplier; - -public class WindowPropPacket { - - private final int containerId; - private final List data; - - public WindowPropPacket(FriendlyByteBuf buf) { - this(buf.readUnsignedByte(), buf.readList(byteBuf -> new SyncPair(byteBuf.readShort(), byteBuf.readLong()))); - } - - public WindowPropPacket(int containerId, List data) { - this.containerId = containerId; - this.data = data; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeByte(containerId); - buf.writeCollection(data, (byteBuf, p) -> p.write(byteBuf)); - } - - public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> { - Minecraft mc = Minecraft.getInstance(); - if (mc.player != null && mc.player.containerMenu.containerId == containerId) { - data.forEach(p -> ((ChargerMenu) mc.player.containerMenu).setData(p.id, p.data)); - } - }); - ctx.get().setPacketHandled(true); - } - - public record SyncPair(int id, long data) { - public void write(FriendlyByteBuf buf) { - buf.writeShort(id); - buf.writeLong(data); - } - } - -} diff --git a/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java b/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java new file mode 100644 index 0000000..052d970 --- /dev/null +++ b/src/main/java/se/gory_moon/chargers/network/WindowPropPayload.java @@ -0,0 +1,40 @@ +package se.gory_moon.chargers.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static se.gory_moon.chargers.Constants.MOD_ID; + +public record WindowPropPayload(int containerId, List data) implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(MOD_ID, "window_prop")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, + WindowPropPayload::containerId, + SyncPair.STREAM_CODEC.apply(ByteBufCodecs.list()), + WindowPropPayload::data, + WindowPropPayload::new + ); + + @Override + public @NotNull Type type() { + return TYPE; + } + + public record SyncPair(int id, long data) { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, + SyncPair::id, + ByteBufCodecs.VAR_LONG, + SyncPair::data, + SyncPair::new + ); + } +} diff --git a/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java b/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java index d6836b8..bffc166 100644 --- a/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java +++ b/src/main/java/se/gory_moon/chargers/power/CustomEnergyStorage.java @@ -1,9 +1,12 @@ package se.gory_moon.chargers.power; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.energy.IEnergyStorage; +import net.neoforged.neoforge.common.util.INBTSerializable; +import net.neoforged.neoforge.energy.IEnergyStorage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnknownNullability; import java.math.BigInteger; @@ -131,27 +134,16 @@ public long getMaxOutput() { } @Override - public void deserializeNBT(Tag nbt) { + public void deserializeNBT(@NotNull HolderLookup.Provider provider, @NotNull Tag nbt) { if (nbt instanceof CompoundTag compound) { - if (compound.contains(ENERGY_TAG, Tag.TAG_INT)) - energy = compound.getInt(ENERGY_TAG); - else - energy = compound.getLong(ENERGY_TAG); - - if (compound.contains(IN_TAG, Tag.TAG_FLOAT)) - averageIn = (long) compound.getFloat(IN_TAG); - else - averageIn = compound.getLong(IN_TAG); - - if (compound.contains(IN_TAG, Tag.TAG_FLOAT)) - averageOut = (long) compound.getFloat(OUT_TAG); - else - averageOut = compound.getLong(OUT_TAG); + energy = compound.getLong(ENERGY_TAG); + averageIn = compound.getLong(IN_TAG); + averageOut = compound.getLong(OUT_TAG); } } @Override - public Tag serializeNBT() { + public @UnknownNullability Tag serializeNBT(@NotNull HolderLookup.Provider registries) { CompoundTag compound = new CompoundTag(); compound.putLong(ENERGY_TAG, this.getLongEnergyStored()); compound.putLong(IN_TAG, in.getAverage()); diff --git a/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java b/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java index 0f76a93..2f905ca 100644 --- a/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java +++ b/src/main/java/se/gory_moon/chargers/power/CustomItemEnergyStorage.java @@ -1,8 +1,7 @@ package se.gory_moon.chargers.power; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; +import se.gory_moon.chargers.item.ChargerDataComponents; public class CustomItemEnergyStorage extends CustomEnergyStorage { @@ -26,15 +25,14 @@ public int getEnergyStored() { public long getLongEnergyStored() { if (this.creative) return Long.MAX_VALUE; - CompoundTag tag = stack.getOrCreateTag(); - if (tag.contains(ENERGY_TAG, Tag.TAG_INT)) - return tag.getInt(ENERGY_TAG); - else - return tag.getLong(ENERGY_TAG); + return stack.getOrDefault(ChargerDataComponents.ENERGY, 0L); } @Override protected void setEnergyInternal(long energy) { - stack.getOrCreateTag().putLong(ENERGY_TAG, getLongEnergyStored() + energy); + stack.update( + ChargerDataComponents.ENERGY, + 0L, + e -> e + energy); } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 0753408..0000000 --- a/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,56 +0,0 @@ -modLoader="javafml" -loaderVersion="[46,)" -license="LGPL v3" -issueTrackerURL="https://github.com/GoryMoon/Chargers/issues" - -[[mods]] - modId="chargers" - version="${file.jarVersion}" - displayName="Chargers" - displayURL="https://www.curseforge.com/minecraft/mc-mods/chargers" - authors="Gory_Moon" - itemIcon="chargers:charger_t1" - description=''' -A mod that adds item charger blocks in tiers and a wireless one''' - -[[dependencies.chargers]] - modId="forge" - mandatory=true - versionRange="[46,)" - ordering="NONE" - side="BOTH" - -[[dependencies.chargers]] - modId="curios" - mandatory=false - versionRange="[5.10.0,)" - ordering="BEFORE" - side="BOTH" - -[[dependencies.chargers]] - modId="brandonscore" - mandatory=false - versionRange="[3.2.1.+,)" - ordering="AFTER" - side="BOTH" - -[[dependencies.chargers]] - modId="fluxnetworks" - mandatory=false - versionRange="[7.2,)" - ordering="AFTER" - side="BOTH" - -[[dependencies.chargers]] - modId="industrialforegoing" - mandatory=false - versionRange="[3.5,)" - ordering="AFTER" - side="BOTH" - -[[dependencies.chargers]] - modId="minecraft" - mandatory=true - versionRange="[1.20,1.21)" - ordering="NONE" - side="BOTH" \ No newline at end of file diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..b956e3f --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,55 @@ +modLoader = "javafml" +loaderVersion = "${loader_version_range}" +license = "${mod_license}" +issueTrackerURL = "https://github.com/GoryMoon/Chargers/issues" + +[[mods]] +modId = "${mod_id}" +version = "${mod_version}" +displayName = "${mod_name}" +displayURL = "https://www.curseforge.com/minecraft/mc-mods/chargers" +itemIcon = "chargers:charger_t1" +authors = "${mod_authors}" +description = '''${mod_description}''' + +[[dependencies.${ mod_id }]] +modId = "neoforge" +type = "required" +versionRange = "${neo_version_range}" +ordering = "NONE" +side = "BOTH" + +[[dependencies.${ mod_id }]] +modId = "curios" +type = "optional" +versionRange = "${curios_version_range}" +ordering = "BEFORE" +side = "BOTH" + +#[[dependencies.${ mod_id }]] +#modId = "brandonscore" +#type = "optional" +#versionRange = "${bc_version_range}" +#ordering = "AFTER" +#side = "BOTH" + +#[[dependencies.${ mod_id }]] +#modId = "fluxnetworks" +#type = "optional" +#versionRange = "${flux_version_range}" +#ordering = "AFTER" +#side = "BOTH" + +[[dependencies.${ mod_id }]] +modId = "industrialforegoing" +type = "optional" +versionRange = "${if_version_range}" +ordering = "AFTER" +side = "BOTH" + +[[dependencies.${ mod_id }]] +modId = "minecraft" +type = "required" +versionRange = "${minecraft_version_range}" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta deleted file mode 100644 index 289b882..0000000 --- a/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "Chargers resources", - "pack_format": 15 - } -}