From 407e26a17904b46b96c9e2a5f24aaf17696d9f02 Mon Sep 17 00:00:00 2001 From: micle Date: Thu, 8 Jan 2026 22:17:34 +0100 Subject: [PATCH 01/51] Updated gradle and metadata. --- build.gradle | 140 ++++++++++-------- gradle.properties | 24 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 17 ++- .../totemofreviving/TotemOfReviving.java | 2 +- src/main/resources/META-INF/mods.toml | 80 ++++------ 6 files changed, 140 insertions(+), 125 deletions(-) diff --git a/build.gradle b/build.gradle index c0b2fab..c92575a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,112 +1,134 @@ buildscript { repositories { // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } mavenCentral() } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' } } -apply plugin: 'net.minecraftforge.gradle' +plugins { + id 'eclipse' + id 'idea' + id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' + id 'org.parchmentmc.librarian.forgegradle' version '1.+' +} -def archiveVersion = "${project.mcVersion}-${project.buildVersion}" as Object +apply plugin: 'org.spongepowered.mixin' -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +group = mod_group_id +version = mod_version + +base { + archivesName = "${mod_id}-${minecraft_version}" +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(17) +} minecraft { - mappings channel: 'official', version: mcVersion + mappings channel: mapping_channel, version: "$mapping_version-$minecraft_version" - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + copyIdeResources = true + // generateRunFolders = true + // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ runs { - client { + // applies to all the run configs below + configureEach { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' mods { - totemofreviving { + "${mod_id}" { source sourceSets.main } } } + client { + property 'forge.enabledGameTestNamespaces', mod_id + } + server { - workingDirectory project.file('run') + property 'forge.enabledGameTestNamespaces', mod_id + args '--nogui' + } - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - totemofreviving { - source sourceSets.main - } - } + gameTestServer { + property 'forge.enabledGameTestNamespaces', mod_id } data { - workingDirectory project.file('run') - - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - args '--mod', 'totemofreviving', '--all', - '--existing', file('src/main/resources').toString(), - '--existing', file('src/generated/resources').toString(), - '--output', file('src/generated/resources/') - - mods { - totemofreviving { - source sourceSets.main - } - } + workingDirectory project.file('run-data') + args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') } } } +//mixin { +// add sourceSets.main, "${mod_id}.refmap.json" +// +// config "${mod_id}.mixins.json" +//} + sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { - maven { - name = "Progwml6 maven" - url = "https://dvs1.progwml6.com/files/maven/" - } - maven { - name = "ModMaven" - url = "https://modmaven.dev" + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + forRepositories(fg.repository) // Only add this if you're using ForgeGradle, otherwise remove this line + filter { + includeGroup "maven.modrinth" + } } } dependencies { - minecraft "net.minecraftforge:forge:${project.mcVersion}-${project.forgeVersion}" + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' +} - // JEI - if (project.hasProperty('jeiVersion')) { - // compile against JEI API but do not include it at runtime - compileOnly fg.deobf("mezz.jei:jei-${project.mcVersion}-forge-api:${project.jeiVersion}") - // at runtime, use full JEI jar - runtimeOnly fg.deobf("mezz.jei:jei-${project.mcVersion}-forge:${project.jeiVersion}") +tasks.named('processResources', ProcessResources).configure { + var replaceProperties = [minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, + forge_version : forge_version, forge_version_range: forge_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] + + inputs.properties replaceProperties + + filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { + expand replaceProperties + [project: project] } } -jar { - archiveFileName = "${project.archivesBaseName}-${archiveVersion}.jar" +tasks.named('jar', Jar).configure { manifest { - attributes([ - "Specification-Title" : project.name, - "Specification-Vendor" : project.author, - "Specification-Version" : "1", - "Implementation-Title" : project.name, - "Implementation-Vendor" : project.author, - "Implementation-Version" : archiveVersion, - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) + attributes(["Specification-Title" : mod_id, + "Specification-Vendor" : mod_authors, + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Version" : project.jar.archiveVersion, + "Implementation-Vendor" : mod_authors, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")]) } + + finalizedBy 'reobfJar' } -jar.finalizedBy('reobfJar') \ No newline at end of file +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' +} diff --git a/gradle.properties b/gradle.properties index 9ecf99e..56a9727 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,20 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -group = dev.micle -archivesBaseName = micles-totem-of-reviving-forge -modID = totemofreviving -name = Micle's Totem of Reviving -author = Micle +mod_id=totem_of_reviving +mod_name=Micle's Totem of Reviving +mod_license=All Rights Reserved +mod_version=2.0.0 +mod_group_id=dev.micle +mod_authors=Micle +mod_description=Totems to revive your friends in hardcore. -buildVersion = 2.0.0 -mcVersion = 1.20.1 -forgeVersion = 47.2.20 +minecraft_version=1.20.1 +minecraft_version_range=[1.20.1,1.21) -#jeiVersion = 11.+ +forge_version=47.2.20 +forge_version_range=[47,) +loader_version_range=[47,) + +mapping_channel=parchment +mapping_version=2023.09.03 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fc..0d18421 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 6726ec5..45fe14b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,16 @@ -rootProject.name = 'TotemOfReviving-1.20' +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'MinecraftForge' + url = 'https://maven.minecraftforge.net/' + } + maven { url = 'https://maven.parchmentmc.org' } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' +} + +rootProject.name = "${mod_id}-${minecraft_version}" diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java index e60f80a..5852867 100644 --- a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java +++ b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java @@ -12,7 +12,7 @@ import java.util.Optional; @Mod(TotemOfReviving.MOD_ID) public final class TotemOfReviving { - public static final String MOD_ID = "totemofreviving"; + public static final String MOD_ID = "totem_of_reviving"; private static IProxy proxy; diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index dc42f2e..2c82ceb 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,58 +1,30 @@ -# This is an example mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml -modLoader = "javafml" #mandatory -# A version range to match for said mod loader - for regular FML @Mod it will be the forge version -loaderVersion = "[47,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license = "All Rights Reserved" -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="http://my.issue.tracker/" #optional -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory -# The modid of the mod -modId = "totemofreviving" #mandatory -# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it -# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata -# see the associated build.gradle script for how to populate this completely automatically during a build -version = "${file.jarVersion}" #mandatory -# A display name for the mod -displayName = "Micle's Totem of Reviving" #mandatory -# A URL to query for updates for this mod. See the JSON update specification -#updateJSONURL="http://myurl.me/" #optional -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="http://example.com/" #optional -# A file name (in the root of the mod JAR) containing a logo for display -logoFile="logo.jpg" #optional -# A text field displayed in the mod UI -#credits="Thanks for this example mod goes to Java" #optional -# A text field displayed in the mod UI -authors="Micle" #optional -# The description text for the mod (multi line!) (#mandatory) -description = ''' -Mod for reviving players in a hardcore world. -''' -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.totemofreviving]] #optional - # the modid of the dependency - modId = "forge" #mandatory - # Does this dependency have to exist - if not, ordering below must be specified - mandatory = true #mandatory - # The version range of the dependency - versionRange = "[47,)" #mandatory - # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory - ordering = "NONE" - # Side this dependency is applied on - BOTH, CLIENT or SERVER - side = "BOTH" -# Here's another dependency -[[dependencies.totemofreviving]] +modLoader = "javafml" +loaderVersion = "${loader_version_range}" +license = "${mod_license}" +issueTrackerURL="https://gitea.micle.dev/minecraft-mods/totem_of_reviving/issues" + +[[mods]] +modId = "${mod_id}" +version = "${mod_version}" +displayName = "${mod_name}" +#updateJSONURL="http://myurl.me/" +#displayURL="http://example.com/" +logoFile="logo.jpg" +#credits="" +authors="${mod_authors}" +displayTest="MATCH_VERSION" # MATCH_VERSION, IGNORE_SERVER_VERSION (server only), IGNORE_ALL_VERSION (client only), NONE (IExtensionPoint.DisplayTest) +description = '''${mod_description}''' + +[[dependencies."${mod_id}"]] + modId = "forge" + mandatory = true + versionRange = "${forge_version_range}" + ordering = "NONE" # BEFORE, AFTER, NONE + side = "BOTH" # BOTH, CLIENT, SERVER + +[[dependencies."${mod_id}"]] modId = "minecraft" mandatory = true - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange = "[1.20.1,1.20.2)" + versionRange = "${minecraft_version_range}" ordering = "NONE" side = "BOTH" From aff7f9ae54433bd0d9a43e6837d906e3558391dc Mon Sep 17 00:00:00 2001 From: micle Date: Thu, 8 Jan 2026 23:36:45 +0100 Subject: [PATCH 02/51] Ported gradle and metadata to NeoForge. --- build.gradle | 225 +++++++++++------- gradle.properties | 19 +- gradle/wrapper/gradle-wrapper.properties | 6 +- settings.gradle | 2 +- .../{mods.toml => neoforge.mods.toml} | 21 +- 5 files changed, 174 insertions(+), 99 deletions(-) rename src/main/resources/META-INF/{mods.toml => neoforge.mods.toml} (51%) diff --git a/build.gradle b/build.gradle index c92575a..16460d7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,134 +1,189 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } - mavenCentral() - } - dependencies { - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - } -} - plugins { - id 'eclipse' + id 'java-library' + id 'maven-publish' + id 'net.neoforged.moddev' version '2.0.137' id 'idea' - id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' - id 'org.parchmentmc.librarian.forgegradle' version '1.+' } -apply plugin: 'org.spongepowered.mixin' +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 +} group = mod_group_id version = mod_version +repositories { + // Add here additional repositories if required by some of the dependencies below. +} + base { archivesName = "${mod_id}-${minecraft_version}" } java { - toolchain.languageVersion = JavaLanguageVersion.of(17) + toolchain.languageVersion = JavaLanguageVersion.of(21) } -minecraft { - mappings channel: mapping_channel, version: "$mapping_version-$minecraft_version" +neoForge { + // Specify the version of NeoForge to use. + version = project.neo_version - copyIdeResources = true - // generateRunFolders = true - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ + parchment { + mappingsVersion = project.parchment_mappings_version + minecraftVersion = project.parchment_minecraft_version + } + // This line is optional. Access Transformers are automatically detected + // accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. runs { - // applies to all the run configs below - configureEach { - workingDirectory project.file('run') - - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - "${mod_id}" { - source sourceSets.main - } - } - } - client { - property 'forge.enabledGameTestNamespaces', mod_id + client() + + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } server { - property 'forge.enabledGameTestNamespaces', mod_id - args '--nogui' + server() + programArgument '--nogui' + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } + // 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 { - property 'forge.enabledGameTestNamespaces', mod_id + type = "gameTestServer" + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } data { - workingDirectory project.file('run-data') - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + data() + + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // gameDirectory = project.file('run-data') + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } + + // applies to all the run configs above + configureEach { + // Recommended logging data for a userdev environment + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + systemProperty 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + logLevel = org.slf4j.event.Level.DEBUG + } + } + + mods { + // define mod <-> source bindings + // these are used to tell the game which sources are for which mod + // multi mod projects should define one per mod + "${mod_id}" { + sourceSet(sourceSets.main) } } } -//mixin { -// add sourceSets.main, "${mod_id}.refmap.json" -// -// config "${mod_id}.mixins.json" -//} - +// Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } -repositories { - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - forRepositories(fg.repository) // Only add this if you're using ForgeGradle, otherwise remove this line - filter { - includeGroup "maven.modrinth" - } - } +// 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 { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + // Example optional mod dependency with JEI + // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime + // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" + // compileOnly "mezz.jei:jei-${mc_version}-neoforge-api:${jei_version}" + // We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it + // localRuntime "mezz.jei:jei-${mc_version}-neoforge:${jei_version}" + + // Example mod dependency using a mod jar from ./libs with a flat dir repository + // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar + // The group id is ignored when searching -- in this case, it is "blank" + // implementation "blank:coolmod-${mc_version}:${coolmod_version}" + + // Example mod dependency using a file as dependency + // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") + + // Example project dependency using a sister or child project: + // implementation project(":myproject") + + // For more info: + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html } -tasks.named('processResources', ProcessResources).configure { - var replaceProperties = [minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, - forge_version : forge_version, forge_version_range: forge_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] - +// 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. +var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { + var replaceProperties = [ + minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + loader_version_range : loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_version : mod_version, + ] inputs.properties replaceProperties - - filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { - expand replaceProperties + [project: project] - } + expand replaceProperties + from "src/main/templates" + into "build/generated/sources/modMetadata" } +// Include the output of "generateModMetadata" as an input directory for the build +// this works with both building through Gradle and the IDE. +sourceSets.main.resources.srcDir generateModMetadata +// To avoid having to run "generateModMetadata" manually, make it run on every project reload +neoForge.ideSyncTask generateModMetadata -tasks.named('jar', Jar).configure { - manifest { - attributes(["Specification-Title" : mod_id, - "Specification-Vendor" : mod_authors, - "Specification-Version" : "1", - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : mod_authors, - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")]) +// Example configuration to allow publishing using the maven-publish plugin +publishing { + publications { + register('mavenJava', MavenPublication) { + from components.java + } + } + repositories { + maven { + url "file://${project.projectDir}/repo" + } } - - finalizedBy 'reobfJar' } tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} + +// 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 56a9727..6a86757 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,8 @@ org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true mod_id=totem_of_reviving mod_name=Micle's Totem of Reviving @@ -9,12 +12,12 @@ mod_group_id=dev.micle mod_authors=Micle mod_description=Totems to revive your friends in hardcore. -minecraft_version=1.20.1 -minecraft_version_range=[1.20.1,1.21) +minecraft_version=1.21.1 +minecraft_version_range=[1.21.1,1.22) -forge_version=47.2.20 -forge_version_range=[47,) -loader_version_range=[47,) +neo_version=21.1.217 +neo_version_range=[21.1.217,21.2) +loader_version_range=[1,) -mapping_channel=parchment -mapping_version=2023.09.03 +parchment_minecraft_version=1.21.1 +parchment_mappings_version=2024.11.17 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d18421..d205b54 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.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-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/settings.gradle b/settings.gradle index 45fe14b..d10c313 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,7 +10,7 @@ pluginManagement { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' } rootProject.name = "${mod_id}-${minecraft_version}" diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 51% rename from src/main/resources/META-INF/mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index 2c82ceb..21a32d1 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -15,16 +15,31 @@ authors="${mod_authors}" displayTest="MATCH_VERSION" # MATCH_VERSION, IGNORE_SERVER_VERSION (server only), IGNORE_ALL_VERSION (client only), NONE (IExtensionPoint.DisplayTest) description = '''${mod_description}''' +#[[mixins]] +#config="${mod_id}.mixins.json" + +#[[accessTransformers]] +#file="META-INF/accesstransformer.cfg" + [[dependencies."${mod_id}"]] - modId = "forge" - mandatory = true + modId = "neoforge" + # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). + # 'required' requires the mod to exist, 'optional' does not + # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning + type = "required" versionRange = "${forge_version_range}" ordering = "NONE" # BEFORE, AFTER, NONE side = "BOTH" # BOTH, CLIENT, SERVER [[dependencies."${mod_id}"]] modId = "minecraft" - mandatory = true + type = "required" versionRange = "${minecraft_version_range}" ordering = "NONE" side = "BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features.${mod_id}] +#openGLVersion="[3.2,)" \ No newline at end of file From 681ebeeeb750ae2ece06d8355b5766c2f7b822af Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 00:02:21 +0100 Subject: [PATCH 03/51] Ported side proxy. --- .../totemofreviving/TotemOfReviving.java | 18 ++++---- .../micle/totemofreviving/proxy/IProxy.java | 9 +++- .../micle/totemofreviving/proxy/Proxy.java | 42 +++++++++---------- 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java index 5852867..9fd34f2 100644 --- a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java +++ b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java @@ -3,10 +3,11 @@ package dev.micle.totemofreviving; import dev.micle.totemofreviving.proxy.IProxy; import dev.micle.totemofreviving.proxy.Proxy; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.common.Mod; +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.fml.loading.FMLEnvironment; import java.util.Optional; @@ -16,11 +17,10 @@ public final class TotemOfReviving { private static IProxy proxy; - public TotemOfReviving() { - proxy = DistExecutor.safeRunForDist( - () -> Proxy.Client::new, - () -> Proxy.Server::new - ); + public TotemOfReviving(IEventBus modEventBus) { + proxy = FMLEnvironment.dist == Dist.CLIENT + ? new Proxy.Client(modEventBus) + : new Proxy.Server(modEventBus); } public static ResourceLocation createResourceLocation(String name) { diff --git a/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java b/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java index 4f9e335..98c834a 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java +++ b/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java @@ -4,8 +4,15 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import javax.annotation.Nullable; + public interface IProxy { + @Nullable MinecraftServer getServer(); + + @Nullable Player getClientPlayer(); - Level getClientWorld(); + + @Nullable + Level getClientLevel(); } diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java index 0c29e72..939677d 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java @@ -7,37 +7,35 @@ import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.AddReloadListenerEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.event.lifecycle.*; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.event.lifecycle.*; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.AddReloadListenerEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; public class Proxy implements IProxy { // Initialize variables private static MinecraftServer server = null; // Common setup - public Proxy() { + public Proxy(IEventBus modEventBus) { // Initialize setup Registration.register(); Config.init(); NetworkManager.init(); // Register mod event bus listeners - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(Proxy::setup); modEventBus.addListener(Proxy::imcEnqueue); modEventBus.addListener(Proxy::imcProcess); // Register event bus listeners - MinecraftForge.EVENT_BUS.addListener(Proxy::onAddReloadListeners); - MinecraftForge.EVENT_BUS.addListener(Proxy::serverStarted); - MinecraftForge.EVENT_BUS.addListener(Proxy::serverStopping); + NeoForge.EVENT_BUS.addListener(Proxy::onAddReloadListeners); + NeoForge.EVENT_BUS.addListener(Proxy::serverStarted); + NeoForge.EVENT_BUS.addListener(Proxy::serverStopping); } private static void setup(FMLCommonSetupEvent event) {} @@ -67,15 +65,15 @@ public class Proxy implements IProxy { } @Override - public Level getClientWorld() { + public Level getClientLevel() { return null; } // Client setup public static class Client extends Proxy { - public Client() { - // Register mod event bus listeners - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + public Client(IEventBus modEventBus) { + super(modEventBus); + // Register mod event bus listeners modEventBus.addListener(Client::setup); modEventBus.addListener(Client::postSetup); } @@ -92,16 +90,16 @@ public class Proxy implements IProxy { @Override @OnlyIn(Dist.CLIENT) - public Level getClientWorld() { + public Level getClientLevel() { return Minecraft.getInstance().level; } } // Server setup public static class Server extends Proxy { - public Server() { - // Register mod event bus listeners - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + public Server(IEventBus modEventBus) { + super(modEventBus); + // Register mod event bus listeners modEventBus.addListener(Server::setup); } From 9a0415effd6d63187529c52a3d4fc75bf13a70f3 Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 00:08:13 +0100 Subject: [PATCH 04/51] Ported remainder of main class. --- src/main/java/dev/micle/totemofreviving/TotemOfReviving.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java index 9fd34f2..69b1821 100644 --- a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java +++ b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java @@ -6,6 +6,7 @@ import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; import net.neoforged.fml.common.Mod; import net.neoforged.fml.loading.FMLEnvironment; @@ -27,7 +28,7 @@ public final class TotemOfReviving { if (name.contains(":")) { throw new IllegalArgumentException("Name contains namespace"); } - return new ResourceLocation(MOD_ID, name); + return ResourceLocation.fromNamespaceAndPath(MOD_ID, name); } public static String getVersion() { From 2262cc59529e1c785969826c2c46bfaaf796bc9d Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 00:37:25 +0100 Subject: [PATCH 05/51] Ported config. --- .../totemofreviving/TotemOfReviving.java | 6 ++-- .../micle/totemofreviving/proxy/Proxy.java | 13 +++++---- .../micle/totemofreviving/setup/Config.java | 28 +++++++++---------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java index 69b1821..4ae6bda 100644 --- a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java +++ b/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java @@ -18,10 +18,10 @@ public final class TotemOfReviving { private static IProxy proxy; - public TotemOfReviving(IEventBus modEventBus) { + public TotemOfReviving(IEventBus modEventBus, ModContainer modContainer) { proxy = FMLEnvironment.dist == Dist.CLIENT - ? new Proxy.Client(modEventBus) - : new Proxy.Server(modEventBus); + ? new Proxy.Client(modEventBus, modContainer) + : new Proxy.Server(modEventBus, modContainer); } public static ResourceLocation createResourceLocation(String name) { diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java index 939677d..fc60fdf 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; import net.neoforged.fml.event.lifecycle.*; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.AddReloadListenerEvent; @@ -21,10 +22,10 @@ public class Proxy implements IProxy { private static MinecraftServer server = null; // Common setup - public Proxy(IEventBus modEventBus) { + public Proxy(IEventBus modEventBus, ModContainer modContainer) { // Initialize setup Registration.register(); - Config.init(); + Config.init(modContainer); NetworkManager.init(); // Register mod event bus listeners @@ -71,8 +72,8 @@ public class Proxy implements IProxy { // Client setup public static class Client extends Proxy { - public Client(IEventBus modEventBus) { - super(modEventBus); + public Client(IEventBus modEventBus, ModContainer modContainer) { + super(modEventBus, modContainer); // Register mod event bus listeners modEventBus.addListener(Client::setup); modEventBus.addListener(Client::postSetup); @@ -97,8 +98,8 @@ public class Proxy implements IProxy { // Server setup public static class Server extends Proxy { - public Server(IEventBus modEventBus) { - super(modEventBus); + public Server(IEventBus modEventBus, ModContainer modContainer) { + super(modEventBus, modContainer); // Register mod event bus listeners modEventBus.addListener(Server::setup); } diff --git a/src/main/java/dev/micle/totemofreviving/setup/Config.java b/src/main/java/dev/micle/totemofreviving/setup/Config.java index 9be35c4..9c19840 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/Config.java +++ b/src/main/java/dev/micle/totemofreviving/setup/Config.java @@ -4,17 +4,17 @@ import dev.micle.totemofreviving.item.totem.DiamondTotemItem; import dev.micle.totemofreviving.item.totem.IronTotemItem; import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; import dev.micle.totemofreviving.item.totem.StrawTotemItem; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.config.ModConfig; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.neoforge.common.ModConfigSpec; public final class Config { - public static void init() { - ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Server.SPEC); + public static void init(ModContainer modContainer) { + modContainer.registerConfig(ModConfig.Type.SERVER, Server.SPEC); } public static class Server { - private static final ForgeConfigSpec SPEC; + private static final ModConfigSpec SPEC; private static final TotemConfig STRAW_TOTEM_CONFIG; private static final TotemConfig IRON_TOTEM_CONFIG; @@ -22,7 +22,7 @@ public final class Config { private static final TotemConfig NETHERITE_TOTEM_CONFIG; static { - ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); builder.comment("WHEN MAKING CHANGES IT IS RECOMMENDED TO NOT BE IN A WORLD.\n" + "CHANGES WILL MOST LIKELY REQUIRE A RESTART FOR EVERYTHING TO WORK PROPERLY."); @@ -45,14 +45,14 @@ public final class Config { } public static class TotemConfig { - private final ForgeConfigSpec.IntValue CHARGE_COST; - private final ForgeConfigSpec.IntValue CHARGE_COST_LIMIT; - private final ForgeConfigSpec.DoubleValue CHARGE_COST_MULTIPLIER; - private final ForgeConfigSpec.BooleanValue CAN_REVIVE_MORE_EXPENSIVE_TARGETS; - private final ForgeConfigSpec.BooleanValue CAN_REVIVE_ACROSS_DIMENSIONS; - private final ForgeConfigSpec.IntValue DURABILITY; + private final ModConfigSpec.IntValue CHARGE_COST; + private final ModConfigSpec.IntValue CHARGE_COST_LIMIT; + private final ModConfigSpec.DoubleValue CHARGE_COST_MULTIPLIER; + private final ModConfigSpec.BooleanValue CAN_REVIVE_MORE_EXPENSIVE_TARGETS; + private final ModConfigSpec.BooleanValue CAN_REVIVE_ACROSS_DIMENSIONS; + private final ModConfigSpec.IntValue DURABILITY; - public TotemConfig(ForgeConfigSpec.Builder builder, String name, int chargeCost, + public TotemConfig(ModConfigSpec.Builder builder, String name, int chargeCost, int chargeCostLimit, double chargeCostMultiplier, boolean canReviveMoreExpensiveTargets, boolean canReviveAcrossDimensions, int durability) { builder.push(name); From e8b0b1987be356e68b8a7ca01e28a4ef9c833eeb Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 00:38:33 +0100 Subject: [PATCH 06/51] Removed old metadata. --- src/main/resources/META-INF/neoforge.mods.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 21a32d1..36e0af6 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -12,7 +12,6 @@ displayName = "${mod_name}" logoFile="logo.jpg" #credits="" authors="${mod_authors}" -displayTest="MATCH_VERSION" # MATCH_VERSION, IGNORE_SERVER_VERSION (server only), IGNORE_ALL_VERSION (client only), NONE (IExtensionPoint.DisplayTest) description = '''${mod_description}''' #[[mixins]] From 2bfe6b72e543317cb8398a22aa4432b2f92a6202 Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 00:45:40 +0100 Subject: [PATCH 07/51] Ported registers. --- .../dev/micle/totemofreviving/proxy/Proxy.java | 2 +- .../setup/ModCreativeModeTabs.java | 4 ++-- .../micle/totemofreviving/setup/ModItems.java | 18 +++++++++--------- .../totemofreviving/setup/Registration.java | 15 +++++---------- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java index fc60fdf..a73b6a5 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java @@ -24,7 +24,7 @@ public class Proxy implements IProxy { // Common setup public Proxy(IEventBus modEventBus, ModContainer modContainer) { // Initialize setup - Registration.register(); + Registration.register(modEventBus); Config.init(modContainer); NetworkManager.init(); diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java b/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java index 045d75d..b3f96f2 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java +++ b/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java @@ -3,10 +3,10 @@ package dev.micle.totemofreviving.setup; import dev.micle.totemofreviving.TotemOfReviving; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; public class ModCreativeModeTabs { - public static RegistryObject MAIN = Registration.CREATIVE_MODE_TABS.register("main", + public static DeferredHolder MAIN = Registration.CREATIVE_MODE_TABS.register("main", () -> CreativeModeTab.builder() .title(Component.translatable(String.format("itemGroup.%s.main", TotemOfReviving.MOD_ID))) .icon(ModItems.STRAW_TOTEM.get()::getDefaultInstance) diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModItems.java b/src/main/java/dev/micle/totemofreviving/setup/ModItems.java index 2cdcdc4..4374708 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModItems.java +++ b/src/main/java/dev/micle/totemofreviving/setup/ModItems.java @@ -9,18 +9,18 @@ import dev.micle.totemofreviving.item.totem.IronTotemItem; import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; import dev.micle.totemofreviving.item.totem.StrawTotemItem; import net.minecraft.world.item.Item; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredItem; public class ModItems { - public static RegistryObject STRAW_TOTEM = Registration.ITEMS.register(StrawTotemItem.getName(), StrawTotemItem::new); - public static RegistryObject IRON_TOTEM = Registration.ITEMS.register(IronTotemItem.getName(), IronTotemItem::new); - public static RegistryObject DIAMOND_TOTEM = Registration.ITEMS.register(DiamondTotemItem.getName(), DiamondTotemItem::new); - public static RegistryObject NETHERITE_TOTEM = Registration.ITEMS.register(NetheriteTotemItem.getName(), NetheriteTotemItem::new); + public static DeferredItem STRAW_TOTEM = Registration.ITEMS.register(StrawTotemItem.getName(), StrawTotemItem::new); + public static DeferredItem IRON_TOTEM = Registration.ITEMS.register(IronTotemItem.getName(), IronTotemItem::new); + public static DeferredItem DIAMOND_TOTEM = Registration.ITEMS.register(DiamondTotemItem.getName(), DiamondTotemItem::new); + public static DeferredItem NETHERITE_TOTEM = Registration.ITEMS.register(NetheriteTotemItem.getName(), NetheriteTotemItem::new); - public static RegistryObject STRAW_CHARGE = Registration.ITEMS.register(StrawChargeItem.getName(), StrawChargeItem::new); - public static RegistryObject IRON_CHARGE = Registration.ITEMS.register(IronChargeItem.getName(), IronChargeItem::new); - public static RegistryObject DIAMOND_CHARGE = Registration.ITEMS.register(DiamondChargeItem.getName(), DiamondChargeItem::new); - public static RegistryObject NETHERITE_CHARGE = Registration.ITEMS.register(NetheriteChargeItem.getName(), NetheriteChargeItem::new); + public static DeferredItem STRAW_CHARGE = Registration.ITEMS.register(StrawChargeItem.getName(), StrawChargeItem::new); + public static DeferredItem IRON_CHARGE = Registration.ITEMS.register(IronChargeItem.getName(), IronChargeItem::new); + public static DeferredItem DIAMOND_CHARGE = Registration.ITEMS.register(DiamondChargeItem.getName(), DiamondChargeItem::new); + public static DeferredItem NETHERITE_CHARGE = Registration.ITEMS.register(NetheriteChargeItem.getName(), NetheriteChargeItem::new); public static void register() {} } diff --git a/src/main/java/dev/micle/totemofreviving/setup/Registration.java b/src/main/java/dev/micle/totemofreviving/setup/Registration.java index 0940c46..e0ea4b1 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/Registration.java +++ b/src/main/java/dev/micle/totemofreviving/setup/Registration.java @@ -3,23 +3,18 @@ package dev.micle.totemofreviving.setup; import dev.micle.totemofreviving.TotemOfReviving; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; public class Registration { // Initialize variables - public static final DeferredRegister ITEMS = - DeferredRegister.create(ForgeRegistries.ITEMS, TotemOfReviving.MOD_ID); + public static final DeferredRegister.Items ITEMS = + DeferredRegister.createItems(TotemOfReviving.MOD_ID); public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, TotemOfReviving.MOD_ID); - public static void register() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - + public static void register(IEventBus modEventBus) { ITEMS.register(modEventBus); ModItems.register(); From 2f1a9793a3d08bfa132d96853f93325e3c4ac1ac Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 01:01:53 +0100 Subject: [PATCH 08/51] Ported datagens. --- .../micle/totemofreviving/data/DataGenerators.java | 13 ++++++------- .../totemofreviving/data/ModRecipeProvider.java | 14 ++++++++------ .../data/client/ModItemModelProvider.java | 8 ++++---- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java b/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java index 1d7607a..0117288 100644 --- a/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java +++ b/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java @@ -1,14 +1,13 @@ package dev.micle.totemofreviving.data; -import dev.micle.totemofreviving.TotemOfReviving; import dev.micle.totemofreviving.data.client.ModItemModelProvider; import net.minecraft.data.DataGenerator; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.data.event.GatherDataEvent; -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.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; -@Mod.EventBusSubscriber(modid = TotemOfReviving.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber public class DataGenerators { @SubscribeEvent public static void gatherData(GatherDataEvent event) { @@ -17,6 +16,6 @@ public class DataGenerators { generator.addProvider(event.includeServer(), new ModItemModelProvider(generator, existingFileHelper)); - generator.addProvider(event.includeServer(), new ModRecipeProvider(generator)); + generator.addProvider(event.includeServer(), new ModRecipeProvider(generator.getPackOutput(), event.getLookupProvider())); } } diff --git a/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java b/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java index 7596f8f..a41de69 100644 --- a/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java +++ b/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java @@ -1,24 +1,26 @@ package dev.micle.totemofreviving.data; import dev.micle.totemofreviving.setup.ModItems; +import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.FinishedRecipe; +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.Items; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.function.Consumer; +import java.util.concurrent.CompletableFuture; public class ModRecipeProvider extends RecipeProvider { - public ModRecipeProvider(DataGenerator generator) { - super(generator.getPackOutput()); + public ModRecipeProvider(PackOutput packOutput, CompletableFuture registries) { + super(packOutput, registries); } - @Override @ParametersAreNonnullByDefault - protected void buildRecipes(Consumer consumer) { + @Override + protected void buildRecipes(RecipeOutput consumer) { ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, ModItems.STRAW_TOTEM.get()) .define('W', Items.WHEAT) .define('|', Items.STICK) diff --git a/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java b/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java index e0f0c86..14710e2 100644 --- a/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java +++ b/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java @@ -10,10 +10,10 @@ import dev.micle.totemofreviving.item.totem.IronTotemItem; import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; import dev.micle.totemofreviving.item.totem.StrawTotemItem; import net.minecraft.data.DataGenerator; -import net.minecraftforge.client.model.generators.ItemModelBuilder; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.client.model.generators.ItemModelBuilder; +import net.neoforged.neoforge.client.model.generators.ItemModelProvider; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.common.data.ExistingFileHelper; public class ModItemModelProvider extends ItemModelProvider { public ModItemModelProvider(DataGenerator generator, ExistingFileHelper existingFileHelper) { From f6e47d78e1bdccca0321168f0c2cad0fd6306105 Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:01:09 +0100 Subject: [PATCH 09/51] WIP: Creating DataComponent for totem items. --- .../totemofreviving/component/TotemData.java | 49 +++++++++++++++++++ .../totemofreviving/item/totem/TotemItem.java | 29 ++++++++--- .../setup/ModDataComponents.java | 16 ++++++ .../totemofreviving/setup/Registration.java | 7 +++ 4 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 src/main/java/dev/micle/totemofreviving/component/TotemData.java create mode 100644 src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java new file mode 100644 index 0000000..a266a1e --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -0,0 +1,49 @@ +package dev.micle.totemofreviving.component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.Objects; + +public class TotemData { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex) + ).apply(instance, TotemData::new) + ); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, TotemData::getTargetIndex, + TotemData::new + ); + + private int targetIndex; + + public TotemData(int targetIndex) { + this.targetIndex = targetIndex; + } + + public int getTargetIndex() { + return targetIndex; + } + public void setTargetIndex(int newTargetIndex) { + targetIndex = newTargetIndex; + } + + @Override + public int hashCode() { + return Objects.hash(this.targetIndex); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else { + return obj instanceof TotemData td + && this.targetIndex == td.targetIndex; + } + } +} diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 12d628e..4c5e70f 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -1,12 +1,17 @@ package dev.micle.totemofreviving.item.totem; +import dev.micle.totemofreviving.component.TotemData; import dev.micle.totemofreviving.network.NetworkManager; import dev.micle.totemofreviving.network.client.ChangeTargetPacket; import dev.micle.totemofreviving.network.client.ChargeTotemPacket; import dev.micle.totemofreviving.network.client.ReviveTargetPacket; import dev.micle.totemofreviving.setup.Config; +import dev.micle.totemofreviving.setup.ModDataComponents; import dev.micle.totemofreviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stats; @@ -18,12 +23,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.fml.common.Mod; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; +import java.util.Optional; import java.util.UUID; public abstract class TotemItem extends Item { @@ -38,18 +45,24 @@ public abstract class TotemItem extends Item { } public TotemItem(Rarity rarity, int durability) { - super(new Properties().stacksTo(1).rarity(rarity).defaultDurability(durability)); + super(new Properties().stacksTo(1).rarity(rarity).durability(durability)); } public abstract boolean isCharge(ItemStack stack); - + + private static Optional getTotemData(ItemStack stack) { + return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); + } + public static int getTargetIndex(ItemStack stack) { - if (!isTotem(stack)) { return -1; } - return stack.getOrCreateTag().getInt(TAG_TARGET_INDEX); + return getTotemData(stack).map(TotemData::getTargetIndex).orElse(-1); } public static void setTargetIndex(ItemStack stack, int targetIndex) { - if (!isTotem(stack)) { return; } - stack.getOrCreateTag().putInt(TAG_TARGET_INDEX, targetIndex); + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setTargetIndex(targetIndex); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } public static UUID getTargetUUID(ItemStack stack) { diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java b/src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java new file mode 100644 index 0000000..727d3d9 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java @@ -0,0 +1,16 @@ +package dev.micle.totemofreviving.setup; + +import dev.micle.totemofreviving.component.TotemData; +import net.minecraft.core.component.DataComponentType; +import net.neoforged.neoforge.registries.DeferredHolder; + +public class ModDataComponents { + public static final DeferredHolder, DataComponentType> TOTEM_DATA = Registration.DATA_COMPONENTS.registerComponentType( + "basic", + builder -> builder + .persistent(TotemData.CODEC) + .networkSynchronized(TotemData.STREAM_CODEC) + ); + + public static void register() {} +} diff --git a/src/main/java/dev/micle/totemofreviving/setup/Registration.java b/src/main/java/dev/micle/totemofreviving/setup/Registration.java index e0ea4b1..71b951a 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/Registration.java +++ b/src/main/java/dev/micle/totemofreviving/setup/Registration.java @@ -1,6 +1,7 @@ package dev.micle.totemofreviving.setup; import dev.micle.totemofreviving.TotemOfReviving; +import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.CreativeModeTab; import net.neoforged.bus.api.IEventBus; @@ -8,6 +9,9 @@ import net.neoforged.neoforge.registries.DeferredRegister; public class Registration { // Initialize variables + public static final DeferredRegister.DataComponents DATA_COMPONENTS = + DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, TotemOfReviving.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(TotemOfReviving.MOD_ID); @@ -15,6 +19,9 @@ public class Registration { DeferredRegister.create(Registries.CREATIVE_MODE_TAB, TotemOfReviving.MOD_ID); public static void register(IEventBus modEventBus) { + DATA_COMPONENTS.register(modEventBus); + ModDataComponents.register(); + ITEMS.register(modEventBus); ModItems.register(); From 7421a5a18d055edc24054286ca527c250994988e Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:14:49 +0100 Subject: [PATCH 10/51] WIP: Included target UUID in data component. --- .../totemofreviving/component/TotemData.java | 20 ++++++++++--- .../totemofreviving/item/totem/TotemItem.java | 30 +++++++++---------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java index a266a1e..541212b 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -11,18 +11,22 @@ import java.util.Objects; public class TotemData { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex) + Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex), + Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID) ).apply(instance, TotemData::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, TotemData::getTargetIndex, + ByteBufCodecs.STRING_UTF8, TotemData::getTargetUUID, TotemData::new ); private int targetIndex; + private String targetUUID; - public TotemData(int targetIndex) { + public TotemData(int targetIndex, String targetUUID) { this.targetIndex = targetIndex; + this.targetUUID = targetUUID; } public int getTargetIndex() { @@ -32,9 +36,16 @@ public class TotemData { targetIndex = newTargetIndex; } + public String getTargetUUID() { + return targetUUID; + } + public void setTargetUUID(String newTargetUUID) { + targetUUID = newTargetUUID; + } + @Override public int hashCode() { - return Objects.hash(this.targetIndex); + return Objects.hash(this.targetIndex, this.targetUUID); } @Override @@ -43,7 +54,8 @@ public class TotemData { return true; } else { return obj instanceof TotemData td - && this.targetIndex == td.targetIndex; + && this.targetIndex == td.targetIndex + && Objects.equals(this.targetUUID, td.targetUUID); } } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 4c5e70f..3f0d89f 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -50,12 +50,9 @@ public abstract class TotemItem extends Item { public abstract boolean isCharge(ItemStack stack); - private static Optional getTotemData(ItemStack stack) { - return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); - } - - public static int getTargetIndex(ItemStack stack) { - return getTotemData(stack).map(TotemData::getTargetIndex).orElse(-1); + @Nullable + public static Integer getTargetIndex(ItemStack stack) { + return getTotemData(stack).map(TotemData::getTargetIndex).orElse(null); } public static void setTargetIndex(ItemStack stack, int targetIndex) { Optional data = getTotemData(stack); @@ -64,18 +61,17 @@ public abstract class TotemItem extends Item { data.get().setTargetIndex(targetIndex); stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - + + @Nullable public static UUID getTargetUUID(ItemStack stack) { - if (!isTotem(stack)) { return null; } - try { - return UUID.fromString(stack.getOrCreateTag().getString(TAG_TARGET_UUID)); - } catch (IllegalArgumentException exception) { - return null; - } + return getTotemData(stack).map(totemData -> UUID.fromString(totemData.getTargetUUID())).orElse(null); } public static void setTargetUUID(ItemStack stack, UUID targetUUID) { - if (!isTotem(stack)) { return; } - stack.getOrCreateTag().putString(TAG_TARGET_UUID, targetUUID.toString()); + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setTargetUUID(targetUUID.toString()); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } public static String getTargetName(ItemStack stack) { @@ -249,6 +245,10 @@ public abstract class TotemItem extends Item { private static boolean isTotem(ItemStack stack) { return (stack.getItem() instanceof TotemItem); } + + private static Optional getTotemData(ItemStack stack) { + return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); + } private static Config.TotemConfig getConfig(ItemStack stack) { Item item = stack.getItem(); From 91f3f9dbdd46033517211385ef99160d4866fdde Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:20:04 +0100 Subject: [PATCH 11/51] WIP: Included target name in data component. --- .../totemofreviving/component/TotemData.java | 22 ++++++++++++++----- .../totemofreviving/item/totem/TotemItem.java | 13 ++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java index 541212b..b443b6f 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -12,19 +12,22 @@ public class TotemData { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex), - Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID) + Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID), + Codec.STRING.fieldOf("targetName").forGetter(TotemData::getTargetName) ).apply(instance, TotemData::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, TotemData::getTargetIndex, ByteBufCodecs.STRING_UTF8, TotemData::getTargetUUID, + ByteBufCodecs.STRING_UTF8, TotemData::getTargetName, TotemData::new ); private int targetIndex; private String targetUUID; + private String targetName; - public TotemData(int targetIndex, String targetUUID) { + public TotemData(int targetIndex, String targetUUID, String targetName) { this.targetIndex = targetIndex; this.targetUUID = targetUUID; } @@ -32,15 +35,22 @@ public class TotemData { public int getTargetIndex() { return targetIndex; } - public void setTargetIndex(int newTargetIndex) { - targetIndex = newTargetIndex; + public void setTargetIndex(int targetIndex) { + this.targetIndex = targetIndex; } public String getTargetUUID() { return targetUUID; } - public void setTargetUUID(String newTargetUUID) { - targetUUID = newTargetUUID; + public void setTargetUUID(String targetUUID) { + this.targetUUID = targetUUID; + } + + public String getTargetName() { + return targetName; + } + public void setTargetName(String targetName) { + this.targetName = targetName; } @Override diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 3f0d89f..1acc179 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -73,14 +73,17 @@ public abstract class TotemItem extends Item { data.get().setTargetUUID(targetUUID.toString()); stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - + + @Nullable public static String getTargetName(ItemStack stack) { - if (!isTotem(stack)) { return null; } - return stack.getOrCreateTag().getString(TAG_TARGET_NAME); + return getTotemData(stack).map(TotemData::getTargetName).orElse(null); } public static void setTargetName(ItemStack stack, String targetName) { - if (!isTotem(stack)) { return; } - stack.getOrCreateTag().putString(TAG_TARGET_NAME, targetName); + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setTargetName(targetName); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } public static int getTargetCost(ItemStack stack) { From 56f274a81bce16e2046c687d5788c3bf57adb401 Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:26:42 +0100 Subject: [PATCH 12/51] WIP: Included target deaths in data component. --- .../totemofreviving/component/TotemData.java | 22 +++++++++++++++---- .../totemofreviving/item/totem/TotemItem.java | 15 ++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java index b443b6f..22c6854 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -13,23 +13,28 @@ public class TotemData { instance.group( Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex), Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID), - Codec.STRING.fieldOf("targetName").forGetter(TotemData::getTargetName) + Codec.STRING.fieldOf("targetName").forGetter(TotemData::getTargetName), + Codec.INT.fieldOf("targetDeaths").forGetter(TotemData::getTargetDeaths) ).apply(instance, TotemData::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, TotemData::getTargetIndex, ByteBufCodecs.STRING_UTF8, TotemData::getTargetUUID, ByteBufCodecs.STRING_UTF8, TotemData::getTargetName, + ByteBufCodecs.INT, TotemData::getTargetDeaths, TotemData::new ); private int targetIndex; private String targetUUID; private String targetName; + private int targetDeaths; - public TotemData(int targetIndex, String targetUUID, String targetName) { + public TotemData(int targetIndex, String targetUUID, String targetName, int targetDeaths) { this.targetIndex = targetIndex; this.targetUUID = targetUUID; + this.targetName = targetName; + this.targetDeaths = targetDeaths; } public int getTargetIndex() { @@ -53,9 +58,16 @@ public class TotemData { this.targetName = targetName; } + public int getTargetDeaths() { + return targetDeaths; + } + public void setTargetDeaths(int targetDeaths) { + this.targetDeaths = targetDeaths; + } + @Override public int hashCode() { - return Objects.hash(this.targetIndex, this.targetUUID); + return Objects.hash(this.targetIndex, this.targetUUID, this.targetName, this.targetDeaths); } @Override @@ -65,7 +77,9 @@ public class TotemData { } else { return obj instanceof TotemData td && this.targetIndex == td.targetIndex - && Objects.equals(this.targetUUID, td.targetUUID); + && Objects.equals(this.targetUUID, td.targetUUID) + && Objects.equals(this.targetName, td.targetName) + && this.targetDeaths == td.targetDeaths; } } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 1acc179..3b68809 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -91,14 +91,17 @@ public abstract class TotemItem extends Item { return !isCostDynamic(stack) ? getConfig(stack).getChargeCost() : (int)(getTargetDeaths(stack) * getConfig(stack).getChargeCostMultiplier()); } - - public static int getTargetDeaths(ItemStack stack) { - if (!isTotem(stack)) { return -1; } - return stack.getOrCreateTag().getInt(TAG_TARGET_DEATHS); + + @Nullable + public static Integer getTargetDeaths(ItemStack stack) { + return getTotemData(stack).map(TotemData::getTargetDeaths).orElse(null); } public static void setTargetDeaths(ItemStack stack, ServerPlayer target) { - if (!isTotem(stack)) { return; } - stack.getOrCreateTag().putInt(TAG_TARGET_DEATHS, target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } public static boolean isTotemFull(ItemStack stack) { From f41bead3d247f6b0a694e28425eb6fa2f759f73e Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:40:01 +0100 Subject: [PATCH 13/51] Included charge in totem data. --- .../totemofreviving/component/TotemData.java | 20 +++++++++--- .../totemofreviving/item/totem/TotemItem.java | 31 ++++++------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java index 22c6854..4164405 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -14,7 +14,8 @@ public class TotemData { Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex), Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID), Codec.STRING.fieldOf("targetName").forGetter(TotemData::getTargetName), - Codec.INT.fieldOf("targetDeaths").forGetter(TotemData::getTargetDeaths) + Codec.INT.fieldOf("targetDeaths").forGetter(TotemData::getTargetDeaths), + Codec.INT.fieldOf("charge").forGetter(TotemData::getCharge) ).apply(instance, TotemData::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( @@ -22,6 +23,7 @@ public class TotemData { ByteBufCodecs.STRING_UTF8, TotemData::getTargetUUID, ByteBufCodecs.STRING_UTF8, TotemData::getTargetName, ByteBufCodecs.INT, TotemData::getTargetDeaths, + ByteBufCodecs.INT, TotemData::getCharge, TotemData::new ); @@ -29,12 +31,14 @@ public class TotemData { private String targetUUID; private String targetName; private int targetDeaths; + private int charge; - public TotemData(int targetIndex, String targetUUID, String targetName, int targetDeaths) { + public TotemData(int targetIndex, String targetUUID, String targetName, int targetDeaths, int charge) { this.targetIndex = targetIndex; this.targetUUID = targetUUID; this.targetName = targetName; this.targetDeaths = targetDeaths; + this.charge = charge; } public int getTargetIndex() { @@ -65,9 +69,16 @@ public class TotemData { this.targetDeaths = targetDeaths; } + public int getCharge() { + return charge; + } + public void setCharge(int charge) { + this.charge = charge; + } + @Override public int hashCode() { - return Objects.hash(this.targetIndex, this.targetUUID, this.targetName, this.targetDeaths); + return Objects.hash(this.targetIndex, this.targetUUID, this.targetName, this.targetDeaths, this.charge); } @Override @@ -79,7 +90,8 @@ public class TotemData { && this.targetIndex == td.targetIndex && Objects.equals(this.targetUUID, td.targetUUID) && Objects.equals(this.targetName, td.targetName) - && this.targetDeaths == td.targetDeaths; + && this.targetDeaths == td.targetDeaths + && this.charge == td.charge; } } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 3b68809..36b3bc8 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -9,9 +9,6 @@ import dev.micle.totemofreviving.setup.Config; import dev.micle.totemofreviving.setup.ModDataComponents; import dev.micle.totemofreviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.core.component.DataComponents; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.stats.Stats; @@ -25,7 +22,6 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.fml.common.Mod; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -34,12 +30,6 @@ import java.util.Optional; import java.util.UUID; public abstract class TotemItem extends Item { - private static final String TAG_TARGET_INDEX = "target_index"; - private static final String TAG_TARGET_UUID = "target_uuid"; - private static final String TAG_TARGET_NAME = "target_name"; - private static final String TAG_TARGET_DEATHS = "target_deaths"; - private static final String TAG_CHARGE = "charge"; - public TotemItem(int durability) { this(Rarity.COMMON, durability); } @@ -119,20 +109,17 @@ public abstract class TotemItem extends Item { } return true; } - - public static int getCharge(ItemStack stack) { - if (!isTotem(stack)) { return -1; } - int charge = stack.getOrCreateTag().getInt(TAG_CHARGE); - int maxCharge = getMaxCharge(stack); - if (charge > maxCharge) { - charge = maxCharge; - setCharge(stack, charge); - } - return charge; + + @Nullable + public static Integer getCharge(ItemStack stack) { + return getTotemData(stack).map(TotemData::getCharge).orElse(null); } public static void setCharge(ItemStack stack, int charge) { - if (!isTotem(stack)) { return; } - stack.getOrCreateTag().putInt(TAG_CHARGE, charge); + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setCharge(charge); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } public static int getMaxCharge(ItemStack stack) { From 39f8544e088dc7a4c9d04812ac487d11f5d13d8d Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 05:55:38 +0100 Subject: [PATCH 14/51] WIP: Converting methods to utilize Optionals. --- .../totemofreviving/item/totem/TotemItem.java | 59 +++++++++---------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 36b3bc8..eb13ccd 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -40,9 +40,8 @@ public abstract class TotemItem extends Item { public abstract boolean isCharge(ItemStack stack); - @Nullable - public static Integer getTargetIndex(ItemStack stack) { - return getTotemData(stack).map(TotemData::getTargetIndex).orElse(null); + public static Optional getTargetIndex(ItemStack stack) { + return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetIndex())); } public static void setTargetIndex(ItemStack stack, int targetIndex) { Optional data = getTotemData(stack); @@ -52,9 +51,8 @@ public abstract class TotemItem extends Item { stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - @Nullable - public static UUID getTargetUUID(ItemStack stack) { - return getTotemData(stack).map(totemData -> UUID.fromString(totemData.getTargetUUID())).orElse(null); + public static Optional getTargetUUID(ItemStack stack) { + return getTotemData(stack).flatMap(totemData -> Optional.of(UUID.fromString(totemData.getTargetUUID()))); } public static void setTargetUUID(ItemStack stack, UUID targetUUID) { Optional data = getTotemData(stack); @@ -64,9 +62,8 @@ public abstract class TotemItem extends Item { stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - @Nullable - public static String getTargetName(ItemStack stack) { - return getTotemData(stack).map(TotemData::getTargetName).orElse(null); + public static Optional getTargetName(ItemStack stack) { + return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetName())); } public static void setTargetName(ItemStack stack, String targetName) { Optional data = getTotemData(stack); @@ -75,16 +72,9 @@ public abstract class TotemItem extends Item { data.get().setTargetName(targetName); stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - - public static int getTargetCost(ItemStack stack) { - if (!isTotem(stack)) { return -1; } - return !isCostDynamic(stack) ? getConfig(stack).getChargeCost() : - (int)(getTargetDeaths(stack) * getConfig(stack).getChargeCostMultiplier()); - } - @Nullable - public static Integer getTargetDeaths(ItemStack stack) { - return getTotemData(stack).map(TotemData::getTargetDeaths).orElse(null); + public static Optional getTargetDeaths(ItemStack stack) { + return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetDeaths())); } public static void setTargetDeaths(ItemStack stack, ServerPlayer target) { Optional data = getTotemData(stack); @@ -93,12 +83,29 @@ public abstract class TotemItem extends Item { data.get().setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - + + public static Optional getCharge(ItemStack stack) { + return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getCharge())); + } + public static void setCharge(ItemStack stack, int charge) { + Optional data = getTotemData(stack); + if (data.isEmpty()) { return; } + + data.get().setCharge(charge); + stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + } + + public static int getTargetCost(ItemStack stack) { + if (!isTotem(stack)) { return -1; } + return !isCostDynamic(stack) ? getConfig(stack).getChargeCost() : + (int)(getTargetDeaths(stack) * getConfig(stack).getChargeCostMultiplier()); + } + public static boolean isTotemFull(ItemStack stack) { if (!isTotem(stack)) { return false; } return getCharge(stack) == getMaxCharge(stack); } - + public static boolean canTotemAffordTarget(ItemStack stack) { if (!isTotem(stack)) { return false; } if (getCharge(stack) < getTargetCost(stack)) { @@ -109,18 +116,6 @@ public abstract class TotemItem extends Item { } return true; } - - @Nullable - public static Integer getCharge(ItemStack stack) { - return getTotemData(stack).map(TotemData::getCharge).orElse(null); - } - public static void setCharge(ItemStack stack, int charge) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } - - data.get().setCharge(charge); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); - } public static int getMaxCharge(ItemStack stack) { Config.TotemConfig config = getConfig(stack); From b400f4334a596321ed12a7b76713ffd551a1bd33 Mon Sep 17 00:00:00 2001 From: micle Date: Fri, 9 Jan 2026 07:05:33 +0100 Subject: [PATCH 15/51] WIP: Logic cleanup. --- .../totemofreviving/item/totem/TotemItem.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index eb13ccd..e54eb5a 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -38,6 +38,10 @@ public abstract class TotemItem extends Item { super(new Properties().stacksTo(1).rarity(rarity).durability(durability)); } + public static boolean isTotem(ItemStack stack) { + return (stack.getItem() instanceof TotemItem); + } + public abstract boolean isCharge(ItemStack stack); public static Optional getTargetIndex(ItemStack stack) { @@ -95,51 +99,64 @@ public abstract class TotemItem extends Item { stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); } - public static int getTargetCost(ItemStack stack) { - if (!isTotem(stack)) { return -1; } - return !isCostDynamic(stack) ? getConfig(stack).getChargeCost() : - (int)(getTargetDeaths(stack) * getConfig(stack).getChargeCostMultiplier()); + public static Optional getTargetCost(ItemStack stack) { + Optional config = getConfig(stack); + Optional targetDeaths = getTargetDeaths(stack); + if (config.isEmpty() || targetDeaths.isEmpty()) { return Optional.empty(); } + + return Optional.of( + config.get().getChargeCost() != -1 + ? config.get().getChargeCost() + : (int)(targetDeaths.get() * config.get().getChargeCostMultiplier()) + ); } - public static boolean isTotemFull(ItemStack stack) { - if (!isTotem(stack)) { return false; } - return getCharge(stack) == getMaxCharge(stack); + public static Optional getMaxCharge(ItemStack stack) { + return getConfig(stack).map(totemConfig -> totemConfig.getChargeCost() == -1 + ? totemConfig.getChargeCostLimit() + : totemConfig.getChargeCost() + ); } - public static boolean canTotemAffordTarget(ItemStack stack) { - if (!isTotem(stack)) { return false; } - if (getCharge(stack) < getTargetCost(stack)) { - if (!isTotemFull(stack)) { - return false; - } - return isTotemFull(stack) && canReviveMoreExpensiveTargets(stack); - } - return true; + public static Optional isTotemFull(ItemStack stack) { + Optional config = getConfig(stack); + Optional charge = getCharge(stack); + Optional maxCharge = getMaxCharge(stack); + if (config.isEmpty() || charge.isEmpty() || maxCharge.isEmpty()) { return Optional.empty(); } + + return Optional.of(charge.get().equals(maxCharge.get())); + } + + public static Optional canTotemAffordTarget(ItemStack stack) { + Optional charge = getCharge(stack); + Optional targetCost = getTargetCost(stack); + Optional isTotemFull = isTotemFull(stack); + Optional canReviveMoreExpensiveTargets = canReviveMoreExpensiveTargets(stack); + if (charge.isEmpty() || targetCost.isEmpty() || isTotemFull.isEmpty() || canReviveMoreExpensiveTargets.isEmpty()) { return Optional.empty(); } + + return Optional.of(charge.get() >= targetCost.get() || (isTotemFull.get() && canReviveMoreExpensiveTargets.get())); } - public static int getMaxCharge(ItemStack stack) { - Config.TotemConfig config = getConfig(stack); - if (config == null) { return -1; } - - if (config.getChargeCost() == -1) { - return config.getChargeCostLimit(); - } - return config.getChargeCost(); + public static Optional canReviveAcrossDimensions(ItemStack stack) { + return getConfig(stack).map(Config.TotemConfig::getCanReviveAcrossDimensions); + } + + public static Optional canReviveMoreExpensiveTargets(ItemStack stack) { + return getConfig(stack).map(Config.TotemConfig::getCanReviveMoreExpensiveTargets); } - - public static boolean isCostDynamic(ItemStack stack) { - if (!isTotem(stack)) { return false; } - return getConfig(stack).getChargeCost() == -1; + + private static Optional getTotemData(ItemStack stack) { + return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); } - - public static boolean canReviveAcrossDimensions(ItemStack stack) { - if (!isTotem(stack)) { return false; } - return getConfig(stack).getCanReviveAcrossDimensions(); - } - - public static boolean canReviveMoreExpensiveTargets(ItemStack stack) { - if (!isTotem(stack)) { return false; } - return getConfig(stack).getCanReviveMoreExpensiveTargets(); + + private static Optional getConfig(ItemStack stack) { + return switch (stack.getItem()) { + case StrawTotemItem ignored -> Optional.of(Config.Server.getStrawTotemConfig()); + case IronTotemItem ignored -> Optional.of(Config.Server.getIronTotemConfig()); + case DiamondTotemItem ignored -> Optional.of(Config.Server.getDiamondTotemConfig()); + case NetheriteTotemItem ignored -> Optional.of(Config.Server.getNetheriteTotemConfig()); + default -> Optional.empty(); + }; } @Override @@ -229,21 +246,4 @@ public abstract class TotemItem extends Item { } return (isDamageable(stack)) ? super.getDamage(stack) : 0; } - - private static boolean isTotem(ItemStack stack) { - return (stack.getItem() instanceof TotemItem); - } - - private static Optional getTotemData(ItemStack stack) { - return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); - } - - private static Config.TotemConfig getConfig(ItemStack stack) { - Item item = stack.getItem(); - if (item instanceof StrawTotemItem) { return Config.Server.getStrawTotemConfig(); } - if (item instanceof IronTotemItem) { return Config.Server.getIronTotemConfig(); } - if (item instanceof DiamondTotemItem) { return Config.Server.getDiamondTotemConfig(); } - if (item instanceof NetheriteTotemItem) { return Config.Server.getNetheriteTotemConfig(); } - return null; - } } From 300e0a940aaaf704576d885df03070b91251b574 Mon Sep 17 00:00:00 2001 From: micle Date: Sat, 10 Jan 2026 19:24:37 +0100 Subject: [PATCH 16/51] Rewrote TotemItem methods to simplify usage and keep functionality within the same class. --- .../totemofreviving/item/totem/TotemItem.java | 216 +++++++++--------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index e54eb5a..378888d 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -10,10 +10,13 @@ import dev.micle.totemofreviving.setup.ModDataComponents; import dev.micle.totemofreviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -25,6 +28,7 @@ import net.neoforged.api.distmarker.OnlyIn; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -38,133 +42,129 @@ public abstract class TotemItem extends Item { super(new Properties().stacksTo(1).rarity(rarity).durability(durability)); } + public abstract boolean isCharge(ItemStack stack); + + public abstract Config.TotemConfig getConfig(); + + private boolean isChargeFull(TotemData totemData) { + return totemData.getCharge() >= getMaxCharge(); + } + + private int getMaxCharge() { + return getConfig().getChargeCost() == -1 + ? getConfig().getChargeCostLimit() + : getConfig().getChargeCost(); + } + + private int getTargetCost(TotemData totemData) { + return getConfig().getChargeCost() != -1 + ? getConfig().getChargeCost() + : (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier()); + } + + private boolean canAffordTarget(TotemData totemData) { + return totemData.getCharge() >= getTargetCost(totemData) || (isChargeFull(totemData) && getConfig().getCanReviveMoreExpensiveTargets()); + } + + private static TotemData getTotemData(ItemStack itemStack) { + return itemStack.getComponents().get(ModDataComponents.TOTEM_DATA.get()); + } + + private static void setTotemData(ItemStack itemStack, TotemData totemData) { + itemStack.set(ModDataComponents.TOTEM_DATA.get(), totemData); + } + public static boolean isTotem(ItemStack stack) { return (stack.getItem() instanceof TotemItem); } - public abstract boolean isCharge(ItemStack stack); + @OnlyIn(Dist.DEDICATED_SERVER) + public static Optional cycleTarget(ItemStack itemStack, PlayerList playerList) { + if (!isTotem(itemStack)) return Optional.empty(); + TotemData totemData = getTotemData(itemStack); - public static Optional getTargetIndex(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetIndex())); - } - public static void setTargetIndex(ItemStack stack, int targetIndex) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + int targetIndex = totemData.getTargetIndex() + 1; + targetIndex = targetIndex > playerList.getPlayerCount() ? 0 : targetIndex; - data.get().setTargetIndex(targetIndex); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + ServerPlayer target = playerList.getPlayers().get(targetIndex); + + totemData.setTargetIndex(targetIndex); + totemData.setTargetUUID(target.getStringUUID()); + totemData.setTargetName(target.getScoreboardName()); + totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + + setTotemData(itemStack, totemData); + return Optional.of(totemData); } - public static Optional getTargetUUID(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(UUID.fromString(totemData.getTargetUUID()))); - } - public static void setTargetUUID(ItemStack stack, UUID targetUUID) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + @OnlyIn(Dist.DEDICATED_SERVER) + public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { + if (!isTotem(totemStack)) return false; + TotemData totemData = getTotemData(totemStack); + TotemItem totemItem = ((TotemItem) totemStack.getItem()); - data.get().setTargetUUID(targetUUID.toString()); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + if (!totemItem.isCharge(chargeStack)) return false; + if (totemItem.isChargeFull(totemData)) return false; + + totemData.setCharge(totemData.getCharge() + 1); + + setTotemData(totemStack, totemData); + chargeStack.setCount(chargeStack.getCount() - 1); + return true; } - public static Optional getTargetName(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetName())); - } - public static void setTargetName(ItemStack stack, String targetName) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + @OnlyIn(Dist.DEDICATED_SERVER) + public static Component reviveTarget(EquipmentSlot slot, ItemStack itemStack, ServerPlayer user, PlayerList playerList) { + if (!isTotem(itemStack)) return Component.empty(); + TotemData totemData = getTotemData(itemStack); + TotemItem totemItem = ((TotemItem) itemStack.getItem()); + Config.TotemConfig config = totemItem.getConfig(); - data.get().setTargetName(targetName); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + ServerPlayer target = playerList.getPlayer(UUID.fromString(totemData.getTargetUUID())); + if (target == null) { + return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); + } + + totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + setTotemData(itemStack, totemData); + + if (!target.isSpectator()) { + return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!"); + } + + try (ServerLevel targetLevel = target.serverLevel()) { + if (!targetLevel.equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { + return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!"); + } + } catch (IOException e) { + return Component.literal(ChatFormatting.WHITE + "Unable to get " + ChatFormatting.GRAY + target.getDisplayName().getString() + "'s " + ChatFormatting.WHITE + " level!"); + } + + if (!totemItem.canAffordTarget(totemData)) { + return Component.literal(ChatFormatting.WHITE + "Not enough charge!"); + } + + try (ServerLevel userLevel = user.serverLevel()) { + target.teleportTo(userLevel, user.position().x, user.position().y, user.position().z, user.getYRot(), user.getXRot()); + target.setGameMode(userLevel.getServer().getDefaultGameType()); + } catch (IOException e) { + return Component.literal(ChatFormatting.WHITE + "Unable to get your level!"); + } + + totemData.setCharge(totemData.getCharge() - totemItem.getTargetCost(totemData)); + + setTotemData(itemStack, totemData); + itemStack.hurtAndBreak(1, user, slot); + + return Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!"); } - public static Optional getTargetDeaths(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetDeaths())); - } - public static void setTargetDeaths(ItemStack stack, ServerPlayer target) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } - - data.get().setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); - } - - public static Optional getCharge(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getCharge())); - } - public static void setCharge(ItemStack stack, int charge) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } - - data.get().setCharge(charge); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); - } - - public static Optional getTargetCost(ItemStack stack) { - Optional config = getConfig(stack); - Optional targetDeaths = getTargetDeaths(stack); - if (config.isEmpty() || targetDeaths.isEmpty()) { return Optional.empty(); } - - return Optional.of( - config.get().getChargeCost() != -1 - ? config.get().getChargeCost() - : (int)(targetDeaths.get() * config.get().getChargeCostMultiplier()) - ); - } - - public static Optional getMaxCharge(ItemStack stack) { - return getConfig(stack).map(totemConfig -> totemConfig.getChargeCost() == -1 - ? totemConfig.getChargeCostLimit() - : totemConfig.getChargeCost() - ); - } - - public static Optional isTotemFull(ItemStack stack) { - Optional config = getConfig(stack); - Optional charge = getCharge(stack); - Optional maxCharge = getMaxCharge(stack); - if (config.isEmpty() || charge.isEmpty() || maxCharge.isEmpty()) { return Optional.empty(); } - - return Optional.of(charge.get().equals(maxCharge.get())); - } - - public static Optional canTotemAffordTarget(ItemStack stack) { - Optional charge = getCharge(stack); - Optional targetCost = getTargetCost(stack); - Optional isTotemFull = isTotemFull(stack); - Optional canReviveMoreExpensiveTargets = canReviveMoreExpensiveTargets(stack); - if (charge.isEmpty() || targetCost.isEmpty() || isTotemFull.isEmpty() || canReviveMoreExpensiveTargets.isEmpty()) { return Optional.empty(); } - - return Optional.of(charge.get() >= targetCost.get() || (isTotemFull.get() && canReviveMoreExpensiveTargets.get())); - } - - public static Optional canReviveAcrossDimensions(ItemStack stack) { - return getConfig(stack).map(Config.TotemConfig::getCanReviveAcrossDimensions); - } - - public static Optional canReviveMoreExpensiveTargets(ItemStack stack) { - return getConfig(stack).map(Config.TotemConfig::getCanReviveMoreExpensiveTargets); - } - - private static Optional getTotemData(ItemStack stack) { - return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); - } - - private static Optional getConfig(ItemStack stack) { - return switch (stack.getItem()) { - case StrawTotemItem ignored -> Optional.of(Config.Server.getStrawTotemConfig()); - case IronTotemItem ignored -> Optional.of(Config.Server.getIronTotemConfig()); - case DiamondTotemItem ignored -> Optional.of(Config.Server.getDiamondTotemConfig()); - case NetheriteTotemItem ignored -> Optional.of(Config.Server.getNetheriteTotemConfig()); - default -> Optional.empty(); - }; - } - @Override @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { if (world == null) { return; } - + UUID targetUUID = getTargetUUID(stack); String targetName = getTargetName(stack); int targetCost = getTargetCost(stack); From af097ffdf5634dd25d69e218f6a14900e6efc0c4 Mon Sep 17 00:00:00 2001 From: micle Date: Sat, 10 Jan 2026 19:27:17 +0100 Subject: [PATCH 17/51] Extracted code into method. --- .../micle/totemofreviving/item/totem/TotemItem.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 378888d..f0cb13e 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -50,16 +50,20 @@ public abstract class TotemItem extends Item { return totemData.getCharge() >= getMaxCharge(); } + private boolean isChargeCostDynamic() { + return getConfig().getChargeCost() == -1; + } + private int getMaxCharge() { - return getConfig().getChargeCost() == -1 + return isChargeCostDynamic() ? getConfig().getChargeCostLimit() : getConfig().getChargeCost(); } private int getTargetCost(TotemData totemData) { - return getConfig().getChargeCost() != -1 - ? getConfig().getChargeCost() - : (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier()); + return isChargeCostDynamic() + ? (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier()) + : getConfig().getChargeCost(); } private boolean canAffordTarget(TotemData totemData) { From 4c6d9b4b148a0a7eb136a8d5572928949504736e Mon Sep 17 00:00:00 2001 From: micle Date: Sat, 10 Jan 2026 19:51:56 +0100 Subject: [PATCH 18/51] Ported totem tooltip. Implemented helpers for getting target UUID from totem data. --- .../totemofreviving/component/TotemData.java | 21 ++++- .../totemofreviving/item/totem/TotemItem.java | 77 ++++++++++--------- 2 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totemofreviving/component/TotemData.java index 4164405..baa02fe 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totemofreviving/component/TotemData.java @@ -7,12 +7,14 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import java.util.Objects; +import java.util.Optional; +import java.util.UUID; public class TotemData { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("targetIndex").forGetter(TotemData::getTargetIndex), - Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetUUID), + Codec.STRING.fieldOf("targetUUID").forGetter(TotemData::getTargetStringUUID), Codec.STRING.fieldOf("targetName").forGetter(TotemData::getTargetName), Codec.INT.fieldOf("targetDeaths").forGetter(TotemData::getTargetDeaths), Codec.INT.fieldOf("charge").forGetter(TotemData::getCharge) @@ -20,7 +22,7 @@ public class TotemData { ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, TotemData::getTargetIndex, - ByteBufCodecs.STRING_UTF8, TotemData::getTargetUUID, + ByteBufCodecs.STRING_UTF8, TotemData::getTargetStringUUID, ByteBufCodecs.STRING_UTF8, TotemData::getTargetName, ByteBufCodecs.INT, TotemData::getTargetDeaths, ByteBufCodecs.INT, TotemData::getCharge, @@ -48,13 +50,24 @@ public class TotemData { this.targetIndex = targetIndex; } - public String getTargetUUID() { + public String getTargetStringUUID() { return targetUUID; } - public void setTargetUUID(String targetUUID) { + public void setTargetStringUUID(String targetUUID) { this.targetUUID = targetUUID; } + public Optional getTargetUUID() { + Optional targetUUID = Optional.empty(); + try { + targetUUID = Optional.of(UUID.fromString(this.targetUUID)); + } catch (IllegalArgumentException ignored) {} + return targetUUID; + } + public void setTargetUUID(UUID targetUUID) { + this.targetUUID = targetUUID.toString(); + } + public String getTargetName() { return targetName; } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index f0cb13e..8d6386b 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -93,7 +93,7 @@ public abstract class TotemItem extends Item { ServerPlayer target = playerList.getPlayers().get(targetIndex); totemData.setTargetIndex(targetIndex); - totemData.setTargetUUID(target.getStringUUID()); + totemData.setTargetUUID(target.getUUID()); totemData.setTargetName(target.getScoreboardName()); totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); @@ -124,7 +124,12 @@ public abstract class TotemItem extends Item { TotemItem totemItem = ((TotemItem) itemStack.getItem()); Config.TotemConfig config = totemItem.getConfig(); - ServerPlayer target = playerList.getPlayer(UUID.fromString(totemData.getTargetUUID())); + Optional targetUUID = totemData.getTargetUUID(); + if (targetUUID.isEmpty()) { + return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); + } + + ServerPlayer target = playerList.getPlayer(targetUUID.get()); if (target == null) { return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); } @@ -164,50 +169,50 @@ public abstract class TotemItem extends Item { } @Override - @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { - if (world == null) { return; } + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + TotemData totemData = getTotemData(stack); - UUID targetUUID = getTargetUUID(stack); - String targetName = getTargetName(stack); - int targetCost = getTargetCost(stack); - int charge = getCharge(stack); - int maxCharge = getMaxCharge(stack); - double multiplier = getConfig(stack).getChargeCostMultiplier(); + Optional targetUUID = totemData.getTargetUUID(); + if (targetUUID.isEmpty()) { + tooltipComponents.add(Component.literal(ChatFormatting.RED + "Target: " + ChatFormatting.DARK_RED + "N/A")); + } else { + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Target: " + ChatFormatting.GRAY + totemData.getTargetName())); + } - if (targetUUID == null) { - tooltip.add(Component.literal(ChatFormatting.RED + "Target: " + ChatFormatting.DARK_RED + "NONE")); + tooltipComponents.add(Component.empty()); + + if (!canAffordTarget(totemData)) { + tooltipComponents.add(Component.literal(ChatFormatting.RED + "Charges: " + ChatFormatting.DARK_RED + "(" + totemData.getCharge() + "/" + getTargetCost(totemData) + ") " + + ChatFormatting.RED + "[Max: " + ChatFormatting.DARK_RED + getMaxCharge() + ChatFormatting.RED + "] [Multi: " + ChatFormatting.DARK_RED + getConfig().getChargeCostMultiplier() + ChatFormatting.RED + "]")); } else { - tooltip.add(Component.literal(ChatFormatting.WHITE + "Target: " + ChatFormatting.GRAY + targetName)); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Charges: " + ChatFormatting.GRAY + "(" + totemData.getCharge() + "/" + getTargetCost(totemData) + ") " + + ChatFormatting.WHITE + "[Max: " + ChatFormatting.GRAY + getMaxCharge() + ChatFormatting.WHITE + "] [Multi: " + ChatFormatting.GRAY + getConfig().getChargeCostMultiplier() + ChatFormatting.WHITE + "]")); } - tooltip.add(Component.literal("")); - if (!canTotemAffordTarget(stack)) { - tooltip.add(Component.literal(ChatFormatting.RED + "Charges: " + ChatFormatting.DARK_RED + "(" + charge + "/" + targetCost + ") " + - ChatFormatting.RED + "[Max: " + ChatFormatting.DARK_RED + maxCharge + ChatFormatting.RED + "] [Multi: " + ChatFormatting.DARK_RED + multiplier + ChatFormatting.RED + "]")); - } else { - tooltip.add(Component.literal(ChatFormatting.WHITE + "Charges: " + ChatFormatting.GRAY + "(" + charge + "/" + targetCost + ") " + - ChatFormatting.WHITE + "[Max: " + ChatFormatting.GRAY + maxCharge + ChatFormatting.WHITE + "] [Multi: " + ChatFormatting.GRAY + multiplier + ChatFormatting.WHITE + "]")); + + if (getConfig().getCanReviveMoreExpensiveTargets()) { + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Can revive more expensive targets.")); } - if (canReviveMoreExpensiveTargets(stack)) { - tooltip.add(Component.literal(ChatFormatting.WHITE + "Can revive more expensive targets.")); + + if (getConfig().getCanReviveAcrossDimensions()) { + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Can revive targets across dimensions.")); } - if (canReviveAcrossDimensions(stack)) { - tooltip.add(Component.literal(ChatFormatting.WHITE + "Can revive targets across dimensions.")); - } - tooltip.add(Component.literal("")); + + tooltipComponents.add(Component.empty()); + if (ModKeyMappings.ADVANCED_TOOLTIP.isDown()) { - tooltip.add(Component.literal(ChatFormatting.GRAY + "Showing advanced tooltip.")); - tooltip.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "R-CLICK" + ChatFormatting.WHITE + "]")); - tooltip.add(Component.literal(ChatFormatting.WHITE + "When second hand is empty: revive target.")); - tooltip.add(Component.literal(ChatFormatting.WHITE + "When second hand is holding a reviving charge: charge totem.")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "L-SHIFT + R-CLICK" + ChatFormatting.WHITE + "]")); - tooltip.add(Component.literal(ChatFormatting.WHITE + "Change target.")); + tooltipComponents.add(Component.literal(ChatFormatting.GRAY + "Showing advanced tooltip.")); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "R-CLICK" + ChatFormatting.WHITE + "]")); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "When second hand is empty: revive target.")); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "When second hand is holding a reviving charge: charge totem.")); + tooltipComponents.add(Component.literal("")); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "L-SHIFT + R-CLICK" + ChatFormatting.WHITE + "]")); + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Change target.")); } else { - tooltip.add(Component.literal(ChatFormatting.GRAY + "Hold [" + ChatFormatting.DARK_GRAY + "L-SHIFT" + ChatFormatting.GRAY + "] for advanced tooltip.")); + tooltipComponents.add(Component.literal(ChatFormatting.GRAY + "Hold [" + ChatFormatting.DARK_GRAY + "L-SHIFT" + ChatFormatting.GRAY + "] for advanced tooltip.")); } - super.appendHoverText(stack, world, tooltip, tooltipFlag); + + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); } @Override From 0f35787a53452e4eeeea161b31421d7cdb4c5e84 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 00:00:30 +0100 Subject: [PATCH 19/51] WIP use method. Fixed remaining methods. --- .../totemofreviving/item/totem/TotemItem.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index 8d6386b..c468756 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -1,10 +1,6 @@ package dev.micle.totemofreviving.item.totem; import dev.micle.totemofreviving.component.TotemData; -import dev.micle.totemofreviving.network.NetworkManager; -import dev.micle.totemofreviving.network.client.ChangeTargetPacket; -import dev.micle.totemofreviving.network.client.ChargeTotemPacket; -import dev.micle.totemofreviving.network.client.ReviveTargetPacket; import dev.micle.totemofreviving.setup.Config; import dev.micle.totemofreviving.setup.ModDataComponents; import dev.micle.totemofreviving.setup.ModKeyMappings; @@ -25,8 +21,8 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; import java.util.List; @@ -214,40 +210,41 @@ public abstract class TotemItem extends Item { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); } - + @Override - @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault - public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { - if (!world.isClientSide) { - return super.use(world, player, hand); - } - - ItemStack chargeItem = (hand.equals(InteractionHand.MAIN_HAND)) ? player.getOffhandItem() : player.getMainHandItem(); - + public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + if (!level.isClientSide) return super.use(level, player, usedHand); + + ItemStack chargeStack = (usedHand.equals(InteractionHand.MAIN_HAND)) ? player.getOffhandItem() : player.getMainHandItem(); + if (player.isCrouching()) { - NetworkManager.getChannel().sendToServer(new ChangeTargetPacket(hand)); + // Change Target Packet } else { - if (isCharge(chargeItem)) { - NetworkManager.getChannel().sendToServer(new ChargeTotemPacket(hand)); + if (isCharge(chargeStack)) { + // Charge Totem Packet } else { - NetworkManager.getChannel().sendToServer(new ReviveTargetPacket(hand)); + // Revive Target Packet } } - return super.use(world, player, hand); + + return super.use(level, player, usedHand); } - + @Override + @ParametersAreNonnullByDefault public int getMaxDamage(ItemStack stack) { - return getConfig(stack).getDurability(); + return getConfig().getDurability(); } - + @Override + @ParametersAreNonnullByDefault public boolean isDamageable(ItemStack stack) { - return (getConfig(stack).getDurability() != 0); + return getConfig().getDurability() != 0; } @Override + @ParametersAreNonnullByDefault public int getDamage(ItemStack stack) { if (isDamageable(stack) && super.getDamage(stack) >= getMaxDamage(stack)) { stack.setCount(0); From 935ccd14bb6462de3f0b8b7834747669586c25b6 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 00:20:54 +0100 Subject: [PATCH 20/51] Implemented new methods for each totem item. Implemented helper for generating item properties, now also adding totem data to the item. --- .../item/totem/DiamondTotemItem.java | 7 ++++++- .../item/totem/IronTotemItem.java | 8 +++++++- .../item/totem/NetheriteTotemItem.java | 8 ++++---- .../item/totem/StrawTotemItem.java | 7 ++++++- .../totemofreviving/item/totem/TotemItem.java | 18 +++++++++++++----- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java index 9e33a7e..21089d8 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class DiamondTotemItem extends TotemItem { public DiamondTotemItem() { - super(Rarity.RARE, Config.Server.getDiamondTotemConfig().getDurability()); + super(createProperties(Rarity.RARE, Config.Server.getDiamondTotemConfig().getDurability(), false)); } public static String getName() { @@ -18,4 +18,9 @@ public class DiamondTotemItem extends TotemItem { public boolean isCharge(ItemStack stack) { return (stack.getItem() instanceof DiamondChargeItem); } + + @Override + public Config.TotemConfig getConfig() { + return Config.Server.getDiamondTotemConfig(); + } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java index 1e574aa..1f7f2f1 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java @@ -3,10 +3,11 @@ package dev.micle.totemofreviving.item.totem; import dev.micle.totemofreviving.item.charge.IronChargeItem; import dev.micle.totemofreviving.setup.Config; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; public class IronTotemItem extends TotemItem { public IronTotemItem() { - super(Config.Server.getIronTotemConfig().getDurability()); + super(createProperties(Rarity.COMMON, Config.Server.getIronTotemConfig().getDurability(), false)); } public static String getName() { @@ -17,4 +18,9 @@ public class IronTotemItem extends TotemItem { public boolean isCharge(ItemStack stack) { return (stack.getItem() instanceof IronChargeItem); } + + @Override + public Config.TotemConfig getConfig() { + return Config.Server.getIronTotemConfig(); + } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java index f538324..c74464d 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class NetheriteTotemItem extends TotemItem { public NetheriteTotemItem() { - super(Rarity.EPIC, Config.Server.getNetheriteTotemConfig().getDurability()); + super(createProperties(Rarity.EPIC, Config.Server.getNetheriteTotemConfig().getDurability(), true)); } public static String getName() { @@ -18,9 +18,9 @@ public class NetheriteTotemItem extends TotemItem { public boolean isCharge(ItemStack stack) { return (stack.getItem() instanceof NetheriteChargeItem); } - + @Override - public boolean isFireResistant() { - return true; + public Config.TotemConfig getConfig() { + return Config.Server.getNetheriteTotemConfig(); } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java index c731c54..e5d226c 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class StrawTotemItem extends TotemItem { public StrawTotemItem() { - super(Rarity.UNCOMMON, Config.Server.getStrawTotemConfig().getDurability()); + super(createProperties(Rarity.UNCOMMON, Config.Server.getStrawTotemConfig().getDurability(), false)); } public static String getName() { @@ -18,4 +18,9 @@ public class StrawTotemItem extends TotemItem { public boolean isCharge(ItemStack stack) { return (stack.getItem() instanceof StrawChargeItem); } + + @Override + public Config.TotemConfig getConfig() { + return Config.Server.getStrawTotemConfig(); + } } diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index c468756..2249149 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -30,12 +30,20 @@ import java.util.Optional; import java.util.UUID; public abstract class TotemItem extends Item { - public TotemItem(int durability) { - this(Rarity.COMMON, durability); + public TotemItem(Properties properties) { + super(properties); } - - public TotemItem(Rarity rarity, int durability) { - super(new Properties().stacksTo(1).rarity(rarity).durability(durability)); + + public static Properties createProperties(Rarity rarity, int durability, boolean isFireResistant) { + Properties properties = new Properties().stacksTo(1).rarity(rarity).durability(durability); + + if (isFireResistant) properties = properties.fireResistant(); + + properties = properties.component(ModDataComponents.TOTEM_DATA.get(), new TotemData( + 0, "", "", 0, 0 + )); + + return properties; } public abstract boolean isCharge(ItemStack stack); From 1c4535203798a4a169f0fc8a9ec918d0b56faca2 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 00:25:55 +0100 Subject: [PATCH 21/51] Ported charge items. Implemented property helper. Made netherite charges fire-resistant. --- .../item/charge/ChargeItem.java | 27 +++++++++---------- .../item/charge/DiamondChargeItem.java | 2 +- .../item/charge/IronChargeItem.java | 6 ++++- .../item/charge/NetheriteChargeItem.java | 2 +- .../item/charge/StrawChargeItem.java | 2 +- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java index 05087dd..5c4d369 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java @@ -6,28 +6,27 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; public class ChargeItem extends Item { - public ChargeItem() { - this(Rarity.COMMON); + public ChargeItem(Properties properties) { + super(properties); } - - public ChargeItem(Rarity rarity) { - super(new Properties().stacksTo(64).rarity(rarity)); + + public static Properties createProperties(Rarity rarity, boolean isFireResistant) { + Properties properties = new Properties().stacksTo(64).rarity(rarity); + + if (isFireResistant) properties = properties.fireResistant(); + + return properties; } - + @Override - @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { - tooltip.add(Component.literal(ChatFormatting.WHITE + "Used for charging its corresponding totem.")); - super.appendHoverText(stack, world, tooltip, tooltipFlag); + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Used for charging its corresponding totem.")); + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); } } diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java index 348ea84..387e30b 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java @@ -4,7 +4,7 @@ import net.minecraft.world.item.Rarity; public class DiamondChargeItem extends ChargeItem { public DiamondChargeItem() { - super(Rarity.RARE); + super(createProperties(Rarity.RARE, false)); } public static String getName() { diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java index c9f0443..e6e0084 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java @@ -1,7 +1,11 @@ package dev.micle.totemofreviving.item.charge; +import net.minecraft.world.item.Rarity; + public class IronChargeItem extends ChargeItem { - public IronChargeItem() {} + public IronChargeItem() { + super(createProperties(Rarity.COMMON, false)); + } public static String getName() { return "iron_charge"; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java index 2795e51..d3e2f74 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java @@ -4,7 +4,7 @@ import net.minecraft.world.item.Rarity; public class NetheriteChargeItem extends ChargeItem { public NetheriteChargeItem() { - super(Rarity.EPIC); + super(createProperties(Rarity.EPIC, true)); } public static String getName() { diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java index 534a8f4..72e0fbc 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java @@ -4,7 +4,7 @@ import net.minecraft.world.item.Rarity; public class StrawChargeItem extends ChargeItem { public StrawChargeItem() { - super(Rarity.UNCOMMON); + super(createProperties(Rarity.UNCOMMON, false)); } public static String getName() { From 8abbf5384eefc430505f084678d930ae2fdd518e Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 00:40:15 +0100 Subject: [PATCH 22/51] WIP: Temporarily disabling old networking code. --- .../network/NetworkManager.java | 68 ++++++----- .../network/client/ChangeTargetPacket.java | 73 ++++++------ .../network/client/ChargeTotemPacket.java | 61 +++++----- .../network/client/ReviveTargetPacket.java | 111 +++++++++--------- .../micle/totemofreviving/proxy/Proxy.java | 2 +- 5 files changed, 155 insertions(+), 160 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java b/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java index c05582a..3bc4fb7 100644 --- a/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java +++ b/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java @@ -4,41 +4,39 @@ import dev.micle.totemofreviving.TotemOfReviving; import dev.micle.totemofreviving.network.client.ChangeTargetPacket; import dev.micle.totemofreviving.network.client.ChargeTotemPacket; import dev.micle.totemofreviving.network.client.ReviveTargetPacket; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; public class NetworkManager { - // Initialize variables - private static SimpleChannel channel; - - public static void init() { - // Create channel - channel = NetworkRegistry.ChannelBuilder.named(TotemOfReviving.createResourceLocation("network")) - .clientAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) - .serverAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) - .networkProtocolVersion(TotemOfReviving::getVersion) - .simpleChannel(); - - // Register packets - int id = 0; - channel.messageBuilder(ChangeTargetPacket.class, id++) - .encoder(ChangeTargetPacket::encode) - .decoder(ChangeTargetPacket::decode) - .consumerNetworkThread(ChangeTargetPacket::handle) - .add(); - channel.messageBuilder(ChargeTotemPacket.class, id++) - .encoder(ChargeTotemPacket::encode) - .decoder(ChargeTotemPacket::decode) - .consumerNetworkThread(ChargeTotemPacket::handle) - .add(); - channel.messageBuilder(ReviveTargetPacket.class, id++) - .encoder(ReviveTargetPacket::encode) - .decoder(ReviveTargetPacket::decode) - .consumerNetworkThread(ReviveTargetPacket::handle) - .add(); - } - - public static SimpleChannel getChannel() { - return channel; - } +// // Initialize variables +// private static SimpleChannel channel; +// +// public static void init() { +// // Create channel +// channel = NetworkRegistry.ChannelBuilder.named(TotemOfReviving.createResourceLocation("network")) +// .clientAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) +// .serverAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) +// .networkProtocolVersion(TotemOfReviving::getVersion) +// .simpleChannel(); +// +// // Register packets +// int id = 0; +// channel.messageBuilder(ChangeTargetPacket.class, id++) +// .encoder(ChangeTargetPacket::encode) +// .decoder(ChangeTargetPacket::decode) +// .consumerNetworkThread(ChangeTargetPacket::handle) +// .add(); +// channel.messageBuilder(ChargeTotemPacket.class, id++) +// .encoder(ChargeTotemPacket::encode) +// .decoder(ChargeTotemPacket::decode) +// .consumerNetworkThread(ChargeTotemPacket::handle) +// .add(); +// channel.messageBuilder(ReviveTargetPacket.class, id++) +// .encoder(ReviveTargetPacket::encode) +// .decoder(ReviveTargetPacket::decode) +// .consumerNetworkThread(ReviveTargetPacket::handle) +// .add(); +// } +// +// public static SimpleChannel getChannel() { +// return channel; +// } } diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java index 1651d68..06e9be9 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java +++ b/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java @@ -9,45 +9,44 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class ChangeTargetPacket { - private final InteractionHand hand; - - public ChangeTargetPacket(final InteractionHand hand) { - this.hand = hand; - } - - public static void encode(final ChangeTargetPacket packet, final FriendlyByteBuf buffer) { - buffer.writeEnum(packet.hand); - } - - public static ChangeTargetPacket decode(final FriendlyByteBuf buffer) { - return new ChangeTargetPacket(buffer.readEnum(InteractionHand.class)); - } - - public static void handle(final ChangeTargetPacket packet, final Supplier contextSupplier) { - final NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> { - ServerPlayer sender = context.getSender(); - if (sender == null) { return; } - - ItemStack totemStack = sender.getItemInHand(packet.hand); - PlayerList playerList = TotemOfReviving.getProxy().getServer().getPlayerList(); - int targetIndex = TotemItem.getTargetIndex(totemStack) + 1; - - if (targetIndex > playerList.getPlayerCount()-1) { targetIndex = 0; } - ServerPlayer target = playerList.getPlayers().get(targetIndex); - - TotemItem.setTargetIndex(totemStack, targetIndex); - TotemItem.setTargetUUID(totemStack, target.getUUID()); - TotemItem.setTargetName(totemStack, target.getDisplayName().getString()); - TotemItem.setTargetDeaths(totemStack, target); - - sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + target.getDisplayName().getString() + ".")); - }); - context.setPacketHandled(true); - } +// private final InteractionHand hand; +// +// public ChangeTargetPacket(final InteractionHand hand) { +// this.hand = hand; +// } +// +// public static void encode(final ChangeTargetPacket packet, final FriendlyByteBuf buffer) { +// buffer.writeEnum(packet.hand); +// } +// +// public static ChangeTargetPacket decode(final FriendlyByteBuf buffer) { +// return new ChangeTargetPacket(buffer.readEnum(InteractionHand.class)); +// } +// +// public static void handle(final ChangeTargetPacket packet, final Supplier contextSupplier) { +// final NetworkEvent.Context context = contextSupplier.get(); +// context.enqueueWork(() -> { +// ServerPlayer sender = context.getSender(); +// if (sender == null) { return; } +// +// ItemStack totemStack = sender.getItemInHand(packet.hand); +// PlayerList playerList = TotemOfReviving.getProxy().getServer().getPlayerList(); +// int targetIndex = TotemItem.getTargetIndex(totemStack) + 1; +// +// if (targetIndex > playerList.getPlayerCount()-1) { targetIndex = 0; } +// ServerPlayer target = playerList.getPlayers().get(targetIndex); +// +// TotemItem.setTargetIndex(totemStack, targetIndex); +// TotemItem.setTargetUUID(totemStack, target.getUUID()); +// TotemItem.setTargetName(totemStack, target.getDisplayName().getString()); +// TotemItem.setTargetDeaths(totemStack, target); +// +// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + target.getDisplayName().getString() + ".")); +// }); +// context.setPacketHandled(true); +// } } diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java index 6abb968..6cb6922 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java +++ b/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java @@ -5,39 +5,38 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class ChargeTotemPacket { - private final InteractionHand hand; - - public ChargeTotemPacket(final InteractionHand hand) { - this.hand = hand; - } - - public static void encode(final ChargeTotemPacket packet, final FriendlyByteBuf buffer) { - buffer.writeEnum(packet.hand); - } - - public static ChargeTotemPacket decode(final FriendlyByteBuf buffer) { - return new ChargeTotemPacket(buffer.readEnum(InteractionHand.class)); - } - - public static void handle(final ChargeTotemPacket packet, final Supplier contextSupplier) { - final NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> { - ServerPlayer sender = context.getSender(); - if (sender == null) { return; } - - ItemStack totemStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getMainHandItem() : sender.getOffhandItem(); - ItemStack chargeStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getOffhandItem() : sender.getMainHandItem(); - - if (TotemItem.isTotemFull(totemStack)) { return; } - - TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) + 1); - chargeStack.setCount(chargeStack.getCount() - 1); - }); - context.setPacketHandled(true); - } +// private final InteractionHand hand; +// +// public ChargeTotemPacket(final InteractionHand hand) { +// this.hand = hand; +// } +// +// public static void encode(final ChargeTotemPacket packet, final FriendlyByteBuf buffer) { +// buffer.writeEnum(packet.hand); +// } +// +// public static ChargeTotemPacket decode(final FriendlyByteBuf buffer) { +// return new ChargeTotemPacket(buffer.readEnum(InteractionHand.class)); +// } +// +// public static void handle(final ChargeTotemPacket packet, final Supplier contextSupplier) { +// final NetworkEvent.Context context = contextSupplier.get(); +// context.enqueueWork(() -> { +// ServerPlayer sender = context.getSender(); +// if (sender == null) { return; } +// +// ItemStack totemStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getMainHandItem() : sender.getOffhandItem(); +// ItemStack chargeStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getOffhandItem() : sender.getMainHandItem(); +// +// if (TotemItem.isTotemFull(totemStack)) { return; } +// +// TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) + 1); +// chargeStack.setCount(chargeStack.getCount() - 1); +// }); +// context.setPacketHandled(true); +// } } diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java index 1bb5f5b..3f67f90 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java +++ b/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java @@ -8,64 +8,63 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class ReviveTargetPacket { - private final InteractionHand hand; - - public ReviveTargetPacket(final InteractionHand hand) { - this.hand = hand; - } - - public static void encode(final ReviveTargetPacket packet, final FriendlyByteBuf buffer) { - buffer.writeEnum(packet.hand); - } - - public static ReviveTargetPacket decode(final FriendlyByteBuf buffer) { - return new ReviveTargetPacket(buffer.readEnum(InteractionHand.class)); - } - - public static void handle(final ReviveTargetPacket packet, final Supplier contextSupplier) { - final NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> { - ServerPlayer sender = context.getSender(); - if (sender == null) { return; } - - ItemStack totemStack = sender.getItemInHand(packet.hand); - ServerPlayer target; - - try { - target = TotemOfReviving.getProxy().getServer().getPlayerList().getPlayer(TotemItem.getTargetUUID(totemStack)); - if (target == null) { throw new NullPointerException("Target is null!"); } - } catch (NullPointerException exception) { - sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Unable to find player!")); - return; - } - - if (!target.isSpectator()) { - sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!")); - return; - } - - if (!target.serverLevel().equals(sender.serverLevel()) && !TotemItem.canReviveAcrossDimensions(totemStack)) { - sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!")); - return; - } - - TotemItem.setTargetDeaths(totemStack, target); - if (!TotemItem.canTotemAffordTarget(totemStack)) { - sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Not enough charge!")); - return; - } - - target.teleportTo(sender.serverLevel(), sender.position().x, sender.position().y, sender.position().z, sender.getYRot(), sender.getXRot()); - target.setGameMode(sender.serverLevel().getServer().getDefaultGameType()); - TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) - TotemItem.getTargetCost(totemStack)); - totemStack.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); - sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!")); - }); - context.setPacketHandled(true); - } +// private final InteractionHand hand; +// +// public ReviveTargetPacket(final InteractionHand hand) { +// this.hand = hand; +// } +// +// public static void encode(final ReviveTargetPacket packet, final FriendlyByteBuf buffer) { +// buffer.writeEnum(packet.hand); +// } +// +// public static ReviveTargetPacket decode(final FriendlyByteBuf buffer) { +// return new ReviveTargetPacket(buffer.readEnum(InteractionHand.class)); +// } +// +// public static void handle(final ReviveTargetPacket packet, final Supplier contextSupplier) { +// final NetworkEvent.Context context = contextSupplier.get(); +// context.enqueueWork(() -> { +// ServerPlayer sender = context.getSender(); +// if (sender == null) { return; } +// +// ItemStack totemStack = sender.getItemInHand(packet.hand); +// ServerPlayer target; +// +// try { +// target = TotemOfReviving.getProxy().getServer().getPlayerList().getPlayer(TotemItem.getTargetUUID(totemStack)); +// if (target == null) { throw new NullPointerException("Target is null!"); } +// } catch (NullPointerException exception) { +// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Unable to find player!")); +// return; +// } +// +// if (!target.isSpectator()) { +// sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!")); +// return; +// } +// +// if (!target.serverLevel().equals(sender.serverLevel()) && !TotemItem.canReviveAcrossDimensions(totemStack)) { +// sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!")); +// return; +// } +// +// TotemItem.setTargetDeaths(totemStack, target); +// if (!TotemItem.canTotemAffordTarget(totemStack)) { +// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Not enough charge!")); +// return; +// } +// +// target.teleportTo(sender.serverLevel(), sender.position().x, sender.position().y, sender.position().z, sender.getYRot(), sender.getXRot()); +// target.setGameMode(sender.serverLevel().getServer().getDefaultGameType()); +// TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) - TotemItem.getTargetCost(totemStack)); +// totemStack.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); +// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!")); +// }); +// context.setPacketHandled(true); +// } } diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java index a73b6a5..4fdeb42 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java @@ -26,7 +26,7 @@ public class Proxy implements IProxy { // Initialize setup Registration.register(modEventBus); Config.init(modContainer); - NetworkManager.init(); + //NetworkManager.init(); // Register mod event bus listeners modEventBus.addListener(Proxy::setup); From 6eabe7b3c5ec35a0d1d8ca879bb7ca97bd13024d Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 01:18:18 +0100 Subject: [PATCH 23/51] Updated gitignore. Updated mod id across project. Fixed gradle not replacing properties in mods.toml. --- .gitignore | 3 ++ build.gradle | 3 ++ .../models/item/diamond_charge.json | 2 +- .../models/item/diamond_totem.json | 2 +- .../models/item/iron_charge.json | 2 +- .../models/item/iron_totem.json | 2 +- .../models/item/netherite_charge.json | 2 +- .../models/item/netherite_totem.json | 2 +- .../models/item/straw_charge.json | 2 +- .../models/item/straw_totem.json | 2 +- .../recipes/tools/diamond_charge.json | 32 +++++++++++++++++ .../recipes/tools/diamond_totem.json | 32 +++++++++++++++++ .../recipes/tools/iron_charge.json | 15 ++++---- .../recipes/tools/iron_totem.json | 15 ++++---- .../recipes/tools/netherite_charge.json | 32 +++++++++++++++++ .../recipes/tools/netherite_totem.json | 32 +++++++++++++++++ .../recipes/tools/straw_charge.json | 15 ++++---- .../recipes/tools/straw_totem.json | 15 ++++---- .../recipe}/diamond_charge.json | 6 ++-- .../recipe}/diamond_totem.json | 6 ++-- .../recipe}/iron_charge.json | 6 ++-- .../recipe}/iron_totem.json | 6 ++-- .../recipe}/netherite_charge.json | 8 ++--- .../recipe}/netherite_totem.json | 8 ++--- .../recipe}/straw_charge.json | 6 ++-- .../recipe}/straw_totem.json | 6 ++-- .../recipes/tools/diamond_charge.json | 35 ------------------- .../recipes/tools/diamond_totem.json | 35 ------------------- .../recipes/tools/netherite_charge.json | 35 ------------------- .../recipes/tools/netherite_totem.json | 35 ------------------- .../TotemOfReviving.java | 6 ++-- .../component/TotemData.java | 2 +- .../data/DataGenerators.java | 4 +-- .../data/ModRecipeProvider.java | 5 ++- .../data/client/ModItemModelProvider.java | 20 +++++------ .../item/charge/ChargeItem.java | 2 +- .../item/charge/DiamondChargeItem.java | 2 +- .../item/charge/IronChargeItem.java | 2 +- .../item/charge/NetheriteChargeItem.java | 2 +- .../item/charge/StrawChargeItem.java | 2 +- .../item/totem/DiamondTotemItem.java | 6 ++-- .../item/totem/IronTotemItem.java | 6 ++-- .../item/totem/NetheriteTotemItem.java | 6 ++-- .../item/totem/StrawTotemItem.java | 6 ++-- .../item/totem/TotemItem.java | 10 +++--- .../network/NetworkManager.java | 7 +--- .../network/client/ChangeTargetPacket.java | 14 +------- .../network/client/ChargeTotemPacket.java | 10 +----- .../network/client/ReviveTargetPacket.java | 13 +------ .../proxy/IProxy.java | 2 +- .../proxy/Proxy.java | 7 ++-- .../setup/Config.java | 10 +++--- .../setup/ModCreativeModeTabs.java | 4 +-- .../setup/ModDataComponents.java | 4 +-- .../setup/ModItems.java | 18 +++++----- .../setup/ModKeyMappings.java | 2 +- .../setup/Registration.java | 5 ++- .../assets/totem_of_reviving/lang/en_us.json | 12 +++++++ .../textures/item/diamond_charge.png | 0 .../textures/item/diamond_totem.png | 0 .../textures/item/iron_charge.png | 0 .../textures/item/iron_totem.png | 0 .../textures/item/netherite_charge.png | 0 .../textures/item/netherite_totem.png | 0 .../textures/item/straw_charge.png | 0 .../textures/item/straw_totem.png | 0 .../assets/totemofreviving/lang/en_us.json | 12 ------- src/main/resources/pack.mcmeta | 2 +- .../META-INF/neoforge.mods.toml | 8 ++--- 69 files changed, 278 insertions(+), 335 deletions(-) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/diamond_charge.json (53%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/diamond_totem.json (54%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/iron_charge.json (55%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/iron_totem.json (55%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/netherite_charge.json (52%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/netherite_totem.json (53%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/straw_charge.json (54%) rename src/generated/resources/assets/{totemofreviving => totem_of_reviving}/models/item/straw_totem.json (55%) create mode 100644 src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_charge.json create mode 100644 src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_totem.json rename src/generated/resources/data/{totemofreviving/advancements => totem_of_reviving/advancement}/recipes/tools/iron_charge.json (62%) rename src/generated/resources/data/{totemofreviving/advancements => totem_of_reviving/advancement}/recipes/tools/iron_totem.json (63%) create mode 100644 src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_charge.json create mode 100644 src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_totem.json rename src/generated/resources/data/{totemofreviving/advancements => totem_of_reviving/advancement}/recipes/tools/straw_charge.json (61%) rename src/generated/resources/data/{totemofreviving/advancements => totem_of_reviving/advancement}/recipes/tools/straw_totem.json (63%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/diamond_charge.json (82%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/diamond_totem.json (80%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/iron_charge.json (80%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/iron_totem.json (80%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/netherite_charge.json (69%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/netherite_totem.json (73%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/straw_charge.json (80%) rename src/generated/resources/data/{totemofreviving/recipes => totem_of_reviving/recipe}/straw_totem.json (82%) delete mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_charge.json delete mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_totem.json delete mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_charge.json delete mode 100644 src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_totem.json rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/TotemOfReviving.java (90%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/component/TotemData.java (98%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/data/DataGenerators.java (87%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/data/ModRecipeProvider.java (96%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/data/client/ModItemModelProvider.java (68%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/charge/ChargeItem.java (95%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/charge/DiamondChargeItem.java (83%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/charge/IronChargeItem.java (82%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/charge/NetheriteChargeItem.java (83%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/charge/StrawChargeItem.java (83%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/totem/DiamondTotemItem.java (77%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/totem/IronTotemItem.java (77%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/totem/NetheriteTotemItem.java (77%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/totem/StrawTotemItem.java (77%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/item/totem/TotemItem.java (97%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/network/NetworkManager.java (80%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/network/client/ChangeTargetPacket.java (75%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/network/client/ChargeTotemPacket.java (79%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/network/client/ReviveTargetPacket.java (85%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/proxy/IProxy.java (88%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/proxy/Proxy.java (93%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/Config.java (93%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/ModCreativeModeTabs.java (92%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/ModDataComponents.java (83%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/ModItems.java (68%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/ModKeyMappings.java (86%) rename src/main/java/dev/micle/{totemofreviving => totem_of_reviving}/setup/Registration.java (87%) create mode 100644 src/main/resources/assets/totem_of_reviving/lang/en_us.json rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/diamond_charge.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/diamond_totem.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/iron_charge.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/iron_totem.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/netherite_charge.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/netherite_totem.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/straw_charge.png (100%) rename src/main/resources/assets/{totemofreviving => totem_of_reviving}/textures/item/straw_totem.png (100%) delete mode 100644 src/main/resources/assets/totemofreviving/lang/en_us.json rename src/main/{resources => templates}/META-INF/neoforge.mods.toml (92%) diff --git a/.gitignore b/.gitignore index 36be3a9..308e07a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ *.blend? *~ +### Minecraft +/src/generated/resources/.cache/* + ### Java template # Compiled class file *.class diff --git a/build.gradle b/build.gradle index 16460d7..0575ead 100644 --- a/build.gradle +++ b/build.gradle @@ -145,11 +145,14 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources 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, ] inputs.properties replaceProperties expand replaceProperties diff --git a/src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json b/src/generated/resources/assets/totem_of_reviving/models/item/diamond_charge.json similarity index 53% rename from src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json rename to src/generated/resources/assets/totem_of_reviving/models/item/diamond_charge.json index 5cbfbd2..8be9ea5 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/diamond_charge.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/diamond_charge.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/diamond_charge" + "layer0": "totem_of_reviving:item/diamond_charge" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json b/src/generated/resources/assets/totem_of_reviving/models/item/diamond_totem.json similarity index 54% rename from src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json rename to src/generated/resources/assets/totem_of_reviving/models/item/diamond_totem.json index 295aaa1..660e9a7 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/diamond_totem.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/diamond_totem.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/diamond_totem" + "layer0": "totem_of_reviving:item/diamond_totem" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/iron_charge.json b/src/generated/resources/assets/totem_of_reviving/models/item/iron_charge.json similarity index 55% rename from src/generated/resources/assets/totemofreviving/models/item/iron_charge.json rename to src/generated/resources/assets/totem_of_reviving/models/item/iron_charge.json index 6341d17..36f468b 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/iron_charge.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/iron_charge.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/iron_charge" + "layer0": "totem_of_reviving:item/iron_charge" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/iron_totem.json b/src/generated/resources/assets/totem_of_reviving/models/item/iron_totem.json similarity index 55% rename from src/generated/resources/assets/totemofreviving/models/item/iron_totem.json rename to src/generated/resources/assets/totem_of_reviving/models/item/iron_totem.json index 60d6d4f..9fce0c1 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/iron_totem.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/iron_totem.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/iron_totem" + "layer0": "totem_of_reviving:item/iron_totem" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json b/src/generated/resources/assets/totem_of_reviving/models/item/netherite_charge.json similarity index 52% rename from src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json rename to src/generated/resources/assets/totem_of_reviving/models/item/netherite_charge.json index cbab895..bcd7730 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/netherite_charge.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/netherite_charge.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/netherite_charge" + "layer0": "totem_of_reviving:item/netherite_charge" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json b/src/generated/resources/assets/totem_of_reviving/models/item/netherite_totem.json similarity index 53% rename from src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json rename to src/generated/resources/assets/totem_of_reviving/models/item/netherite_totem.json index cdd587e..771d478 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/netherite_totem.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/netherite_totem.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/netherite_totem" + "layer0": "totem_of_reviving:item/netherite_totem" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/straw_charge.json b/src/generated/resources/assets/totem_of_reviving/models/item/straw_charge.json similarity index 54% rename from src/generated/resources/assets/totemofreviving/models/item/straw_charge.json rename to src/generated/resources/assets/totem_of_reviving/models/item/straw_charge.json index 85c72a4..1c3550e 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/straw_charge.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/straw_charge.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/straw_charge" + "layer0": "totem_of_reviving:item/straw_charge" } } \ No newline at end of file diff --git a/src/generated/resources/assets/totemofreviving/models/item/straw_totem.json b/src/generated/resources/assets/totem_of_reviving/models/item/straw_totem.json similarity index 55% rename from src/generated/resources/assets/totemofreviving/models/item/straw_totem.json rename to src/generated/resources/assets/totem_of_reviving/models/item/straw_totem.json index f8d8ea1..fc18764 100644 --- a/src/generated/resources/assets/totemofreviving/models/item/straw_totem.json +++ b/src/generated/resources/assets/totem_of_reviving/models/item/straw_totem.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "totemofreviving:item/straw_totem" + "layer0": "totem_of_reviving:item/straw_totem" } } \ No newline at end of file diff --git a/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_charge.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_charge.json new file mode 100644 index 0000000..d146445 --- /dev/null +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_charge.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "totem_of_reviving:diamond_totem" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "totem_of_reviving:diamond_charge" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "totem_of_reviving:diamond_charge" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_totem.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_totem.json new file mode 100644 index 0000000..70bb426 --- /dev/null +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/diamond_totem.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "minecraft:totem_of_undying" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "totem_of_reviving:diamond_totem" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "totem_of_reviving:diamond_totem" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_charge.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_charge.json similarity index 62% rename from src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_charge.json rename to src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_charge.json index f7a271b..b656702 100644 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_charge.json +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_charge.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "totemofreviving:iron_totem" - ] + "items": "totem_of_reviving:iron_totem" } ] }, @@ -15,21 +13,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "totemofreviving:iron_charge" + "recipe": "totem_of_reviving:iron_charge" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ - "totemofreviving:iron_charge" + "totem_of_reviving:iron_charge" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_totem.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_totem.json similarity index 63% rename from src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_totem.json rename to src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_totem.json index ad81002..f1ef482 100644 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/iron_totem.json +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/iron_totem.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "minecraft:emerald" - ] + "items": "minecraft:emerald" } ] }, @@ -15,21 +13,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "totemofreviving:iron_totem" + "recipe": "totem_of_reviving:iron_totem" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ - "totemofreviving:iron_totem" + "totem_of_reviving:iron_totem" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_charge.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_charge.json new file mode 100644 index 0000000..e6f68b7 --- /dev/null +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_charge.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "totem_of_reviving:netherite_totem" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "totem_of_reviving:netherite_charge" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "totem_of_reviving:netherite_charge" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_totem.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_totem.json new file mode 100644 index 0000000..80c60b3 --- /dev/null +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/netherite_totem.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "minecraft:netherite_scrap" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "totem_of_reviving:netherite_totem" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "totem_of_reviving:netherite_totem" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_charge.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_charge.json similarity index 61% rename from src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_charge.json rename to src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_charge.json index a887932..86525be 100644 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_charge.json +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_charge.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "totemofreviving:straw_totem" - ] + "items": "totem_of_reviving:straw_totem" } ] }, @@ -15,21 +13,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "totemofreviving:straw_charge" + "recipe": "totem_of_reviving:straw_charge" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ - "totemofreviving:straw_charge" + "totem_of_reviving:straw_charge" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_totem.json b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_totem.json similarity index 63% rename from src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_totem.json rename to src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_totem.json index 28934fb..d820c84 100644 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/straw_totem.json +++ b/src/generated/resources/data/totem_of_reviving/advancement/recipes/tools/straw_totem.json @@ -5,9 +5,7 @@ "conditions": { "items": [ { - "items": [ - "minecraft:wheat" - ] + "items": "minecraft:wheat" } ] }, @@ -15,21 +13,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "totemofreviving:straw_totem" + "recipe": "totem_of_reviving:straw_totem" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_item", - "has_the_recipe" + "has_the_recipe", + "has_item" ] ], "rewards": { "recipes": [ - "totemofreviving:straw_totem" + "totem_of_reviving:straw_totem" ] - }, - "sends_telemetry_event": false + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/diamond_charge.json b/src/generated/resources/data/totem_of_reviving/recipe/diamond_charge.json similarity index 82% rename from src/generated/resources/data/totemofreviving/recipes/diamond_charge.json rename to src/generated/resources/data/totem_of_reviving/recipe/diamond_charge.json index 5e5d63f..cdeb763 100644 --- a/src/generated/resources/data/totemofreviving/recipes/diamond_charge.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/diamond_charge.json @@ -21,7 +21,7 @@ "IDI" ], "result": { - "item": "totemofreviving:diamond_charge" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:diamond_charge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/diamond_totem.json b/src/generated/resources/data/totem_of_reviving/recipe/diamond_totem.json similarity index 80% rename from src/generated/resources/data/totemofreviving/recipes/diamond_totem.json rename to src/generated/resources/data/totem_of_reviving/recipe/diamond_totem.json index 0a3cbe7..2ca3a4f 100644 --- a/src/generated/resources/data/totemofreviving/recipes/diamond_totem.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/diamond_totem.json @@ -18,7 +18,7 @@ "EDE" ], "result": { - "item": "totemofreviving:diamond_totem" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:diamond_totem" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/iron_charge.json b/src/generated/resources/data/totem_of_reviving/recipe/iron_charge.json similarity index 80% rename from src/generated/resources/data/totemofreviving/recipes/iron_charge.json rename to src/generated/resources/data/totem_of_reviving/recipe/iron_charge.json index 2a6fed9..7e6b875 100644 --- a/src/generated/resources/data/totemofreviving/recipes/iron_charge.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/iron_charge.json @@ -18,7 +18,7 @@ "NIN" ], "result": { - "item": "totemofreviving:iron_charge" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:iron_charge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/iron_totem.json b/src/generated/resources/data/totem_of_reviving/recipe/iron_totem.json similarity index 80% rename from src/generated/resources/data/totemofreviving/recipes/iron_totem.json rename to src/generated/resources/data/totem_of_reviving/recipe/iron_totem.json index f564102..d53b164 100644 --- a/src/generated/resources/data/totemofreviving/recipes/iron_totem.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/iron_totem.json @@ -18,7 +18,7 @@ " I " ], "result": { - "item": "totemofreviving:iron_totem" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:iron_totem" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/netherite_charge.json b/src/generated/resources/data/totem_of_reviving/recipe/netherite_charge.json similarity index 69% rename from src/generated/resources/data/totemofreviving/recipes/netherite_charge.json rename to src/generated/resources/data/totem_of_reviving/recipe/netherite_charge.json index 3622fcc..9bb4b6a 100644 --- a/src/generated/resources/data/totemofreviving/recipes/netherite_charge.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/netherite_charge.json @@ -3,7 +3,7 @@ "category": "equipment", "key": { "C": { - "item": "totemofreviving:diamond_charge" + "item": "totem_of_reviving:diamond_charge" }, "G": { "item": "minecraft:gold_ingot" @@ -18,7 +18,7 @@ "GNG" ], "result": { - "item": "totemofreviving:netherite_charge" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:netherite_charge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/netherite_totem.json b/src/generated/resources/data/totem_of_reviving/recipe/netherite_totem.json similarity index 73% rename from src/generated/resources/data/totemofreviving/recipes/netherite_totem.json rename to src/generated/resources/data/totem_of_reviving/recipe/netherite_totem.json index 1d4f243..de94ab6 100644 --- a/src/generated/resources/data/totemofreviving/recipes/netherite_totem.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/netherite_totem.json @@ -12,7 +12,7 @@ "item": "minecraft:netherite_scrap" }, "T": { - "item": "totemofreviving:diamond_totem" + "item": "totem_of_reviving:diamond_totem" } }, "pattern": [ @@ -21,7 +21,7 @@ "BGB" ], "result": { - "item": "totemofreviving:netherite_totem" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:netherite_totem" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/straw_charge.json b/src/generated/resources/data/totem_of_reviving/recipe/straw_charge.json similarity index 80% rename from src/generated/resources/data/totemofreviving/recipes/straw_charge.json rename to src/generated/resources/data/totem_of_reviving/recipe/straw_charge.json index 785551c..49ce348 100644 --- a/src/generated/resources/data/totemofreviving/recipes/straw_charge.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/straw_charge.json @@ -18,7 +18,7 @@ "NWN" ], "result": { - "item": "totemofreviving:straw_charge" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:straw_charge" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/recipes/straw_totem.json b/src/generated/resources/data/totem_of_reviving/recipe/straw_totem.json similarity index 82% rename from src/generated/resources/data/totemofreviving/recipes/straw_totem.json rename to src/generated/resources/data/totem_of_reviving/recipe/straw_totem.json index 4ce2287..e2d3e99 100644 --- a/src/generated/resources/data/totemofreviving/recipes/straw_totem.json +++ b/src/generated/resources/data/totem_of_reviving/recipe/straw_totem.json @@ -21,7 +21,7 @@ "N|N" ], "result": { - "item": "totemofreviving:straw_totem" - }, - "show_notification": true + "count": 1, + "id": "totem_of_reviving:straw_totem" + } } \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_charge.json deleted file mode 100644 index 10a7794..0000000 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_charge.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_item": { - "conditions": { - "items": [ - { - "items": [ - "totemofreviving:diamond_totem" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "totemofreviving:diamond_charge" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "totemofreviving:diamond_charge" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_totem.json deleted file mode 100644 index 8c4f65c..0000000 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/diamond_totem.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_item": { - "conditions": { - "items": [ - { - "items": [ - "minecraft:totem_of_undying" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "totemofreviving:diamond_totem" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "totemofreviving:diamond_totem" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_charge.json b/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_charge.json deleted file mode 100644 index fb06f38..0000000 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_charge.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_item": { - "conditions": { - "items": [ - { - "items": [ - "totemofreviving:netherite_totem" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "totemofreviving:netherite_charge" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "totemofreviving:netherite_charge" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_totem.json b/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_totem.json deleted file mode 100644 index 0a1e827..0000000 --- a/src/generated/resources/data/totemofreviving/advancements/recipes/tools/netherite_totem.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_item": { - "conditions": { - "items": [ - { - "items": [ - "minecraft:netherite_scrap" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "totemofreviving:netherite_totem" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "totemofreviving:netherite_totem" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java b/src/main/java/dev/micle/totem_of_reviving/TotemOfReviving.java similarity index 90% rename from src/main/java/dev/micle/totemofreviving/TotemOfReviving.java rename to src/main/java/dev/micle/totem_of_reviving/TotemOfReviving.java index 4ae6bda..3cf2337 100644 --- a/src/main/java/dev/micle/totemofreviving/TotemOfReviving.java +++ b/src/main/java/dev/micle/totem_of_reviving/TotemOfReviving.java @@ -1,7 +1,7 @@ -package dev.micle.totemofreviving; +package dev.micle.totem_of_reviving; -import dev.micle.totemofreviving.proxy.IProxy; -import dev.micle.totemofreviving.proxy.Proxy; +import dev.micle.totem_of_reviving.proxy.IProxy; +import dev.micle.totem_of_reviving.proxy.Proxy; import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; diff --git a/src/main/java/dev/micle/totemofreviving/component/TotemData.java b/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java similarity index 98% rename from src/main/java/dev/micle/totemofreviving/component/TotemData.java rename to src/main/java/dev/micle/totem_of_reviving/component/TotemData.java index baa02fe..dbd739d 100644 --- a/src/main/java/dev/micle/totemofreviving/component/TotemData.java +++ b/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.component; +package dev.micle.totem_of_reviving.component; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; diff --git a/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java b/src/main/java/dev/micle/totem_of_reviving/data/DataGenerators.java similarity index 87% rename from src/main/java/dev/micle/totemofreviving/data/DataGenerators.java rename to src/main/java/dev/micle/totem_of_reviving/data/DataGenerators.java index 0117288..be8b965 100644 --- a/src/main/java/dev/micle/totemofreviving/data/DataGenerators.java +++ b/src/main/java/dev/micle/totem_of_reviving/data/DataGenerators.java @@ -1,6 +1,6 @@ -package dev.micle.totemofreviving.data; +package dev.micle.totem_of_reviving.data; -import dev.micle.totemofreviving.data.client.ModItemModelProvider; +import dev.micle.totem_of_reviving.data.client.ModItemModelProvider; import net.minecraft.data.DataGenerator; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; diff --git a/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java b/src/main/java/dev/micle/totem_of_reviving/data/ModRecipeProvider.java similarity index 96% rename from src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java rename to src/main/java/dev/micle/totem_of_reviving/data/ModRecipeProvider.java index a41de69..530c1f0 100644 --- a/src/main/java/dev/micle/totemofreviving/data/ModRecipeProvider.java +++ b/src/main/java/dev/micle/totem_of_reviving/data/ModRecipeProvider.java @@ -1,8 +1,7 @@ -package dev.micle.totemofreviving.data; +package dev.micle.totem_of_reviving.data; -import dev.micle.totemofreviving.setup.ModItems; +import dev.micle.totem_of_reviving.setup.ModItems; import net.minecraft.core.HolderLookup; -import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeOutput; diff --git a/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java b/src/main/java/dev/micle/totem_of_reviving/data/client/ModItemModelProvider.java similarity index 68% rename from src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java rename to src/main/java/dev/micle/totem_of_reviving/data/client/ModItemModelProvider.java index 14710e2..64a1b24 100644 --- a/src/main/java/dev/micle/totemofreviving/data/client/ModItemModelProvider.java +++ b/src/main/java/dev/micle/totem_of_reviving/data/client/ModItemModelProvider.java @@ -1,14 +1,14 @@ -package dev.micle.totemofreviving.data.client; +package dev.micle.totem_of_reviving.data.client; -import dev.micle.totemofreviving.TotemOfReviving; -import dev.micle.totemofreviving.item.charge.DiamondChargeItem; -import dev.micle.totemofreviving.item.charge.IronChargeItem; -import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; -import dev.micle.totemofreviving.item.charge.StrawChargeItem; -import dev.micle.totemofreviving.item.totem.DiamondTotemItem; -import dev.micle.totemofreviving.item.totem.IronTotemItem; -import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; -import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import dev.micle.totem_of_reviving.TotemOfReviving; +import dev.micle.totem_of_reviving.item.charge.DiamondChargeItem; +import dev.micle.totem_of_reviving.item.charge.IronChargeItem; +import dev.micle.totem_of_reviving.item.charge.NetheriteChargeItem; +import dev.micle.totem_of_reviving.item.charge.StrawChargeItem; +import dev.micle.totem_of_reviving.item.totem.DiamondTotemItem; +import dev.micle.totem_of_reviving.item.totem.IronTotemItem; +import dev.micle.totem_of_reviving.item.totem.NetheriteTotemItem; +import dev.micle.totem_of_reviving.item.totem.StrawTotemItem; import net.minecraft.data.DataGenerator; import net.neoforged.neoforge.client.model.generators.ItemModelBuilder; import net.neoforged.neoforge.client.model.generators.ItemModelProvider; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java similarity index 95% rename from src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java index 5c4d369..1433a9c 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/ChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.item.charge; +package dev.micle.totem_of_reviving.item.charge; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java similarity index 83% rename from src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java index 387e30b..17a4d18 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/DiamondChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.item.charge; +package dev.micle.totem_of_reviving.item.charge; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java similarity index 82% rename from src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java index e6e0084..f508826 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/IronChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.item.charge; +package dev.micle.totem_of_reviving.item.charge; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java similarity index 83% rename from src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java index d3e2f74..4022007 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/NetheriteChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.item.charge; +package dev.micle.totem_of_reviving.item.charge; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java similarity index 83% rename from src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java index 72e0fbc..53ee330 100644 --- a/src/main/java/dev/micle/totemofreviving/item/charge/StrawChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.item.charge; +package dev.micle.totem_of_reviving.item.charge; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java similarity index 77% rename from src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java index 21089d8..fb37201 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/DiamondTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java @@ -1,7 +1,7 @@ -package dev.micle.totemofreviving.item.totem; +package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totemofreviving.item.charge.DiamondChargeItem; -import dev.micle.totemofreviving.setup.Config; +import dev.micle.totem_of_reviving.item.charge.DiamondChargeItem; +import dev.micle.totem_of_reviving.setup.Config; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java similarity index 77% rename from src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java index 1f7f2f1..6d83384 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/IronTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java @@ -1,7 +1,7 @@ -package dev.micle.totemofreviving.item.totem; +package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totemofreviving.item.charge.IronChargeItem; -import dev.micle.totemofreviving.setup.Config; +import dev.micle.totem_of_reviving.item.charge.IronChargeItem; +import dev.micle.totem_of_reviving.setup.Config; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java similarity index 77% rename from src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java index c74464d..19760eb 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/NetheriteTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java @@ -1,7 +1,7 @@ -package dev.micle.totemofreviving.item.totem; +package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; -import dev.micle.totemofreviving.setup.Config; +import dev.micle.totem_of_reviving.item.charge.NetheriteChargeItem; +import dev.micle.totem_of_reviving.setup.Config; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java similarity index 77% rename from src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java index e5d226c..c587a87 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/StrawTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java @@ -1,7 +1,7 @@ -package dev.micle.totemofreviving.item.totem; +package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totemofreviving.item.charge.StrawChargeItem; -import dev.micle.totemofreviving.setup.Config; +import dev.micle.totem_of_reviving.item.charge.StrawChargeItem; +import dev.micle.totem_of_reviving.setup.Config; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java similarity index 97% rename from src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java rename to src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 2249149..47cae3e 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -1,9 +1,9 @@ -package dev.micle.totemofreviving.item.totem; +package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totemofreviving.component.TotemData; -import dev.micle.totemofreviving.setup.Config; -import dev.micle.totemofreviving.setup.ModDataComponents; -import dev.micle.totemofreviving.setup.ModKeyMappings; +import dev.micle.totem_of_reviving.component.TotemData; +import dev.micle.totem_of_reviving.setup.Config; +import dev.micle.totem_of_reviving.setup.ModDataComponents; +import dev.micle.totem_of_reviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java b/src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java similarity index 80% rename from src/main/java/dev/micle/totemofreviving/network/NetworkManager.java rename to src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java index 3bc4fb7..bd3b80c 100644 --- a/src/main/java/dev/micle/totemofreviving/network/NetworkManager.java +++ b/src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java @@ -1,9 +1,4 @@ -package dev.micle.totemofreviving.network; - -import dev.micle.totemofreviving.TotemOfReviving; -import dev.micle.totemofreviving.network.client.ChangeTargetPacket; -import dev.micle.totemofreviving.network.client.ChargeTotemPacket; -import dev.micle.totemofreviving.network.client.ReviveTargetPacket; +package dev.micle.totem_of_reviving.network; public class NetworkManager { // // Initialize variables diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java similarity index 75% rename from src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java rename to src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java index 06e9be9..873d8cb 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ChangeTargetPacket.java +++ b/src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java @@ -1,16 +1,4 @@ -package dev.micle.totemofreviving.network.client; - -import dev.micle.totemofreviving.TotemOfReviving; -import dev.micle.totemofreviving.item.totem.TotemItem; -import net.minecraft.ChatFormatting; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; - -import java.util.function.Supplier; +package dev.micle.totem_of_reviving.network.client; public class ChangeTargetPacket { // private final InteractionHand hand; diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java similarity index 79% rename from src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java rename to src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java index 6cb6922..c2199e8 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ChargeTotemPacket.java +++ b/src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java @@ -1,12 +1,4 @@ -package dev.micle.totemofreviving.network.client; - -import dev.micle.totemofreviving.item.totem.TotemItem; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; - -import java.util.function.Supplier; +package dev.micle.totem_of_reviving.network.client; public class ChargeTotemPacket { // private final InteractionHand hand; diff --git a/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java similarity index 85% rename from src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java rename to src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java index 3f67f90..d526777 100644 --- a/src/main/java/dev/micle/totemofreviving/network/client/ReviveTargetPacket.java +++ b/src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java @@ -1,15 +1,4 @@ -package dev.micle.totemofreviving.network.client; - -import dev.micle.totemofreviving.TotemOfReviving; -import dev.micle.totemofreviving.item.totem.TotemItem; -import net.minecraft.ChatFormatting; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; - -import java.util.function.Supplier; +package dev.micle.totem_of_reviving.network.client; public class ReviveTargetPacket { // private final InteractionHand hand; diff --git a/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java b/src/main/java/dev/micle/totem_of_reviving/proxy/IProxy.java similarity index 88% rename from src/main/java/dev/micle/totemofreviving/proxy/IProxy.java rename to src/main/java/dev/micle/totem_of_reviving/proxy/IProxy.java index 98c834a..db68237 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/IProxy.java +++ b/src/main/java/dev/micle/totem_of_reviving/proxy/IProxy.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.proxy; +package dev.micle.totem_of_reviving.proxy; import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java b/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java similarity index 93% rename from src/main/java/dev/micle/totemofreviving/proxy/Proxy.java rename to src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java index 4fdeb42..0dc55c5 100644 --- a/src/main/java/dev/micle/totemofreviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java @@ -1,8 +1,7 @@ -package dev.micle.totemofreviving.proxy; +package dev.micle.totem_of_reviving.proxy; -import dev.micle.totemofreviving.network.NetworkManager; -import dev.micle.totemofreviving.setup.Config; -import dev.micle.totemofreviving.setup.Registration; +import dev.micle.totem_of_reviving.setup.Config; +import dev.micle.totem_of_reviving.setup.Registration; import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/dev/micle/totemofreviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java similarity index 93% rename from src/main/java/dev/micle/totemofreviving/setup/Config.java rename to src/main/java/dev/micle/totem_of_reviving/setup/Config.java index 9c19840..996ff2c 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -1,9 +1,9 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; -import dev.micle.totemofreviving.item.totem.DiamondTotemItem; -import dev.micle.totemofreviving.item.totem.IronTotemItem; -import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; -import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import dev.micle.totem_of_reviving.item.totem.DiamondTotemItem; +import dev.micle.totem_of_reviving.item.totem.IronTotemItem; +import dev.micle.totem_of_reviving.item.totem.NetheriteTotemItem; +import dev.micle.totem_of_reviving.item.totem.StrawTotemItem; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; import net.neoforged.neoforge.common.ModConfigSpec; diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java similarity index 92% rename from src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java rename to src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java index b3f96f2..e526a87 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModCreativeModeTabs.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java @@ -1,6 +1,6 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; -import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totem_of_reviving.TotemOfReviving; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; import net.neoforged.neoforge.registries.DeferredHolder; diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java similarity index 83% rename from src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java rename to src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java index 727d3d9..a2324f4 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModDataComponents.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java @@ -1,6 +1,6 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; -import dev.micle.totemofreviving.component.TotemData; +import dev.micle.totem_of_reviving.component.TotemData; import net.minecraft.core.component.DataComponentType; import net.neoforged.neoforge.registries.DeferredHolder; diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModItems.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModItems.java similarity index 68% rename from src/main/java/dev/micle/totemofreviving/setup/ModItems.java rename to src/main/java/dev/micle/totem_of_reviving/setup/ModItems.java index 4374708..c836bcf 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModItems.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModItems.java @@ -1,13 +1,13 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; -import dev.micle.totemofreviving.item.charge.DiamondChargeItem; -import dev.micle.totemofreviving.item.charge.IronChargeItem; -import dev.micle.totemofreviving.item.charge.NetheriteChargeItem; -import dev.micle.totemofreviving.item.charge.StrawChargeItem; -import dev.micle.totemofreviving.item.totem.DiamondTotemItem; -import dev.micle.totemofreviving.item.totem.IronTotemItem; -import dev.micle.totemofreviving.item.totem.NetheriteTotemItem; -import dev.micle.totemofreviving.item.totem.StrawTotemItem; +import dev.micle.totem_of_reviving.item.charge.DiamondChargeItem; +import dev.micle.totem_of_reviving.item.charge.IronChargeItem; +import dev.micle.totem_of_reviving.item.charge.NetheriteChargeItem; +import dev.micle.totem_of_reviving.item.charge.StrawChargeItem; +import dev.micle.totem_of_reviving.item.totem.DiamondTotemItem; +import dev.micle.totem_of_reviving.item.totem.IronTotemItem; +import dev.micle.totem_of_reviving.item.totem.NetheriteTotemItem; +import dev.micle.totem_of_reviving.item.totem.StrawTotemItem; import net.minecraft.world.item.Item; import net.neoforged.neoforge.registries.DeferredItem; diff --git a/src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java similarity index 86% rename from src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java rename to src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java index 6d531b1..4b3f025 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/ModKeyMappings.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java @@ -1,4 +1,4 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; diff --git a/src/main/java/dev/micle/totemofreviving/setup/Registration.java b/src/main/java/dev/micle/totem_of_reviving/setup/Registration.java similarity index 87% rename from src/main/java/dev/micle/totemofreviving/setup/Registration.java rename to src/main/java/dev/micle/totem_of_reviving/setup/Registration.java index 71b951a..9217224 100644 --- a/src/main/java/dev/micle/totemofreviving/setup/Registration.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Registration.java @@ -1,7 +1,6 @@ -package dev.micle.totemofreviving.setup; +package dev.micle.totem_of_reviving.setup; -import dev.micle.totemofreviving.TotemOfReviving; -import net.minecraft.core.component.DataComponentType; +import dev.micle.totem_of_reviving.TotemOfReviving; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.CreativeModeTab; import net.neoforged.bus.api.IEventBus; diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json new file mode 100644 index 0000000..bd1aab9 --- /dev/null +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -0,0 +1,12 @@ +{ + "itemGroup.totem_of_reviving.main": "Micle's Totem of Reviving", + "item.totem_of_reviving.straw_totem": "Straw totem of reviving", + "item.totem_of_reviving.iron_totem": "Iron totem of reviving", + "item.totem_of_reviving.diamond_totem": "Diamond totem of reviving", + "item.totem_of_reviving.netherite_totem": "Netherite totem of reviving", + "item.totem_of_reviving.straw_charge": "Straw reviving charge", + "item.totem_of_reviving.iron_charge": "Iron reviving charge", + "item.totem_of_reviving.diamond_charge": "Diamond reviving charge", + "item.totem_of_reviving.netherite_charge": "Netherite reviving charge", + "advanced_tooltips": "advanced_tooltips" +} \ No newline at end of file diff --git a/src/main/resources/assets/totemofreviving/textures/item/diamond_charge.png b/src/main/resources/assets/totem_of_reviving/textures/item/diamond_charge.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/diamond_charge.png rename to src/main/resources/assets/totem_of_reviving/textures/item/diamond_charge.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/diamond_totem.png b/src/main/resources/assets/totem_of_reviving/textures/item/diamond_totem.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/diamond_totem.png rename to src/main/resources/assets/totem_of_reviving/textures/item/diamond_totem.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/iron_charge.png b/src/main/resources/assets/totem_of_reviving/textures/item/iron_charge.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/iron_charge.png rename to src/main/resources/assets/totem_of_reviving/textures/item/iron_charge.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/iron_totem.png b/src/main/resources/assets/totem_of_reviving/textures/item/iron_totem.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/iron_totem.png rename to src/main/resources/assets/totem_of_reviving/textures/item/iron_totem.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/netherite_charge.png b/src/main/resources/assets/totem_of_reviving/textures/item/netherite_charge.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/netherite_charge.png rename to src/main/resources/assets/totem_of_reviving/textures/item/netherite_charge.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/netherite_totem.png b/src/main/resources/assets/totem_of_reviving/textures/item/netherite_totem.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/netherite_totem.png rename to src/main/resources/assets/totem_of_reviving/textures/item/netherite_totem.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/straw_charge.png b/src/main/resources/assets/totem_of_reviving/textures/item/straw_charge.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/straw_charge.png rename to src/main/resources/assets/totem_of_reviving/textures/item/straw_charge.png diff --git a/src/main/resources/assets/totemofreviving/textures/item/straw_totem.png b/src/main/resources/assets/totem_of_reviving/textures/item/straw_totem.png similarity index 100% rename from src/main/resources/assets/totemofreviving/textures/item/straw_totem.png rename to src/main/resources/assets/totem_of_reviving/textures/item/straw_totem.png diff --git a/src/main/resources/assets/totemofreviving/lang/en_us.json b/src/main/resources/assets/totemofreviving/lang/en_us.json deleted file mode 100644 index 58ea6bf..0000000 --- a/src/main/resources/assets/totemofreviving/lang/en_us.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "itemGroup.totemofreviving.main": "Micle's Totem of Reviving", - "item.totemofreviving.straw_totem": "Straw totem of reviving", - "item.totemofreviving.iron_totem": "Iron totem of reviving", - "item.totemofreviving.diamond_totem": "Diamond totem of reviving", - "item.totemofreviving.netherite_totem": "Netherite totem of reviving", - "item.totemofreviving.straw_charge": "Straw reviving charge", - "item.totemofreviving.iron_charge": "Iron reviving charge", - "item.totemofreviving.diamond_charge": "Diamond reviving charge", - "item.totemofreviving.netherite_charge": "Netherite reviving charge", - "advanced_tooltips": "advanced_tooltips" -} \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 2c2cf31..9f4951c 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "description": "totemofreviving resources", + "description": "totem_of_reviving resources", "pack_format": 8 } } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml similarity index 92% rename from src/main/resources/META-INF/neoforge.mods.toml rename to src/main/templates/META-INF/neoforge.mods.toml index 36e0af6..639861b 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -9,7 +9,7 @@ version = "${mod_version}" displayName = "${mod_name}" #updateJSONURL="http://myurl.me/" #displayURL="http://example.com/" -logoFile="logo.jpg" +logoFile= "logo.jpg" #credits="" authors="${mod_authors}" description = '''${mod_description}''' @@ -20,17 +20,17 @@ description = '''${mod_description}''' #[[accessTransformers]] #file="META-INF/accesstransformer.cfg" -[[dependencies."${mod_id}"]] +[[dependencies.${mod_id}]] modId = "neoforge" # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). # 'required' requires the mod to exist, 'optional' does not # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning type = "required" - versionRange = "${forge_version_range}" + versionRange = "${neo_version_range}" ordering = "NONE" # BEFORE, AFTER, NONE side = "BOTH" # BOTH, CLIENT, SERVER -[[dependencies."${mod_id}"]] +[[dependencies.${mod_id}]] modId = "minecraft" type = "required" versionRange = "${minecraft_version_range}" From 06ef028b6c0386a2b502ccc3da5b97f7ffcb9fff Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 11 Jan 2026 01:19:49 +0100 Subject: [PATCH 24/51] Updated mods.toml. --- src/main/templates/META-INF/neoforge.mods.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index 639861b..82fc7d9 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -20,7 +20,7 @@ description = '''${mod_description}''' #[[accessTransformers]] #file="META-INF/accesstransformer.cfg" -[[dependencies.${mod_id}]] +[[dependencies."${mod_id}"]] modId = "neoforge" # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). # 'required' requires the mod to exist, 'optional' does not @@ -30,7 +30,7 @@ description = '''${mod_description}''' ordering = "NONE" # BEFORE, AFTER, NONE side = "BOTH" # BOTH, CLIENT, SERVER -[[dependencies.${mod_id}]] +[[dependencies."${mod_id}"]] modId = "minecraft" type = "required" versionRange = "${minecraft_version_range}" From 4bb8e9dca0af140538559161f8f37e6cd74bb9d5 Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 01:22:46 +0100 Subject: [PATCH 25/51] Removed the need for template files. Replaced logo file with png as jpg seems to not work with NeoForge. --- assets/images/web/logo.png | 3 +++ build.gradle | 19 +++++++++---------- .../META-INF/neoforge.mods.toml | 18 +++++++++--------- src/main/resources/logo.jpg | 3 --- src/main/resources/logo.png | 3 +++ 5 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 assets/images/web/logo.png rename src/main/{templates => resources}/META-INF/neoforge.mods.toml (79%) delete mode 100644 src/main/resources/logo.jpg create mode 100644 src/main/resources/logo.png diff --git a/assets/images/web/logo.png b/assets/images/web/logo.png new file mode 100644 index 0000000..282333d --- /dev/null +++ b/assets/images/web/logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2b116477b9c469ff81a5740fb3c2b91e5954765872864cc46cb1fe0386e7341 +size 201332 diff --git a/build.gradle b/build.gradle index 0575ead..19ee3b5 100644 --- a/build.gradle +++ b/build.gradle @@ -138,9 +138,12 @@ dependencies { // http://www.gradle.org/docs/current/userguide/dependency_management.html } + // 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. -var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { +// 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, @@ -152,18 +155,14 @@ var generateModMetadata = tasks.register("generateModMetadata", ProcessResources mod_license : mod_license, mod_version : mod_version, mod_authors : mod_authors, - mod_description : mod_description, + mod_description : mod_description ] inputs.properties replaceProperties - expand replaceProperties - from "src/main/templates" - into "build/generated/sources/modMetadata" + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties + } } -// Include the output of "generateModMetadata" as an input directory for the build -// this works with both building through Gradle and the IDE. -sourceSets.main.resources.srcDir generateModMetadata -// To avoid having to run "generateModMetadata" manually, make it run on every project reload -neoForge.ideSyncTask generateModMetadata // Example configuration to allow publishing using the maven-publish plugin publishing { diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 79% rename from src/main/templates/META-INF/neoforge.mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index 82fc7d9..3b90afd 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,24 +1,24 @@ modLoader = "javafml" loaderVersion = "${loader_version_range}" license = "${mod_license}" -issueTrackerURL="https://gitea.micle.dev/minecraft-mods/totem_of_reviving/issues" +issueTrackerURL = "https://gitea.micle.dev/minecraft-mods/totem_of_reviving/issues" [[mods]] modId = "${mod_id}" version = "${mod_version}" displayName = "${mod_name}" -#updateJSONURL="http://myurl.me/" -#displayURL="http://example.com/" -logoFile= "logo.jpg" -#credits="" -authors="${mod_authors}" +#updateJSONURL = "http://myurl.me/" +#displayURL = "http://example.com/" +logoFile = "logo.png" +#credits = "" +authors = "${mod_authors}" description = '''${mod_description}''' #[[mixins]] -#config="${mod_id}.mixins.json" +#config = "${mod_id}.mixins.json" #[[accessTransformers]] -#file="META-INF/accesstransformer.cfg" +#file = "META-INF/accesstransformer.cfg" [[dependencies."${mod_id}"]] modId = "neoforge" @@ -41,4 +41,4 @@ description = '''${mod_description}''' # that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't # stop your mod loading on the server for example. #[features.${mod_id}] -#openGLVersion="[3.2,)" \ No newline at end of file +#openGLVersion = "[3.2,)" \ No newline at end of file diff --git a/src/main/resources/logo.jpg b/src/main/resources/logo.jpg deleted file mode 100644 index d227f88..0000000 --- a/src/main/resources/logo.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62baf6ae4adad51fe59e8daa7bf0afa4592dd1630c2e0ba8958fbb018987a625 -size 41419 diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000..282333d --- /dev/null +++ b/src/main/resources/logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2b116477b9c469ff81a5740fb3c2b91e5954765872864cc46cb1fe0386e7341 +size 201332 From b03aa3e0ed4d8a5ecadc0bcdfc1689630172ed95 Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 03:40:41 +0100 Subject: [PATCH 26/51] Fixed totem data not saving or synchronizing on a dedicated server. --- .../component/TotemData.java | 28 +++--------- .../item/totem/TotemItem.java | 45 ++++++++++++------- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java b/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java index dbd739d..23d734f 100644 --- a/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java +++ b/src/main/java/dev/micle/totem_of_reviving/component/TotemData.java @@ -29,11 +29,11 @@ public class TotemData { TotemData::new ); - private int targetIndex; - private String targetUUID; - private String targetName; - private int targetDeaths; - private int charge; + private final int targetIndex; + private final String targetUUID; + private final String targetName; + private final int targetDeaths; + private final int charge; public TotemData(int targetIndex, String targetUUID, String targetName, int targetDeaths, int charge) { this.targetIndex = targetIndex; @@ -46,16 +46,10 @@ public class TotemData { public int getTargetIndex() { return targetIndex; } - public void setTargetIndex(int targetIndex) { - this.targetIndex = targetIndex; - } public String getTargetStringUUID() { return targetUUID; } - public void setTargetStringUUID(String targetUUID) { - this.targetUUID = targetUUID; - } public Optional getTargetUUID() { Optional targetUUID = Optional.empty(); @@ -64,30 +58,18 @@ public class TotemData { } catch (IllegalArgumentException ignored) {} return targetUUID; } - public void setTargetUUID(UUID targetUUID) { - this.targetUUID = targetUUID.toString(); - } public String getTargetName() { return targetName; } - public void setTargetName(String targetName) { - this.targetName = targetName; - } public int getTargetDeaths() { return targetDeaths; } - public void setTargetDeaths(int targetDeaths) { - this.targetDeaths = targetDeaths; - } public int getCharge() { return charge; } - public void setCharge(int charge) { - this.charge = charge; - } @Override public int hashCode() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 47cae3e..308f7f5 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -86,26 +86,25 @@ public abstract class TotemItem extends Item { return (stack.getItem() instanceof TotemItem); } - @OnlyIn(Dist.DEDICATED_SERVER) public static Optional cycleTarget(ItemStack itemStack, PlayerList playerList) { if (!isTotem(itemStack)) return Optional.empty(); TotemData totemData = getTotemData(itemStack); int targetIndex = totemData.getTargetIndex() + 1; - targetIndex = targetIndex > playerList.getPlayerCount() ? 0 : targetIndex; + targetIndex = targetIndex >= playerList.getPlayerCount() ? 0 : targetIndex; ServerPlayer target = playerList.getPlayers().get(targetIndex); - totemData.setTargetIndex(targetIndex); - totemData.setTargetUUID(target.getUUID()); - totemData.setTargetName(target.getScoreboardName()); - totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); - - setTotemData(itemStack, totemData); + setTotemData(itemStack, new TotemData( + targetIndex, + target.getStringUUID(), + target.getScoreboardName(), + target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS)), + totemData.getCharge() + )); return Optional.of(totemData); } - @OnlyIn(Dist.DEDICATED_SERVER) public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { if (!isTotem(totemStack)) return false; TotemData totemData = getTotemData(totemStack); @@ -114,14 +113,17 @@ public abstract class TotemItem extends Item { if (!totemItem.isCharge(chargeStack)) return false; if (totemItem.isChargeFull(totemData)) return false; - totemData.setCharge(totemData.getCharge() + 1); - - setTotemData(totemStack, totemData); + setTotemData(totemStack, new TotemData( + totemData.getTargetIndex(), + totemData.getTargetStringUUID(), + totemData.getTargetName(), + totemData.getTargetDeaths(), + totemData.getCharge() + 1 + )); chargeStack.setCount(chargeStack.getCount() - 1); return true; } - @OnlyIn(Dist.DEDICATED_SERVER) public static Component reviveTarget(EquipmentSlot slot, ItemStack itemStack, ServerPlayer user, PlayerList playerList) { if (!isTotem(itemStack)) return Component.empty(); TotemData totemData = getTotemData(itemStack); @@ -138,8 +140,13 @@ public abstract class TotemItem extends Item { return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); } - totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); - setTotemData(itemStack, totemData); + setTotemData(itemStack, new TotemData( + totemData.getTargetIndex(), + totemData.getTargetStringUUID(), + totemData.getTargetName(), + target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS)), + totemData.getCharge() + )); if (!target.isSpectator()) { return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!"); @@ -164,7 +171,13 @@ public abstract class TotemItem extends Item { return Component.literal(ChatFormatting.WHITE + "Unable to get your level!"); } - totemData.setCharge(totemData.getCharge() - totemItem.getTargetCost(totemData)); + setTotemData(itemStack, new TotemData( + totemData.getTargetIndex(), + totemData.getTargetStringUUID(), + totemData.getTargetName(), + totemData.getTargetDeaths(), + totemData.getCharge() - totemItem.getTargetCost(totemData) + )); setTotemData(itemStack, totemData); itemStack.hurtAndBreak(1, user, slot); From 5b2771c1f7c1a5076e01b55f1068e951501dea47 Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 03:57:26 +0100 Subject: [PATCH 27/51] Fixed advanced tooltip key press check. Removed old broken mod key mappings. --- .../item/totem/TotemItem.java | 18 +++++++++++++----- .../setup/ModKeyMappings.java | 9 --------- 2 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 308f7f5..0864562 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -3,8 +3,8 @@ package dev.micle.totem_of_reviving.item.totem; import dev.micle.totem_of_reviving.component.TotemData; import dev.micle.totem_of_reviving.setup.Config; import dev.micle.totem_of_reviving.setup.ModDataComponents; -import dev.micle.totem_of_reviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -19,9 +19,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; +import org.lwjgl.glfw.GLFW; import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; @@ -217,7 +216,7 @@ public abstract class TotemItem extends Item { tooltipComponents.add(Component.empty()); - if (ModKeyMappings.ADVANCED_TOOLTIP.isDown()) { + if (GLFW.glfwGetKey(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_LEFT_SHIFT) == 1) { tooltipComponents.add(Component.literal(ChatFormatting.GRAY + "Showing advanced tooltip.")); tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "R-CLICK" + ChatFormatting.WHITE + "]")); tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "When second hand is empty: revive target.")); @@ -235,17 +234,26 @@ public abstract class TotemItem extends Item { @Override @ParametersAreNonnullByDefault public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { - if (!level.isClientSide) return super.use(level, player, usedHand); + if (level.isClientSide) return super.use(level, player, usedHand); + System.out.println("HERE"); + + EquipmentSlot equipmentSlot = (usedHand.equals(InteractionHand.MAIN_HAND)) ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND; + ItemStack totemStack = (usedHand.equals(InteractionHand.MAIN_HAND)) ? player.getMainHandItem() : player.getOffhandItem(); ItemStack chargeStack = (usedHand.equals(InteractionHand.MAIN_HAND)) ? player.getOffhandItem() : player.getMainHandItem(); if (player.isCrouching()) { // Change Target Packet + Optional totemData = cycleTarget(totemStack, level.getServer().getPlayerList()); + totemData.ifPresent(data -> player.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + data.getTargetName() + "."))); } else { if (isCharge(chargeStack)) { // Charge Totem Packet + chargeTotem(totemStack, chargeStack); } else { // Revive Target Packet + Component message = reviveTarget(equipmentSlot, totemStack, level.getServer().getPlayerList().getPlayer(player.getUUID()), level.getServer().getPlayerList()); + player.sendSystemMessage(message); } } diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java deleted file mode 100644 index 4b3f025..0000000 --- a/src/main/java/dev/micle/totem_of_reviving/setup/ModKeyMappings.java +++ /dev/null @@ -1,9 +0,0 @@ -package dev.micle.totem_of_reviving.setup; - -import com.mojang.blaze3d.platform.InputConstants; -import net.minecraft.client.KeyMapping; - -public class ModKeyMappings { - public static final KeyMapping ADVANCED_TOOLTIP = - new KeyMapping("advanced_tooltips", InputConstants.KEY_LSHIFT, KeyMapping.CATEGORY_INVENTORY); -} From dbabba477a1506980b0bcd67b347d60e27e3b48f Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 04:36:44 +0100 Subject: [PATCH 28/51] CycleTarget method now returns message component. Implemented totem functionality without any extra networking. --- .../item/totem/TotemItem.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 0864562..960a422 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -6,6 +6,7 @@ import dev.micle.totem_of_reviving.setup.ModDataComponents; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; @@ -85,23 +86,24 @@ public abstract class TotemItem extends Item { return (stack.getItem() instanceof TotemItem); } - public static Optional cycleTarget(ItemStack itemStack, PlayerList playerList) { - if (!isTotem(itemStack)) return Optional.empty(); + public static Component cycleTarget(ItemStack itemStack, PlayerList playerList) { + if (!isTotem(itemStack)) return Component.empty(); TotemData totemData = getTotemData(itemStack); int targetIndex = totemData.getTargetIndex() + 1; targetIndex = targetIndex >= playerList.getPlayerCount() ? 0 : targetIndex; ServerPlayer target = playerList.getPlayers().get(targetIndex); - - setTotemData(itemStack, new TotemData( + TotemData newTotemData = new TotemData( targetIndex, target.getStringUUID(), target.getScoreboardName(), target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS)), totemData.getCharge() - )); - return Optional.of(totemData); + ); + + setTotemData(itemStack, newTotemData); + return Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + newTotemData.getTargetName() + "."); } public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { @@ -236,24 +238,23 @@ public abstract class TotemItem extends Item { public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { if (level.isClientSide) return super.use(level, player, usedHand); - System.out.println("HERE"); + MinecraftServer server = level.getServer(); + if (server == null) return super.use(level, player, usedHand); - EquipmentSlot equipmentSlot = (usedHand.equals(InteractionHand.MAIN_HAND)) ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND; + EquipmentSlot slot = (usedHand.equals(InteractionHand.MAIN_HAND)) ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND; ItemStack totemStack = (usedHand.equals(InteractionHand.MAIN_HAND)) ? player.getMainHandItem() : player.getOffhandItem(); ItemStack chargeStack = (usedHand.equals(InteractionHand.MAIN_HAND)) ? player.getOffhandItem() : player.getMainHandItem(); if (player.isCrouching()) { - // Change Target Packet - Optional totemData = cycleTarget(totemStack, level.getServer().getPlayerList()); - totemData.ifPresent(data -> player.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + data.getTargetName() + "."))); + // Change Target + player.sendSystemMessage(cycleTarget(totemStack, server.getPlayerList())); } else { if (isCharge(chargeStack)) { - // Charge Totem Packet + // Charge Totem chargeTotem(totemStack, chargeStack); } else { - // Revive Target Packet - Component message = reviveTarget(equipmentSlot, totemStack, level.getServer().getPlayerList().getPlayer(player.getUUID()), level.getServer().getPlayerList()); - player.sendSystemMessage(message); + // Revive Target + player.sendSystemMessage(reviveTarget(slot, totemStack, server.getPlayerList().getPlayer(player.getUUID()), server.getPlayerList())); } } From 925f244cc02afe46e31286e60fd91c4c20a5854c Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 04:37:21 +0100 Subject: [PATCH 29/51] Removed old networking code. --- .../network/NetworkManager.java | 37 ------------ .../network/client/ChangeTargetPacket.java | 40 ------------- .../network/client/ChargeTotemPacket.java | 34 ----------- .../network/client/ReviveTargetPacket.java | 59 ------------------- .../micle/totem_of_reviving/proxy/Proxy.java | 1 - 5 files changed, 171 deletions(-) delete mode 100644 src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java delete mode 100644 src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java delete mode 100644 src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java delete mode 100644 src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java diff --git a/src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java b/src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java deleted file mode 100644 index bd3b80c..0000000 --- a/src/main/java/dev/micle/totem_of_reviving/network/NetworkManager.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.micle.totem_of_reviving.network; - -public class NetworkManager { -// // Initialize variables -// private static SimpleChannel channel; -// -// public static void init() { -// // Create channel -// channel = NetworkRegistry.ChannelBuilder.named(TotemOfReviving.createResourceLocation("network")) -// .clientAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) -// .serverAcceptedVersions(v -> v.equals(TotemOfReviving.getVersion())) -// .networkProtocolVersion(TotemOfReviving::getVersion) -// .simpleChannel(); -// -// // Register packets -// int id = 0; -// channel.messageBuilder(ChangeTargetPacket.class, id++) -// .encoder(ChangeTargetPacket::encode) -// .decoder(ChangeTargetPacket::decode) -// .consumerNetworkThread(ChangeTargetPacket::handle) -// .add(); -// channel.messageBuilder(ChargeTotemPacket.class, id++) -// .encoder(ChargeTotemPacket::encode) -// .decoder(ChargeTotemPacket::decode) -// .consumerNetworkThread(ChargeTotemPacket::handle) -// .add(); -// channel.messageBuilder(ReviveTargetPacket.class, id++) -// .encoder(ReviveTargetPacket::encode) -// .decoder(ReviveTargetPacket::decode) -// .consumerNetworkThread(ReviveTargetPacket::handle) -// .add(); -// } -// -// public static SimpleChannel getChannel() { -// return channel; -// } -} diff --git a/src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java deleted file mode 100644 index 873d8cb..0000000 --- a/src/main/java/dev/micle/totem_of_reviving/network/client/ChangeTargetPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.micle.totem_of_reviving.network.client; - -public class ChangeTargetPacket { -// private final InteractionHand hand; -// -// public ChangeTargetPacket(final InteractionHand hand) { -// this.hand = hand; -// } -// -// public static void encode(final ChangeTargetPacket packet, final FriendlyByteBuf buffer) { -// buffer.writeEnum(packet.hand); -// } -// -// public static ChangeTargetPacket decode(final FriendlyByteBuf buffer) { -// return new ChangeTargetPacket(buffer.readEnum(InteractionHand.class)); -// } -// -// public static void handle(final ChangeTargetPacket packet, final Supplier contextSupplier) { -// final NetworkEvent.Context context = contextSupplier.get(); -// context.enqueueWork(() -> { -// ServerPlayer sender = context.getSender(); -// if (sender == null) { return; } -// -// ItemStack totemStack = sender.getItemInHand(packet.hand); -// PlayerList playerList = TotemOfReviving.getProxy().getServer().getPlayerList(); -// int targetIndex = TotemItem.getTargetIndex(totemStack) + 1; -// -// if (targetIndex > playerList.getPlayerCount()-1) { targetIndex = 0; } -// ServerPlayer target = playerList.getPlayers().get(targetIndex); -// -// TotemItem.setTargetIndex(totemStack, targetIndex); -// TotemItem.setTargetUUID(totemStack, target.getUUID()); -// TotemItem.setTargetName(totemStack, target.getDisplayName().getString()); -// TotemItem.setTargetDeaths(totemStack, target); -// -// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + target.getDisplayName().getString() + ".")); -// }); -// context.setPacketHandled(true); -// } -} diff --git a/src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java deleted file mode 100644 index c2199e8..0000000 --- a/src/main/java/dev/micle/totem_of_reviving/network/client/ChargeTotemPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package dev.micle.totem_of_reviving.network.client; - -public class ChargeTotemPacket { -// private final InteractionHand hand; -// -// public ChargeTotemPacket(final InteractionHand hand) { -// this.hand = hand; -// } -// -// public static void encode(final ChargeTotemPacket packet, final FriendlyByteBuf buffer) { -// buffer.writeEnum(packet.hand); -// } -// -// public static ChargeTotemPacket decode(final FriendlyByteBuf buffer) { -// return new ChargeTotemPacket(buffer.readEnum(InteractionHand.class)); -// } -// -// public static void handle(final ChargeTotemPacket packet, final Supplier contextSupplier) { -// final NetworkEvent.Context context = contextSupplier.get(); -// context.enqueueWork(() -> { -// ServerPlayer sender = context.getSender(); -// if (sender == null) { return; } -// -// ItemStack totemStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getMainHandItem() : sender.getOffhandItem(); -// ItemStack chargeStack = (packet.hand.equals(InteractionHand.MAIN_HAND)) ? sender.getOffhandItem() : sender.getMainHandItem(); -// -// if (TotemItem.isTotemFull(totemStack)) { return; } -// -// TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) + 1); -// chargeStack.setCount(chargeStack.getCount() - 1); -// }); -// context.setPacketHandled(true); -// } -} diff --git a/src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java b/src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java deleted file mode 100644 index d526777..0000000 --- a/src/main/java/dev/micle/totem_of_reviving/network/client/ReviveTargetPacket.java +++ /dev/null @@ -1,59 +0,0 @@ -package dev.micle.totem_of_reviving.network.client; - -public class ReviveTargetPacket { -// private final InteractionHand hand; -// -// public ReviveTargetPacket(final InteractionHand hand) { -// this.hand = hand; -// } -// -// public static void encode(final ReviveTargetPacket packet, final FriendlyByteBuf buffer) { -// buffer.writeEnum(packet.hand); -// } -// -// public static ReviveTargetPacket decode(final FriendlyByteBuf buffer) { -// return new ReviveTargetPacket(buffer.readEnum(InteractionHand.class)); -// } -// -// public static void handle(final ReviveTargetPacket packet, final Supplier contextSupplier) { -// final NetworkEvent.Context context = contextSupplier.get(); -// context.enqueueWork(() -> { -// ServerPlayer sender = context.getSender(); -// if (sender == null) { return; } -// -// ItemStack totemStack = sender.getItemInHand(packet.hand); -// ServerPlayer target; -// -// try { -// target = TotemOfReviving.getProxy().getServer().getPlayerList().getPlayer(TotemItem.getTargetUUID(totemStack)); -// if (target == null) { throw new NullPointerException("Target is null!"); } -// } catch (NullPointerException exception) { -// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Unable to find player!")); -// return; -// } -// -// if (!target.isSpectator()) { -// sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!")); -// return; -// } -// -// if (!target.serverLevel().equals(sender.serverLevel()) && !TotemItem.canReviveAcrossDimensions(totemStack)) { -// sender.sendSystemMessage(Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!")); -// return; -// } -// -// TotemItem.setTargetDeaths(totemStack, target); -// if (!TotemItem.canTotemAffordTarget(totemStack)) { -// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Not enough charge!")); -// return; -// } -// -// target.teleportTo(sender.serverLevel(), sender.position().x, sender.position().y, sender.position().z, sender.getYRot(), sender.getXRot()); -// target.setGameMode(sender.serverLevel().getServer().getDefaultGameType()); -// TotemItem.setCharge(totemStack, TotemItem.getCharge(totemStack) - TotemItem.getTargetCost(totemStack)); -// totemStack.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); -// sender.sendSystemMessage(Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!")); -// }); -// context.setPacketHandled(true); -// } -} diff --git a/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java b/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java index 0dc55c5..28741aa 100644 --- a/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java +++ b/src/main/java/dev/micle/totem_of_reviving/proxy/Proxy.java @@ -25,7 +25,6 @@ public class Proxy implements IProxy { // Initialize setup Registration.register(modEventBus); Config.init(modContainer); - //NetworkManager.init(); // Register mod event bus listeners modEventBus.addListener(Proxy::setup); From 24d21126b0700be6774d2236a46565ace4b8b96f Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 22:15:41 +0100 Subject: [PATCH 30/51] Implemented LangAsset enum to declare translatable keys for strings. Moved message strings for reviving functionality into lang file. --- .../item/totem/TotemItem.java | 37 +++++++++++------ .../totem_of_reviving/util/LangAsset.java | 41 +++++++++++++++++++ .../assets/totem_of_reviving/lang/en_us.json | 8 +++- 3 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 960a422..7a585a7 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -1,8 +1,10 @@ package dev.micle.totem_of_reviving.item.totem; +import dev.micle.totem_of_reviving.TotemOfReviving; import dev.micle.totem_of_reviving.component.TotemData; import dev.micle.totem_of_reviving.setup.Config; import dev.micle.totem_of_reviving.setup.ModDataComponents; +import dev.micle.totem_of_reviving.util.LangAsset; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; @@ -20,6 +22,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.apache.commons.codec.language.bm.Lang; import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; @@ -133,57 +136,65 @@ public abstract class TotemItem extends Item { Optional targetUUID = totemData.getTargetUUID(); if (targetUUID.isEmpty()) { - return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); + return LangAsset.MESSAGE_UNABLE_TO_FIND_PLAYER.getComponent().withStyle(ChatFormatting.RED); } ServerPlayer target = playerList.getPlayer(targetUUID.get()); if (target == null) { - return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); + return LangAsset.MESSAGE_UNABLE_TO_FIND_PLAYER.getComponent().withStyle(ChatFormatting.RED); } - setTotemData(itemStack, new TotemData( + totemData = new TotemData( totemData.getTargetIndex(), totemData.getTargetStringUUID(), totemData.getTargetName(), target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS)), totemData.getCharge() - )); + ); + setTotemData(itemStack, totemData); if (!target.isSpectator()) { - return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!"); + return LangAsset.MESSAGE_PLAYER_IS_NOT_DEAD.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) + ).withStyle(ChatFormatting.WHITE); } try (ServerLevel targetLevel = target.serverLevel()) { if (!targetLevel.equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { - return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!"); + return LangAsset.MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) + ).withStyle(ChatFormatting.WHITE); } } catch (IOException e) { - return Component.literal(ChatFormatting.WHITE + "Unable to get " + ChatFormatting.GRAY + target.getDisplayName().getString() + "'s " + ChatFormatting.WHITE + " level!"); + return LangAsset.MESSAGE_UNABLE_TO_GET_PLAYER_WORLD.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.DARK_RED) + ).withStyle(ChatFormatting.RED); } if (!totemItem.canAffordTarget(totemData)) { - return Component.literal(ChatFormatting.WHITE + "Not enough charge!"); + return LangAsset.MESSAGE_NOT_ENOUGH_CHARGE.getComponent().withStyle(ChatFormatting.WHITE); } try (ServerLevel userLevel = user.serverLevel()) { target.teleportTo(userLevel, user.position().x, user.position().y, user.position().z, user.getYRot(), user.getXRot()); target.setGameMode(userLevel.getServer().getDefaultGameType()); } catch (IOException e) { - return Component.literal(ChatFormatting.WHITE + "Unable to get your level!"); + return LangAsset.MESSAGE_UNABLE_TO_GET_YOUR_WORLD.getComponent().withStyle(ChatFormatting.RED); } - setTotemData(itemStack, new TotemData( + totemData = new TotemData( totemData.getTargetIndex(), totemData.getTargetStringUUID(), totemData.getTargetName(), totemData.getTargetDeaths(), totemData.getCharge() - totemItem.getTargetCost(totemData) - )); - + ); setTotemData(itemStack, totemData); itemStack.hurtAndBreak(1, user, slot); - return Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!"); + return LangAsset.MESSAGE_SUCCESSFULLY_REVIVED_TARGET.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.DARK_GREEN) + ).withStyle(ChatFormatting.GREEN); } @Override diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java new file mode 100644 index 0000000..a704cce --- /dev/null +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -0,0 +1,41 @@ +package dev.micle.totem_of_reviving.util; + +import dev.micle.totem_of_reviving.TotemOfReviving; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.contents.TranslatableContents; + +public enum LangAsset { + ITEM_GROUP_MAIN("itemGroup", "main"), + ITEM_STRAW_TOTEM("item", "straw_totem"), + ITEM_IRON_TOTEM("item", "iron_totem"), + ITEM_DIAMOND_TOTEM("item", "diamond_totem"), + ITEM_NETHERITE_TOTEM("item", "netherite_totem"), + ITEM_STRAW_CHARGE("item", "straw_charge"), + ITEM_IRON_CHARGE("item", "iron_charge"), + ITEM_DIAMOND_CHARGE("item", "diamond_charge"), + ITEM_NETHERITE_CHARGE("item", "netherite_charge"), + MESSAGE_UNABLE_TO_FIND_PLAYER("message", "unable_to_find_player"), + MESSAGE_PLAYER_IS_NOT_DEAD("message", "player_is_not_dead"), + MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION("message", "player_is_in_another_dimension"), + MESSAGE_UNABLE_TO_GET_PLAYER_WORLD("message", "unable_to_get_player_world"), + MESSAGE_NOT_ENOUGH_CHARGE("message", "not_enough_charge"), + MESSAGE_UNABLE_TO_GET_YOUR_WORLD("message", "unable_to_get_your_world"), + MESSAGE_SUCCESSFULLY_REVIVED_TARGET("message", "successfully_revived_target"); + + private final String category; + private final String key; + + private LangAsset(String category, String key) { + this.category = category; + this.key = key; + } + + public MutableComponent getComponent() { + return getComponent(TranslatableContents.NO_ARGS); + } + + public MutableComponent getComponent(Object ...args) { + return Component.translatable(String.format("%s.%s.%s", category, TotemOfReviving.MOD_ID, key), args); + } +} diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index bd1aab9..86cd72c 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -8,5 +8,11 @@ "item.totem_of_reviving.iron_charge": "Iron reviving charge", "item.totem_of_reviving.diamond_charge": "Diamond reviving charge", "item.totem_of_reviving.netherite_charge": "Netherite reviving charge", - "advanced_tooltips": "advanced_tooltips" + "message.totem_of_reviving.unable_to_find_player": "Unable to find player!", + "message.totem_of_reviving.player_is_not_dead": "%s is not dead!", + "message.totem_of_reviving.player_is_in_another_dimension": "%s is in a different dimension!", + "message.totem_of_reviving.unable_to_get_player_world": "Unable to get %s's world!", + "message.totem_of_reviving.not_enough_charge": "Not enough charge!", + "message.totem_of_reviving.unable_to_get_your_world": "Unable to get your world!", + "message.totem_of_reviving.successfully_revived_target": "Successfully revived %s!" } \ No newline at end of file From 684cb23f7427824994f58f44fd0fb7e2d3e66fa1 Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 22:19:00 +0100 Subject: [PATCH 31/51] Ported cycle totem message to lang file. --- .../dev/micle/totem_of_reviving/item/totem/TotemItem.java | 8 +++++--- .../java/dev/micle/totem_of_reviving/util/LangAsset.java | 3 ++- .../resources/assets/totem_of_reviving/lang/en_us.json | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 7a585a7..b921044 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -97,7 +97,7 @@ public abstract class TotemItem extends Item { targetIndex = targetIndex >= playerList.getPlayerCount() ? 0 : targetIndex; ServerPlayer target = playerList.getPlayers().get(targetIndex); - TotemData newTotemData = new TotemData( + totemData = new TotemData( targetIndex, target.getStringUUID(), target.getScoreboardName(), @@ -105,8 +105,10 @@ public abstract class TotemItem extends Item { totemData.getCharge() ); - setTotemData(itemStack, newTotemData); - return Component.literal(ChatFormatting.WHITE + "Now targetting " + ChatFormatting.GRAY + newTotemData.getTargetName() + "."); + setTotemData(itemStack, totemData); + return LangAsset.MESSAGE_NOW_TARGETING.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) + ).withStyle(ChatFormatting.WHITE); } public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index a704cce..eb6237f 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -21,7 +21,8 @@ public enum LangAsset { MESSAGE_UNABLE_TO_GET_PLAYER_WORLD("message", "unable_to_get_player_world"), MESSAGE_NOT_ENOUGH_CHARGE("message", "not_enough_charge"), MESSAGE_UNABLE_TO_GET_YOUR_WORLD("message", "unable_to_get_your_world"), - MESSAGE_SUCCESSFULLY_REVIVED_TARGET("message", "successfully_revived_target"); + MESSAGE_SUCCESSFULLY_REVIVED_TARGET("message", "successfully_revived_target"), + MESSAGE_NOW_TARGETING("message", "now_targeting"); private final String category; private final String key; diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 86cd72c..8141759 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -14,5 +14,6 @@ "message.totem_of_reviving.unable_to_get_player_world": "Unable to get %s's world!", "message.totem_of_reviving.not_enough_charge": "Not enough charge!", "message.totem_of_reviving.unable_to_get_your_world": "Unable to get your world!", - "message.totem_of_reviving.successfully_revived_target": "Successfully revived %s!" + "message.totem_of_reviving.successfully_revived_target": "Successfully revived %s!", + "message.totem_of_reviving.now_targeting": "Now targeting %s." } \ No newline at end of file From 8bc56f76deee7a70fd56c77204b9e9ae3d5504ac Mon Sep 17 00:00:00 2001 From: micle Date: Mon, 12 Jan 2026 22:20:55 +0100 Subject: [PATCH 32/51] Removed hard coded lang string reference. --- .../micle/totem_of_reviving/setup/ModCreativeModeTabs.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java index e526a87..03a6eec 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModCreativeModeTabs.java @@ -1,14 +1,13 @@ package dev.micle.totem_of_reviving.setup; -import dev.micle.totem_of_reviving.TotemOfReviving; -import net.minecraft.network.chat.Component; +import dev.micle.totem_of_reviving.util.LangAsset; import net.minecraft.world.item.CreativeModeTab; import net.neoforged.neoforge.registries.DeferredHolder; public class ModCreativeModeTabs { public static DeferredHolder MAIN = Registration.CREATIVE_MODE_TABS.register("main", () -> CreativeModeTab.builder() - .title(Component.translatable(String.format("itemGroup.%s.main", TotemOfReviving.MOD_ID))) + .title(LangAsset.ITEM_GROUP_MAIN.getComponent()) .icon(ModItems.STRAW_TOTEM.get()::getDefaultInstance) .displayItems((itemDisplayParameters, output) -> { output.accept(ModItems.STRAW_TOTEM.get()); From 11e6aee70e3bd102a439f0dc1bb2eacd672f93dc Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 00:10:47 +0100 Subject: [PATCH 33/51] Reworked tooltip for totems to look better and be translatable via lang files. Implemented helper method for creating text components displaying keybind keys. --- .../item/totem/TotemItem.java | 67 +++++++++++-------- .../totem_of_reviving/util/LangAsset.java | 30 +++++++++ .../assets/totem_of_reviving/lang/en_us.json | 12 ++++ 3 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index b921044..d9018a4 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -1,6 +1,6 @@ package dev.micle.totem_of_reviving.item.totem; -import dev.micle.totem_of_reviving.TotemOfReviving; +import com.mojang.blaze3d.platform.InputConstants; import dev.micle.totem_of_reviving.component.TotemData; import dev.micle.totem_of_reviving.setup.Config; import dev.micle.totem_of_reviving.setup.ModDataComponents; @@ -22,9 +22,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.apache.commons.codec.language.bm.Lang; import org.jetbrains.annotations.NotNull; -import org.lwjgl.glfw.GLFW; import javax.annotation.ParametersAreNonnullByDefault; import java.io.IOException; @@ -202,45 +200,56 @@ public abstract class TotemItem extends Item { @Override @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + Minecraft minecraft = Minecraft.getInstance(); TotemData totemData = getTotemData(stack); - Optional targetUUID = totemData.getTargetUUID(); - if (targetUUID.isEmpty()) { - tooltipComponents.add(Component.literal(ChatFormatting.RED + "Target: " + ChatFormatting.DARK_RED + "N/A")); - } else { - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Target: " + ChatFormatting.GRAY + totemData.getTargetName())); - } + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET.getComponent( + totemData.getTargetUUID().isPresent() + ? Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) + : LangAsset.GENERAL_NA.getComponent().withStyle(ChatFormatting.RED) + ).withStyle(ChatFormatting.WHITE)); + + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET_COST.getComponent( + Component.literal(String.format("%d", getTargetCost(totemData))).withStyle( + getTargetCost(totemData) <= getMaxCharge() + ? ChatFormatting.GRAY + : ChatFormatting.RED + ) + ).withStyle(ChatFormatting.WHITE)); + + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHARGES.getComponent( + Component.literal(String.format("%d/%d", totemData.getCharge(), getMaxCharge())).withStyle(ChatFormatting.GRAY) + ).withStyle(ChatFormatting.WHITE)); tooltipComponents.add(Component.empty()); - - if (!canAffordTarget(totemData)) { - tooltipComponents.add(Component.literal(ChatFormatting.RED + "Charges: " + ChatFormatting.DARK_RED + "(" + totemData.getCharge() + "/" + getTargetCost(totemData) + ") " + - ChatFormatting.RED + "[Max: " + ChatFormatting.DARK_RED + getMaxCharge() + ChatFormatting.RED + "] [Multi: " + ChatFormatting.DARK_RED + getConfig().getChargeCostMultiplier() + ChatFormatting.RED + "]")); - } else { - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Charges: " + ChatFormatting.GRAY + "(" + totemData.getCharge() + "/" + getTargetCost(totemData) + ") " + - ChatFormatting.WHITE + "[Max: " + ChatFormatting.GRAY + getMaxCharge() + ChatFormatting.WHITE + "] [Multi: " + ChatFormatting.GRAY + getConfig().getChargeCostMultiplier() + ChatFormatting.WHITE + "]")); + if (isChargeCostDynamic()) { + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_DYNAMIC_COST.getComponent( + Component.literal(String.format("%.2f", getConfig().getChargeCostMultiplier())).withStyle(ChatFormatting.GRAY) + ).withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); } - if (getConfig().getCanReviveMoreExpensiveTargets()) { - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Can revive more expensive targets.")); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); } - if (getConfig().getCanReviveAcrossDimensions()) { - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Can revive targets across dimensions.")); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); } tooltipComponents.add(Component.empty()); - if (GLFW.glfwGetKey(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_LEFT_SHIFT) == 1) { - tooltipComponents.add(Component.literal(ChatFormatting.GRAY + "Showing advanced tooltip.")); - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "R-CLICK" + ChatFormatting.WHITE + "]")); - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "When second hand is empty: revive target.")); - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "When second hand is holding a reviving charge: charge totem.")); - tooltipComponents.add(Component.literal("")); - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "[" + ChatFormatting.GRAY + "L-SHIFT + R-CLICK" + ChatFormatting.WHITE + "]")); - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Change target.")); + if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), minecraft.options.keyShift.getKey().getValue())) { + tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_SHOWN.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.UNDERLINE)); + + tooltipComponents.add(LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyUse)); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_REVIVE_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHARGE_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); + tooltipComponents.add(Component.empty()); + + tooltipComponents.add(LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyShift, minecraft.options.keyUse)); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); } else { - tooltipComponents.add(Component.literal(ChatFormatting.GRAY + "Hold [" + ChatFormatting.DARK_GRAY + "L-SHIFT" + ChatFormatting.GRAY + "] for advanced tooltip.")); + tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_HIDDEN.getComponent( + LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyShift) + )); } super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index eb6237f..eb1e2b8 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -1,10 +1,16 @@ package dev.micle.totem_of_reviving.util; import dev.micle.totem_of_reviving.TotemOfReviving; +import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; +import java.util.ArrayList; +import java.util.List; + public enum LangAsset { ITEM_GROUP_MAIN("itemGroup", "main"), ITEM_STRAW_TOTEM("item", "straw_totem"), @@ -15,6 +21,18 @@ public enum LangAsset { ITEM_IRON_CHARGE("item", "iron_charge"), ITEM_DIAMOND_CHARGE("item", "diamond_charge"), ITEM_NETHERITE_CHARGE("item", "netherite_charge"), + TOOLTIP_TOTEM_TARGET("tooltip", "totem_target"), + TOOLTIP_TOTEM_TARGET_COST("tooltip", "totem_target_cost"), + TOOLTIP_TOTEM_CHARGES("tooltip", "totem_charges"), + TOOLTIP_TOTEM_DYNAMIC_COST("tooltip", "totem_dynamic_cost"), + TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS("tooltip", "totem_can_revive_more_expensive_targets"), + TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS("tooltip", "totem_can_revive_across_dimensions"), + TOOLTIP_TOTEM_REVIVE_INSTRUCTION("tooltip", "totem_revive_instruction"), + TOOLTIP_TOTEM_CHARGE_INSTRUCTION("tooltip", "totem_charge_instruction"), + TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION("tooltip", "totem_change_target_instructions"), + TOOLTIP_ADVANCED_TOOLTIP_HIDDEN("tooltip", "advanced_tooltip_hidden"), + TOOLTIP_ADVANCED_TOOLTIP_SHOWN("tooltip", "advanced_tooltip_shown"), + GENERAL_NA("general", "na"), MESSAGE_UNABLE_TO_FIND_PLAYER("message", "unable_to_find_player"), MESSAGE_PLAYER_IS_NOT_DEAD("message", "player_is_not_dead"), MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION("message", "player_is_in_another_dimension"), @@ -39,4 +57,16 @@ public enum LangAsset { public MutableComponent getComponent(Object ...args) { return Component.translatable(String.format("%s.%s.%s", category, TotemOfReviving.MOD_ID, key), args); } + + public static Component createKeyText(boolean isEnclosed, ChatFormatting[] textFormat, ChatFormatting[] keyFormat, KeyMapping...keys) { + List textComponents = new ArrayList<>(); + textComponents.add(isEnclosed ? Component.literal("[").withStyle(textFormat) : Component.empty()); + for (int i = 0; i < keys.length; i++) { + if (i > 0) textComponents.add(Component.literal(" + ").withStyle(textFormat)); + textComponents.add(Component.literal(keys[i].getKey().getDisplayName().getString()).withStyle(keyFormat)); + } + textComponents.add(isEnclosed ? Component.literal("]").withStyle(textFormat) : Component.empty()); + + return ComponentUtils.formatList(textComponents, Component.empty()); + } } diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 8141759..01a7793 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -8,6 +8,18 @@ "item.totem_of_reviving.iron_charge": "Iron reviving charge", "item.totem_of_reviving.diamond_charge": "Diamond reviving charge", "item.totem_of_reviving.netherite_charge": "Netherite reviving charge", + "tooltip.totem_of_reviving.totem_target": "Target -> %s", + "tooltip.totem_of_reviving.totem_target_cost": "Cost -> %s", + "tooltip.totem_of_reviving.totem_charges": "Charges -> %s", + "tooltip.totem_of_reviving.totem_dynamic_cost": "Dynamic cost (Multiplier: %s).", + "tooltip.totem_of_reviving.totem_can_revive_more_expensive_targets": "Can revive more expensive targets.", + "tooltip.totem_of_reviving.totem_can_revive_across_dimensions": "Can revive across dimensions.", + "tooltip.totem_of_reviving.totem_revive_instruction": "When second hand is empty: revive target.", + "tooltip.totem_of_reviving.totem_charge_instruction": "When second hand has a reviving charge: charge totem.", + "tooltip.totem_of_reviving.totem_change_target_instructions": "Change target.", + "tooltip.totem_of_reviving.advanced_tooltip_hidden": "Hold %s for advanced tooltip.", + "tooltip.totem_of_reviving.advanced_tooltip_shown": "Showing advanced tooltip:", + "general.totem_of_reviving.na": "N/A", "message.totem_of_reviving.unable_to_find_player": "Unable to find player!", "message.totem_of_reviving.player_is_not_dead": "%s is not dead!", "message.totem_of_reviving.player_is_in_another_dimension": "%s is in a different dimension!", From 984f5ca8d63097e4106116e39f4293346ae64a6d Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 00:43:46 +0100 Subject: [PATCH 34/51] Improved look of tooltips. Changed colors to improve readability. Implemented helper method for adding indent to components. --- .../item/totem/TotemItem.java | 36 +++++++++---------- .../totem_of_reviving/util/LangAsset.java | 11 ++++-- .../assets/totem_of_reviving/lang/en_us.json | 6 ++-- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index d9018a4..12b2820 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -205,51 +205,51 @@ public abstract class TotemItem extends Item { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET.getComponent( totemData.getTargetUUID().isPresent() - ? Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) + ? Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) : LangAsset.GENERAL_NA.getComponent().withStyle(ChatFormatting.RED) - ).withStyle(ChatFormatting.WHITE)); + ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET_COST.getComponent( Component.literal(String.format("%d", getTargetCost(totemData))).withStyle( getTargetCost(totemData) <= getMaxCharge() - ? ChatFormatting.GRAY + ? ChatFormatting.WHITE : ChatFormatting.RED ) - ).withStyle(ChatFormatting.WHITE)); + ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHARGES.getComponent( - Component.literal(String.format("%d/%d", totemData.getCharge(), getMaxCharge())).withStyle(ChatFormatting.GRAY) - ).withStyle(ChatFormatting.WHITE)); + Component.literal(String.format("%d / %d", totemData.getCharge(), getMaxCharge())).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add(Component.empty()); if (isChargeCostDynamic()) { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_DYNAMIC_COST.getComponent( - Component.literal(String.format("%.2f", getConfig().getChargeCostMultiplier())).withStyle(ChatFormatting.GRAY) - ).withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); + Component.literal(String.format("%.2f", getConfig().getChargeCostMultiplier())).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } if (getConfig().getCanReviveMoreExpensiveTargets()) { - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } if (getConfig().getCanReviveAcrossDimensions()) { - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.ITALIC)); + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } tooltipComponents.add(Component.empty()); if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), minecraft.options.keyShift.getKey().getValue())) { - tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_SHOWN.getComponent().withStyle(ChatFormatting.WHITE, ChatFormatting.UNDERLINE)); + tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_SHOWN.getComponent().withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.UNDERLINE)); - tooltipComponents.add(LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyUse)); - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_REVIVE_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHARGE_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); + tooltipComponents.add(LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyUse)); + tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_REVIVE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); + tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHARGE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); tooltipComponents.add(Component.empty()); - tooltipComponents.add(LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyShift, minecraft.options.keyUse)); - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION.getComponent().withStyle(ChatFormatting.WHITE)); + tooltipComponents.add(LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift, minecraft.options.keyUse)); + tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); } else { tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_HIDDEN.getComponent( - LangAsset.createKeyText(true, new ChatFormatting[]{ChatFormatting.WHITE}, new ChatFormatting[]{ChatFormatting.GRAY}, minecraft.options.keyShift) - )); + LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift) + ).withStyle(ChatFormatting.GRAY)); } super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index eb1e2b8..99f4732 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -58,7 +58,14 @@ public enum LangAsset { return Component.translatable(String.format("%s.%s.%s", category, TotemOfReviving.MOD_ID, key), args); } - public static Component createKeyText(boolean isEnclosed, ChatFormatting[] textFormat, ChatFormatting[] keyFormat, KeyMapping...keys) { + public static MutableComponent addIndentToComponent(Component component, int indentLevel) { + List components = new ArrayList<>(); + components.add(Component.literal(" ".repeat(indentLevel))); + components.add(component); + return (MutableComponent) ComponentUtils.formatList(components, Component.empty()); + } + + public static MutableComponent createKeyText(boolean isEnclosed, ChatFormatting[] textFormat, ChatFormatting[] keyFormat, KeyMapping...keys) { List textComponents = new ArrayList<>(); textComponents.add(isEnclosed ? Component.literal("[").withStyle(textFormat) : Component.empty()); for (int i = 0; i < keys.length; i++) { @@ -67,6 +74,6 @@ public enum LangAsset { } textComponents.add(isEnclosed ? Component.literal("]").withStyle(textFormat) : Component.empty()); - return ComponentUtils.formatList(textComponents, Component.empty()); + return (MutableComponent) ComponentUtils.formatList(textComponents, Component.empty()); } } diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 01a7793..be3a26d 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -8,9 +8,9 @@ "item.totem_of_reviving.iron_charge": "Iron reviving charge", "item.totem_of_reviving.diamond_charge": "Diamond reviving charge", "item.totem_of_reviving.netherite_charge": "Netherite reviving charge", - "tooltip.totem_of_reviving.totem_target": "Target -> %s", - "tooltip.totem_of_reviving.totem_target_cost": "Cost -> %s", - "tooltip.totem_of_reviving.totem_charges": "Charges -> %s", + "tooltip.totem_of_reviving.totem_target": "Target: %s", + "tooltip.totem_of_reviving.totem_target_cost": "Cost: %s", + "tooltip.totem_of_reviving.totem_charges": "Charges: %s", "tooltip.totem_of_reviving.totem_dynamic_cost": "Dynamic cost (Multiplier: %s).", "tooltip.totem_of_reviving.totem_can_revive_more_expensive_targets": "Can revive more expensive targets.", "tooltip.totem_of_reviving.totem_can_revive_across_dimensions": "Can revive across dimensions.", From 859775d7b5b1502999ced7cdfb68e9f865916a64 Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 00:44:46 +0100 Subject: [PATCH 35/51] Inverted colors to improve readability of messages. --- .../item/totem/TotemItem.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 12b2820..ac25f6a 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -105,8 +105,8 @@ public abstract class TotemItem extends Item { setTotemData(itemStack, totemData); return LangAsset.MESSAGE_NOW_TARGETING.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) - ).withStyle(ChatFormatting.WHITE); + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY); } public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { @@ -155,20 +155,20 @@ public abstract class TotemItem extends Item { if (!target.isSpectator()) { return LangAsset.MESSAGE_PLAYER_IS_NOT_DEAD.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) - ).withStyle(ChatFormatting.WHITE); + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY); } try (ServerLevel targetLevel = target.serverLevel()) { if (!targetLevel.equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { return LangAsset.MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GRAY) - ).withStyle(ChatFormatting.WHITE); + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY); } } catch (IOException e) { return LangAsset.MESSAGE_UNABLE_TO_GET_PLAYER_WORLD.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.DARK_RED) - ).withStyle(ChatFormatting.RED); + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.RED) + ).withStyle(ChatFormatting.DARK_RED); } if (!totemItem.canAffordTarget(totemData)) { @@ -193,8 +193,8 @@ public abstract class TotemItem extends Item { itemStack.hurtAndBreak(1, user, slot); return LangAsset.MESSAGE_SUCCESSFULLY_REVIVED_TARGET.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.DARK_GREEN) - ).withStyle(ChatFormatting.GREEN); + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.GREEN) + ).withStyle(ChatFormatting.DARK_GREEN); } @Override From b0c5e9ba3dc17e1d2065d0e0955b2adbcfddb446 Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 01:04:50 +0100 Subject: [PATCH 36/51] Converted charge item tooltip to use lang file. Improved tooltip to display corresponding totem's name. --- .../micle/totem_of_reviving/item/charge/ChargeItem.java | 9 +++++++-- .../totem_of_reviving/item/charge/DiamondChargeItem.java | 7 +++++++ .../totem_of_reviving/item/charge/IronChargeItem.java | 7 +++++++ .../item/charge/NetheriteChargeItem.java | 7 +++++++ .../totem_of_reviving/item/charge/StrawChargeItem.java | 7 +++++++ .../java/dev/micle/totem_of_reviving/util/LangAsset.java | 1 + .../resources/assets/totem_of_reviving/lang/en_us.json | 1 + 7 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java index 1433a9c..5c21395 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java @@ -1,5 +1,6 @@ package dev.micle.totem_of_reviving.item.charge; +import dev.micle.totem_of_reviving.util.LangAsset; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.Item; @@ -10,11 +11,13 @@ import net.minecraft.world.item.TooltipFlag; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -public class ChargeItem extends Item { +public abstract class ChargeItem extends Item { public ChargeItem(Properties properties) { super(properties); } + public abstract Component getTotemDisplayName(); + public static Properties createProperties(Rarity rarity, boolean isFireResistant) { Properties properties = new Properties().stacksTo(64).rarity(rarity); @@ -26,7 +29,9 @@ public class ChargeItem extends Item { @Override @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { - tooltipComponents.add(Component.literal(ChatFormatting.WHITE + "Used for charging its corresponding totem.")); + tooltipComponents.add(LangAsset.TOOLTIP_CHARGE.getComponent( + getTotemDisplayName() + ).withStyle(ChatFormatting.GRAY)); super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); } } diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java index 17a4d18..98df2c0 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java @@ -1,5 +1,7 @@ package dev.micle.totem_of_reviving.item.charge; +import dev.micle.totem_of_reviving.setup.ModItems; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.Rarity; public class DiamondChargeItem extends ChargeItem { @@ -10,4 +12,9 @@ public class DiamondChargeItem extends ChargeItem { public static String getName() { return "diamond_charge"; } + + @Override + public Component getTotemDisplayName() { + return ModItems.DIAMOND_TOTEM.get().getDefaultInstance().getDisplayName(); + } } diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java index f508826..ac5c159 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java @@ -1,5 +1,7 @@ package dev.micle.totem_of_reviving.item.charge; +import dev.micle.totem_of_reviving.setup.ModItems; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.Rarity; public class IronChargeItem extends ChargeItem { @@ -10,4 +12,9 @@ public class IronChargeItem extends ChargeItem { public static String getName() { return "iron_charge"; } + + @Override + public Component getTotemDisplayName() { + return ModItems.IRON_TOTEM.get().getDefaultInstance().getDisplayName(); + } } diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java index 4022007..12cd415 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java @@ -1,5 +1,7 @@ package dev.micle.totem_of_reviving.item.charge; +import dev.micle.totem_of_reviving.setup.ModItems; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.Rarity; public class NetheriteChargeItem extends ChargeItem { @@ -10,4 +12,9 @@ public class NetheriteChargeItem extends ChargeItem { public static String getName() { return "netherite_charge"; } + + @Override + public Component getTotemDisplayName() { + return ModItems.NETHERITE_TOTEM.get().getDefaultInstance().getDisplayName(); + } } diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java index 53ee330..3ccdad8 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java @@ -1,5 +1,7 @@ package dev.micle.totem_of_reviving.item.charge; +import dev.micle.totem_of_reviving.setup.ModItems; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.Rarity; public class StrawChargeItem extends ChargeItem { @@ -10,4 +12,9 @@ public class StrawChargeItem extends ChargeItem { public static String getName() { return "straw_charge"; } + + @Override + public Component getTotemDisplayName() { + return ModItems.STRAW_TOTEM.get().getDefaultInstance().getDisplayName(); + } } diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index 99f4732..86a253b 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -30,6 +30,7 @@ public enum LangAsset { TOOLTIP_TOTEM_REVIVE_INSTRUCTION("tooltip", "totem_revive_instruction"), TOOLTIP_TOTEM_CHARGE_INSTRUCTION("tooltip", "totem_charge_instruction"), TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION("tooltip", "totem_change_target_instructions"), + TOOLTIP_CHARGE("tooltip", "charge"), TOOLTIP_ADVANCED_TOOLTIP_HIDDEN("tooltip", "advanced_tooltip_hidden"), TOOLTIP_ADVANCED_TOOLTIP_SHOWN("tooltip", "advanced_tooltip_shown"), GENERAL_NA("general", "na"), diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index be3a26d..9fa798d 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -17,6 +17,7 @@ "tooltip.totem_of_reviving.totem_revive_instruction": "When second hand is empty: revive target.", "tooltip.totem_of_reviving.totem_charge_instruction": "When second hand has a reviving charge: charge totem.", "tooltip.totem_of_reviving.totem_change_target_instructions": "Change target.", + "tooltip.totem_of_reviving.charge": "Used for charging the %s", "tooltip.totem_of_reviving.advanced_tooltip_hidden": "Hold %s for advanced tooltip.", "tooltip.totem_of_reviving.advanced_tooltip_shown": "Showing advanced tooltip:", "general.totem_of_reviving.na": "N/A", From 9afca9c3b9bbb5b6c5d5f3d341ecd2e3930c6fa1 Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 01:07:20 +0100 Subject: [PATCH 37/51] Extracted general methods from LangAsset into ComponentHelper class. --- .../item/totem/TotemItem.java | 13 ++++---- .../util/ComponentHelper.java | 31 +++++++++++++++++++ .../totem_of_reviving/util/LangAsset.java | 25 --------------- 3 files changed, 38 insertions(+), 31 deletions(-) create mode 100644 src/main/java/dev/micle/totem_of_reviving/util/ComponentHelper.java diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index ac25f6a..d0945da 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.InputConstants; import dev.micle.totem_of_reviving.component.TotemData; import dev.micle.totem_of_reviving.setup.Config; import dev.micle.totem_of_reviving.setup.ModDataComponents; +import dev.micle.totem_of_reviving.util.ComponentHelper; import dev.micle.totem_of_reviving.util.LangAsset; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -239,16 +240,16 @@ public abstract class TotemItem extends Item { if (InputConstants.isKeyDown(minecraft.getWindow().getWindow(), minecraft.options.keyShift.getKey().getValue())) { tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_SHOWN.getComponent().withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.UNDERLINE)); - tooltipComponents.add(LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyUse)); - tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_REVIVE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); - tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHARGE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); + tooltipComponents.add(ComponentHelper.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyUse)); + tooltipComponents.add(ComponentHelper.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_REVIVE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); + tooltipComponents.add(ComponentHelper.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHARGE_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); tooltipComponents.add(Component.empty()); - tooltipComponents.add(LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift, minecraft.options.keyUse)); - tooltipComponents.add(LangAsset.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); + tooltipComponents.add(ComponentHelper.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift, minecraft.options.keyUse)); + tooltipComponents.add(ComponentHelper.addIndentToComponent(LangAsset.TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION.getComponent().withStyle(ChatFormatting.GRAY), 1)); } else { tooltipComponents.add(LangAsset.TOOLTIP_ADVANCED_TOOLTIP_HIDDEN.getComponent( - LangAsset.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift) + ComponentHelper.createKeyText(false, new ChatFormatting[]{ChatFormatting.GOLD}, new ChatFormatting[]{ChatFormatting.GOLD, ChatFormatting.ITALIC}, minecraft.options.keyShift) ).withStyle(ChatFormatting.GRAY)); } diff --git a/src/main/java/dev/micle/totem_of_reviving/util/ComponentHelper.java b/src/main/java/dev/micle/totem_of_reviving/util/ComponentHelper.java new file mode 100644 index 0000000..511a783 --- /dev/null +++ b/src/main/java/dev/micle/totem_of_reviving/util/ComponentHelper.java @@ -0,0 +1,31 @@ +package dev.micle.totem_of_reviving.util; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.MutableComponent; + +import java.util.ArrayList; +import java.util.List; + +public final class ComponentHelper { + public static MutableComponent addIndentToComponent(Component component, int indentLevel) { + List components = new ArrayList<>(); + components.add(Component.literal(" ".repeat(indentLevel))); + components.add(component); + return (MutableComponent) ComponentUtils.formatList(components, Component.empty()); + } + + public static MutableComponent createKeyText(boolean isEnclosed, ChatFormatting[] textFormat, ChatFormatting[] keyFormat, KeyMapping...keys) { + List textComponents = new ArrayList<>(); + textComponents.add(isEnclosed ? Component.literal("[").withStyle(textFormat) : Component.empty()); + for (int i = 0; i < keys.length; i++) { + if (i > 0) textComponents.add(Component.literal(" + ").withStyle(textFormat)); + textComponents.add(Component.literal(keys[i].getKey().getDisplayName().getString()).withStyle(keyFormat)); + } + textComponents.add(isEnclosed ? Component.literal("]").withStyle(textFormat) : Component.empty()); + + return (MutableComponent) ComponentUtils.formatList(textComponents, Component.empty()); + } +} diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index 86a253b..a57a355 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -1,16 +1,10 @@ package dev.micle.totem_of_reviving.util; import dev.micle.totem_of_reviving.TotemOfReviving; -import net.minecraft.ChatFormatting; -import net.minecraft.client.KeyMapping; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.contents.TranslatableContents; -import java.util.ArrayList; -import java.util.List; - public enum LangAsset { ITEM_GROUP_MAIN("itemGroup", "main"), ITEM_STRAW_TOTEM("item", "straw_totem"), @@ -58,23 +52,4 @@ public enum LangAsset { public MutableComponent getComponent(Object ...args) { return Component.translatable(String.format("%s.%s.%s", category, TotemOfReviving.MOD_ID, key), args); } - - public static MutableComponent addIndentToComponent(Component component, int indentLevel) { - List components = new ArrayList<>(); - components.add(Component.literal(" ".repeat(indentLevel))); - components.add(component); - return (MutableComponent) ComponentUtils.formatList(components, Component.empty()); - } - - public static MutableComponent createKeyText(boolean isEnclosed, ChatFormatting[] textFormat, ChatFormatting[] keyFormat, KeyMapping...keys) { - List textComponents = new ArrayList<>(); - textComponents.add(isEnclosed ? Component.literal("[").withStyle(textFormat) : Component.empty()); - for (int i = 0; i < keys.length; i++) { - if (i > 0) textComponents.add(Component.literal(" + ").withStyle(textFormat)); - textComponents.add(Component.literal(keys[i].getKey().getDisplayName().getString()).withStyle(keyFormat)); - } - textComponents.add(isEnclosed ? Component.literal("]").withStyle(textFormat) : Component.empty()); - - return (MutableComponent) ComponentUtils.formatList(textComponents, Component.empty()); - } } From b4d6a9dba141432e355a32e088cccee3ad292667 Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 01:52:09 +0100 Subject: [PATCH 38/51] Ensuring target costs at least 1 charge when using dynamic cost. --- .../java/dev/micle/totem_of_reviving/item/totem/TotemItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index d0945da..20f77a1 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -68,7 +68,7 @@ public abstract class TotemItem extends Item { private int getTargetCost(TotemData totemData) { return isChargeCostDynamic() - ? (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier()) + ? Math.max(1, (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier())) : getConfig().getChargeCost(); } From 5a9fd203d3ad2ff5451383c8fa7ced31b8013467 Mon Sep 17 00:00:00 2001 From: micle Date: Wed, 14 Jan 2026 02:23:06 +0100 Subject: [PATCH 39/51] Bumped version number. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6a86757..c6c6737 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ org.gradle.configuration-cache=true mod_id=totem_of_reviving mod_name=Micle's Totem of Reviving mod_license=All Rights Reserved -mod_version=2.0.0 +mod_version=3.0.0 mod_group_id=dev.micle mod_authors=Micle mod_description=Totems to revive your friends in hardcore. From 7afc1956bb5e150f908cde1ad30889026ca63178 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:00:36 +0100 Subject: [PATCH 40/51] Reworked durability configs to be dynamically set during inventory tick update whenever a config change is detected. Added unbreakable text to totem tooltip. Fixed server world crashing when reviving player due to closing level (try-with-resources). --- .../component/TotemConfigHashData.java | 46 +++++++++++ .../item/totem/DiamondTotemItem.java | 2 +- .../item/totem/IronTotemItem.java | 2 +- .../item/totem/NetheriteTotemItem.java | 2 +- .../item/totem/StrawTotemItem.java | 2 +- .../item/totem/TotemItem.java | 81 +++++++++---------- .../micle/totem_of_reviving/setup/Config.java | 14 +--- .../setup/ModDataComponents.java | 10 ++- .../totem_of_reviving/util/LangAsset.java | 1 + .../assets/totem_of_reviving/lang/en_us.json | 1 + 10 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 src/main/java/dev/micle/totem_of_reviving/component/TotemConfigHashData.java diff --git a/src/main/java/dev/micle/totem_of_reviving/component/TotemConfigHashData.java b/src/main/java/dev/micle/totem_of_reviving/component/TotemConfigHashData.java new file mode 100644 index 0000000..354936e --- /dev/null +++ b/src/main/java/dev/micle/totem_of_reviving/component/TotemConfigHashData.java @@ -0,0 +1,46 @@ +package dev.micle.totem_of_reviving.component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.Objects; + +public class TotemConfigHashData { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.INT.fieldOf("configHash").forGetter(TotemConfigHashData::getConfigHash) + ).apply(instance, TotemConfigHashData::new) + ); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.INT, TotemConfigHashData::getConfigHash, + TotemConfigHashData::new + ); + + private final int configHash; + + public TotemConfigHashData(int configHash) { + this.configHash = configHash; + } + + public int getConfigHash() { + return this.configHash; + } + + @Override + public int hashCode() { + return Objects.hash(this.configHash); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } else { + return obj instanceof TotemConfigHashData tchd + && this.configHash == tchd.configHash; + } + } +} diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java index fb37201..2f2aa0f 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class DiamondTotemItem extends TotemItem { public DiamondTotemItem() { - super(createProperties(Rarity.RARE, Config.Server.getDiamondTotemConfig().getDurability(), false)); + super(createProperties(Rarity.RARE, false)); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java index 6d83384..96f14b4 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class IronTotemItem extends TotemItem { public IronTotemItem() { - super(createProperties(Rarity.COMMON, Config.Server.getIronTotemConfig().getDurability(), false)); + super(createProperties(Rarity.COMMON, false)); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java index 19760eb..a81e0f6 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class NetheriteTotemItem extends TotemItem { public NetheriteTotemItem() { - super(createProperties(Rarity.EPIC, Config.Server.getNetheriteTotemConfig().getDurability(), true)); + super(createProperties(Rarity.EPIC, true)); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java index c587a87..52f790b 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class StrawTotemItem extends TotemItem { public StrawTotemItem() { - super(createProperties(Rarity.UNCOMMON, Config.Server.getStrawTotemConfig().getDurability(), false)); + super(createProperties(Rarity.UNCOMMON, false)); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 20f77a1..191bf6b 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -1,6 +1,7 @@ package dev.micle.totem_of_reviving.item.totem; import com.mojang.blaze3d.platform.InputConstants; +import dev.micle.totem_of_reviving.component.TotemConfigHashData; import dev.micle.totem_of_reviving.component.TotemData; import dev.micle.totem_of_reviving.setup.Config; import dev.micle.totem_of_reviving.setup.ModDataComponents; @@ -8,6 +9,7 @@ import dev.micle.totem_of_reviving.util.ComponentHelper; import dev.micle.totem_of_reviving.util.LangAsset; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -16,17 +18,18 @@ import net.minecraft.server.players.PlayerList; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.Unbreakable; import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; -import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -36,8 +39,8 @@ public abstract class TotemItem extends Item { super(properties); } - public static Properties createProperties(Rarity rarity, int durability, boolean isFireResistant) { - Properties properties = new Properties().stacksTo(1).rarity(rarity).durability(durability); + public static Properties createProperties(Rarity rarity, boolean isFireResistant) { + Properties properties = new Properties().stacksTo(1).rarity(rarity); if (isFireResistant) properties = properties.fireResistant(); @@ -160,28 +163,18 @@ public abstract class TotemItem extends Item { ).withStyle(ChatFormatting.GRAY); } - try (ServerLevel targetLevel = target.serverLevel()) { - if (!targetLevel.equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { - return LangAsset.MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) - ).withStyle(ChatFormatting.GRAY); - } - } catch (IOException e) { - return LangAsset.MESSAGE_UNABLE_TO_GET_PLAYER_WORLD.getComponent( - Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.RED) - ).withStyle(ChatFormatting.DARK_RED); + if (!target.serverLevel().equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { + return LangAsset.MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION.getComponent( + Component.literal(totemData.getTargetName()).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY); } if (!totemItem.canAffordTarget(totemData)) { return LangAsset.MESSAGE_NOT_ENOUGH_CHARGE.getComponent().withStyle(ChatFormatting.WHITE); } - try (ServerLevel userLevel = user.serverLevel()) { - target.teleportTo(userLevel, user.position().x, user.position().y, user.position().z, user.getYRot(), user.getXRot()); - target.setGameMode(userLevel.getServer().getDefaultGameType()); - } catch (IOException e) { - return LangAsset.MESSAGE_UNABLE_TO_GET_YOUR_WORLD.getComponent().withStyle(ChatFormatting.RED); - } + target.teleportTo(user.serverLevel(), user.position().x, user.position().y, user.position().z, user.getYRot(), user.getXRot()); + target.setGameMode(user.serverLevel().getServer().getDefaultGameType()); totemData = new TotemData( totemData.getTargetIndex(), @@ -234,6 +227,9 @@ public abstract class TotemItem extends Item { if (getConfig().getCanReviveAcrossDimensions()) { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } + if (!stack.isDamageableItem()) { + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_IS_UNBREAKABLE.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + } tooltipComponents.add(Component.empty()); @@ -256,6 +252,31 @@ public abstract class TotemItem extends Item { super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); } + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if (level.isClientSide) { + super.inventoryTick(stack, level, entity, slotId, isSelected); + return; + } + + TotemConfigHashData totemConfigHashData = stack.get(ModDataComponents.TOTEM_CONFIG_HASH_DATA); + if (totemConfigHashData == null || totemConfigHashData.getConfigHash() != getConfig().getConfigHash()) { + if (getConfig().getDurability() == 0) { + stack.set(DataComponents.UNBREAKABLE, new Unbreakable(false)); + stack.remove(DataComponents.MAX_DAMAGE); + stack.remove(DataComponents.DAMAGE); + } else { + stack.remove(DataComponents.UNBREAKABLE); + stack.set(DataComponents.MAX_DAMAGE, getConfig().getDurability()); + stack.set(DataComponents.DAMAGE, 0); + } + stack.set(ModDataComponents.TOTEM_CONFIG_HASH_DATA, new TotemConfigHashData(getConfig().getConfigHash())); + } + + super.inventoryTick(stack, level, entity, slotId, isSelected); + } + @Override @ParametersAreNonnullByDefault public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { @@ -283,26 +304,4 @@ public abstract class TotemItem extends Item { return super.use(level, player, usedHand); } - - @Override - @ParametersAreNonnullByDefault - public int getMaxDamage(ItemStack stack) { - return getConfig().getDurability(); - } - - @Override - @ParametersAreNonnullByDefault - public boolean isDamageable(ItemStack stack) { - return getConfig().getDurability() != 0; - } - - @Override - @ParametersAreNonnullByDefault - public int getDamage(ItemStack stack) { - if (isDamageable(stack) && super.getDamage(stack) >= getMaxDamage(stack)) { - stack.setCount(0); - return getMaxDamage(stack); - } - return (isDamageable(stack)) ? super.getDamage(stack) : 0; - } } diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java index 996ff2c..e83849c 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -8,6 +8,8 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; import net.neoforged.neoforge.common.ModConfigSpec; +import java.util.Objects; + public final class Config { public static void init(ModContainer modContainer) { modContainer.registerConfig(ModConfig.Type.SERVER, Server.SPEC); @@ -24,8 +26,6 @@ public final class Config { static { ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); - builder.comment("WHEN MAKING CHANGES IT IS RECOMMENDED TO NOT BE IN A WORLD.\n" + - "CHANGES WILL MOST LIKELY REQUIRE A RESTART FOR EVERYTHING TO WORK PROPERLY."); STRAW_TOTEM_CONFIG = new TotemConfig(builder, StrawTotemItem.getName(), -1, 3, 1, false, false, 1); IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), -1, 5, @@ -85,13 +85,7 @@ public final class Config { public double getChargeCostMultiplier() { return CHARGE_COST_MULTIPLIER.get(); } public boolean getCanReviveMoreExpensiveTargets() { return CAN_REVIVE_MORE_EXPENSIVE_TARGETS.get(); } public boolean getCanReviveAcrossDimensions() { return CAN_REVIVE_ACROSS_DIMENSIONS.get(); } - public int getDurability() { - try { - return DURABILITY.get(); - } catch (IllegalStateException e) { - return 10; - } - - } + public int getDurability() { return DURABILITY.get(); } + public int getConfigHash() { return Objects.hash(getDurability()); } } } diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java b/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java index a2324f4..16e1bd8 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/ModDataComponents.java @@ -1,16 +1,24 @@ package dev.micle.totem_of_reviving.setup; +import dev.micle.totem_of_reviving.component.TotemConfigHashData; import dev.micle.totem_of_reviving.component.TotemData; import net.minecraft.core.component.DataComponentType; import net.neoforged.neoforge.registries.DeferredHolder; public class ModDataComponents { public static final DeferredHolder, DataComponentType> TOTEM_DATA = Registration.DATA_COMPONENTS.registerComponentType( - "basic", + "totem_data", builder -> builder .persistent(TotemData.CODEC) .networkSynchronized(TotemData.STREAM_CODEC) ); + public static final DeferredHolder, DataComponentType> TOTEM_CONFIG_HASH_DATA = Registration.DATA_COMPONENTS.registerComponentType( + "totem_config_hash_data", + builder -> builder + .persistent(TotemConfigHashData.CODEC) + .networkSynchronized(TotemConfigHashData.STREAM_CODEC) + ); + public static void register() {} } diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index a57a355..25f4d0f 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -21,6 +21,7 @@ public enum LangAsset { TOOLTIP_TOTEM_DYNAMIC_COST("tooltip", "totem_dynamic_cost"), TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS("tooltip", "totem_can_revive_more_expensive_targets"), TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS("tooltip", "totem_can_revive_across_dimensions"), + TOOLTIP_TOTEM_IS_UNBREAKABLE("tooltip", "totem_is_unbreakable"), TOOLTIP_TOTEM_REVIVE_INSTRUCTION("tooltip", "totem_revive_instruction"), TOOLTIP_TOTEM_CHARGE_INSTRUCTION("tooltip", "totem_charge_instruction"), TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION("tooltip", "totem_change_target_instructions"), diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 9fa798d..5464aab 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -14,6 +14,7 @@ "tooltip.totem_of_reviving.totem_dynamic_cost": "Dynamic cost (Multiplier: %s).", "tooltip.totem_of_reviving.totem_can_revive_more_expensive_targets": "Can revive more expensive targets.", "tooltip.totem_of_reviving.totem_can_revive_across_dimensions": "Can revive across dimensions.", + "tooltip.totem_of_reviving.totem_is_unbreakable": "Unbreakable.", "tooltip.totem_of_reviving.totem_revive_instruction": "When second hand is empty: revive target.", "tooltip.totem_of_reviving.totem_charge_instruction": "When second hand has a reviving charge: charge totem.", "tooltip.totem_of_reviving.totem_change_target_instructions": "Change target.", From 27634a9bdf6aaa88bedace07fe9af194ae88a42a Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:18:48 +0100 Subject: [PATCH 41/51] Updated config comments. --- .../micle/totem_of_reviving/setup/Config.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java index e83849c..ffb3fa8 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -57,25 +57,31 @@ public final class Config { boolean canReviveAcrossDimensions, int durability) { builder.push(name); CHARGE_COST = builder - .comment("The charge cost to revive a player.\n" + - "-1 means the cost is dynamic (follows the amount of deaths the target has)\n" + - "Higher values set the charge cost to static, meaning that this will be the amount of charges needed to revive someone.") + .comment(""" + The amount of charges required to revive a player. + Set to -1 for dynamic cost that scales with a player's deaths. + """) .defineInRange("chargeCost", chargeCost, -1, Integer.MAX_VALUE); CHARGE_COST_LIMIT = builder - .comment("The max amount of charge this totem can hold at once. Only works with dynamic cost.") + .comment("DYNAMIC COST REQUIRED. The max amount of charges the totem can hold at once.") .defineInRange("chargeCostLimit", chargeCostLimit, 1, Integer.MAX_VALUE); CHARGE_COST_MULTIPLIER = builder - .comment("Charge cost multiplier. 0.5 means the charge cost will be 50% of the original cost. Only works with dynamic cost.") + .comment(""" + DYNAMIC COST REQUIRED. charge_cost = player_deaths * charge_cost_multiplier. + Note: The resulting cost will always be at least 1. + """) .defineInRange("chargeCostMultiplier", chargeCostMultiplier, 0.01, 100); CAN_REVIVE_MORE_EXPENSIVE_TARGETS = builder - .comment("Is the totem able to revive targets that cost more than the totems max charge?\n" + - "This only applies if the totem is fully charged. (dynamic wont work if limit is 0)") + .comment("Allows players with a higher cost to be revived as long as the totem is fully charged.") .define("canReviveMoreExpensiveTargets", canReviveMoreExpensiveTargets); CAN_REVIVE_ACROSS_DIMENSIONS = builder - .comment("Is the totem able to revive targets across dimensions?") + .comment("Allows players in different dimensions to be revived.") .define("canReviveAcrossDimensions", canReviveAcrossDimensions); DURABILITY = builder - .comment("The durability of the totem. 0 means unbreakable.") + .comment(""" + The durability of the totem. + Set to 0 to make the totem unbreakable. + """) .defineInRange("durability", durability, 0, Integer.MAX_VALUE); builder.pop(); } From ef50e0084c675dbe7f09df307c498d94663624aa Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:35:15 +0100 Subject: [PATCH 42/51] Updated totem tooltip to display general durability information. --- .../totem_of_reviving/item/totem/TotemItem.java | 12 ++++++++---- .../dev/micle/totem_of_reviving/util/LangAsset.java | 3 ++- .../assets/totem_of_reviving/lang/en_us.json | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 191bf6b..42272bf 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -12,7 +12,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; import net.minecraft.stats.Stats; @@ -215,6 +214,14 @@ public abstract class TotemItem extends Item { Component.literal(String.format("%d / %d", totemData.getCharge(), getMaxCharge())).withStyle(ChatFormatting.WHITE) ).withStyle(ChatFormatting.GRAY)); + tooltipComponents.add( + stack.isDamageableItem() + ? LangAsset.TOOLTIP_TOTEM_DURABILITY.getComponent( + Component.literal(String.format("%d / %d", stack.getMaxDamage() - stack.getDamageValue(), stack.getMaxDamage())).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY) + : LangAsset.GENERAL_UNBREAKABLE.getComponent().withStyle(ChatFormatting.WHITE) + ); + tooltipComponents.add(Component.empty()); if (isChargeCostDynamic()) { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_DYNAMIC_COST.getComponent( @@ -227,9 +234,6 @@ public abstract class TotemItem extends Item { if (getConfig().getCanReviveAcrossDimensions()) { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } - if (!stack.isDamageableItem()) { - tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_IS_UNBREAKABLE.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); - } tooltipComponents.add(Component.empty()); diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index 25f4d0f..a51dc48 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -18,10 +18,10 @@ public enum LangAsset { TOOLTIP_TOTEM_TARGET("tooltip", "totem_target"), TOOLTIP_TOTEM_TARGET_COST("tooltip", "totem_target_cost"), TOOLTIP_TOTEM_CHARGES("tooltip", "totem_charges"), + TOOLTIP_TOTEM_DURABILITY("tooltip", "totem_durability"), TOOLTIP_TOTEM_DYNAMIC_COST("tooltip", "totem_dynamic_cost"), TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS("tooltip", "totem_can_revive_more_expensive_targets"), TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS("tooltip", "totem_can_revive_across_dimensions"), - TOOLTIP_TOTEM_IS_UNBREAKABLE("tooltip", "totem_is_unbreakable"), TOOLTIP_TOTEM_REVIVE_INSTRUCTION("tooltip", "totem_revive_instruction"), TOOLTIP_TOTEM_CHARGE_INSTRUCTION("tooltip", "totem_charge_instruction"), TOOLTIP_TOTEM_CHANGE_TARGET_INSTRUCTION("tooltip", "totem_change_target_instructions"), @@ -29,6 +29,7 @@ public enum LangAsset { TOOLTIP_ADVANCED_TOOLTIP_HIDDEN("tooltip", "advanced_tooltip_hidden"), TOOLTIP_ADVANCED_TOOLTIP_SHOWN("tooltip", "advanced_tooltip_shown"), GENERAL_NA("general", "na"), + GENERAL_UNBREAKABLE("general", "unbreakable"), MESSAGE_UNABLE_TO_FIND_PLAYER("message", "unable_to_find_player"), MESSAGE_PLAYER_IS_NOT_DEAD("message", "player_is_not_dead"), MESSAGE_PLAYER_IS_IN_ANOTHER_DIMENSION("message", "player_is_in_another_dimension"), diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 5464aab..5e61103 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -11,10 +11,10 @@ "tooltip.totem_of_reviving.totem_target": "Target: %s", "tooltip.totem_of_reviving.totem_target_cost": "Cost: %s", "tooltip.totem_of_reviving.totem_charges": "Charges: %s", + "tooltip.totem_of_reviving.totem_durability": "Durability: %s", "tooltip.totem_of_reviving.totem_dynamic_cost": "Dynamic cost (Multiplier: %s).", "tooltip.totem_of_reviving.totem_can_revive_more_expensive_targets": "Can revive more expensive targets.", "tooltip.totem_of_reviving.totem_can_revive_across_dimensions": "Can revive across dimensions.", - "tooltip.totem_of_reviving.totem_is_unbreakable": "Unbreakable.", "tooltip.totem_of_reviving.totem_revive_instruction": "When second hand is empty: revive target.", "tooltip.totem_of_reviving.totem_charge_instruction": "When second hand has a reviving charge: charge totem.", "tooltip.totem_of_reviving.totem_change_target_instructions": "Change target.", @@ -22,6 +22,7 @@ "tooltip.totem_of_reviving.advanced_tooltip_hidden": "Hold %s for advanced tooltip.", "tooltip.totem_of_reviving.advanced_tooltip_shown": "Showing advanced tooltip:", "general.totem_of_reviving.na": "N/A", + "general.totem_of_reviving.unbreakable": "Unbreakable.", "message.totem_of_reviving.unable_to_find_player": "Unable to find player!", "message.totem_of_reviving.player_is_not_dead": "%s is not dead!", "message.totem_of_reviving.player_is_in_another_dimension": "%s is in a different dimension!", From 8dbeb36d131457e88f7618a258621b377bb3b39a Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:41:24 +0100 Subject: [PATCH 43/51] Updated item constructors to simplify usage. --- .../dev/micle/totem_of_reviving/item/charge/ChargeItem.java | 4 ++-- .../totem_of_reviving/item/charge/DiamondChargeItem.java | 2 +- .../micle/totem_of_reviving/item/charge/IronChargeItem.java | 2 +- .../totem_of_reviving/item/charge/NetheriteChargeItem.java | 2 +- .../micle/totem_of_reviving/item/charge/StrawChargeItem.java | 2 +- .../micle/totem_of_reviving/item/totem/DiamondTotemItem.java | 2 +- .../dev/micle/totem_of_reviving/item/totem/IronTotemItem.java | 2 +- .../totem_of_reviving/item/totem/NetheriteTotemItem.java | 2 +- .../micle/totem_of_reviving/item/totem/StrawTotemItem.java | 2 +- .../dev/micle/totem_of_reviving/item/totem/TotemItem.java | 4 ++-- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java index 5c21395..2ae91ee 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/ChargeItem.java @@ -12,8 +12,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; public abstract class ChargeItem extends Item { - public ChargeItem(Properties properties) { - super(properties); + public ChargeItem(Rarity rarity, boolean isFireResistant) { + super(createProperties(rarity, isFireResistant)); } public abstract Component getTotemDisplayName(); diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java index 98df2c0..31021f8 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/DiamondChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class DiamondChargeItem extends ChargeItem { public DiamondChargeItem() { - super(createProperties(Rarity.RARE, false)); + super(Rarity.RARE, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java index ac5c159..8e02f60 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class IronChargeItem extends ChargeItem { public IronChargeItem() { - super(createProperties(Rarity.COMMON, false)); + super(Rarity.COMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java index 12cd415..b85dfcc 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/NetheriteChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class NetheriteChargeItem extends ChargeItem { public NetheriteChargeItem() { - super(createProperties(Rarity.EPIC, true)); + super(Rarity.EPIC, true); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java index 3ccdad8..66db429 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class StrawChargeItem extends ChargeItem { public StrawChargeItem() { - super(createProperties(Rarity.UNCOMMON, false)); + super(Rarity.UNCOMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java index 2f2aa0f..3d867cd 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/DiamondTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class DiamondTotemItem extends TotemItem { public DiamondTotemItem() { - super(createProperties(Rarity.RARE, false)); + super(Rarity.RARE, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java index 96f14b4..962cff6 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class IronTotemItem extends TotemItem { public IronTotemItem() { - super(createProperties(Rarity.COMMON, false)); + super(Rarity.COMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java index a81e0f6..fefcaba 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/NetheriteTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class NetheriteTotemItem extends TotemItem { public NetheriteTotemItem() { - super(createProperties(Rarity.EPIC, true)); + super(Rarity.EPIC, true); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java index 52f790b..28049e5 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class StrawTotemItem extends TotemItem { public StrawTotemItem() { - super(createProperties(Rarity.UNCOMMON, false)); + super(Rarity.UNCOMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 42272bf..e53fe1d 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -34,8 +34,8 @@ import java.util.Optional; import java.util.UUID; public abstract class TotemItem extends Item { - public TotemItem(Properties properties) { - super(properties); + public TotemItem(Rarity rarity, boolean isFireResistant) { + super(createProperties(rarity, isFireResistant)); } public static Properties createProperties(Rarity rarity, boolean isFireResistant) { From 85b67a1a8d5fd764cba881177a37d42194a3dbb4 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:46:24 +0100 Subject: [PATCH 44/51] Switched rarities of Iron and Straw totems to be consistent in regard to progression. --- .../dev/micle/totem_of_reviving/item/charge/IronChargeItem.java | 2 +- .../micle/totem_of_reviving/item/charge/StrawChargeItem.java | 2 +- .../dev/micle/totem_of_reviving/item/totem/IronTotemItem.java | 2 +- .../dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java index 8e02f60..5feccc3 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/IronChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class IronChargeItem extends ChargeItem { public IronChargeItem() { - super(Rarity.COMMON, false); + super(Rarity.UNCOMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java index 66db429..5e84b91 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/charge/StrawChargeItem.java @@ -6,7 +6,7 @@ import net.minecraft.world.item.Rarity; public class StrawChargeItem extends ChargeItem { public StrawChargeItem() { - super(Rarity.UNCOMMON, false); + super(Rarity.COMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java index 962cff6..af7e5fc 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/IronTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class IronTotemItem extends TotemItem { public IronTotemItem() { - super(Rarity.COMMON, false); + super(Rarity.UNCOMMON, false); } public static String getName() { diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java index 28049e5..a0ac390 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/StrawTotemItem.java @@ -7,7 +7,7 @@ import net.minecraft.world.item.Rarity; public class StrawTotemItem extends TotemItem { public StrawTotemItem() { - super(Rarity.UNCOMMON, false); + super(Rarity.COMMON, false); } public static String getName() { From 8b296c67508380b121b138ef066500b368438495 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:49:04 +0100 Subject: [PATCH 45/51] Changed diamond totem default config to allow reviving across dimensions. --- src/main/java/dev/micle/totem_of_reviving/setup/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java index ffb3fa8..7062b32 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -31,7 +31,7 @@ public final class Config { IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), -1, 5, 0.75, false, false, 4); DIAMOND_TOTEM_CONFIG = new TotemConfig(builder, DiamondTotemItem.getName(), -1, 10, - 0.5, false, false, 10); + 0.5, false, true, 10); NETHERITE_TOTEM_CONFIG = new TotemConfig(builder, NetheriteTotemItem.getName(), 1, 1, 1, true, true, 0); From 6bb74b36359686c29101c14ab00047682f2f72e7 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 00:52:36 +0100 Subject: [PATCH 46/51] Updated totem tooltip to display N/A for cost when the target is also N/A. --- .../totem_of_reviving/item/totem/TotemItem.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index e53fe1d..614e41b 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -203,11 +203,13 @@ public abstract class TotemItem extends Item { ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET_COST.getComponent( - Component.literal(String.format("%d", getTargetCost(totemData))).withStyle( - getTargetCost(totemData) <= getMaxCharge() - ? ChatFormatting.WHITE - : ChatFormatting.RED - ) + totemData.getTargetUUID().isPresent() + ? Component.literal(String.format("%d", getTargetCost(totemData))).withStyle( + getTargetCost(totemData) <= getMaxCharge() + ? ChatFormatting.WHITE + : ChatFormatting.RED + ) + : LangAsset.GENERAL_NA.getComponent().withStyle(ChatFormatting.RED) ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CHARGES.getComponent( From 07184045e4719f864cf7557c53b3ab3999975c33 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 02:18:15 +0100 Subject: [PATCH 47/51] Rebalanced default configs. Displaying static cost in tooltip. --- .../totem_of_reviving/item/totem/TotemItem.java | 4 ++++ .../dev/micle/totem_of_reviving/setup/Config.java | 12 ++++++------ .../dev/micle/totem_of_reviving/util/LangAsset.java | 1 + .../assets/totem_of_reviving/lang/en_us.json | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 614e41b..005c08d 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -229,6 +229,10 @@ public abstract class TotemItem extends Item { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_DYNAMIC_COST.getComponent( Component.literal(String.format("%.2f", getConfig().getChargeCostMultiplier())).withStyle(ChatFormatting.WHITE) ).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + } else { + tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_STATIC_COST.getComponent( + Component.literal(String.format("%d", getMaxCharge())).withStyle(ChatFormatting.WHITE) + ).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); } if (getConfig().getCanReviveMoreExpensiveTargets()) { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS.getComponent().withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java index 7062b32..5babe82 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -28,12 +28,12 @@ public final class Config { STRAW_TOTEM_CONFIG = new TotemConfig(builder, StrawTotemItem.getName(), -1, 3, 1, false, false, 1); - IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), -1, 5, - 0.75, false, false, 4); - DIAMOND_TOTEM_CONFIG = new TotemConfig(builder, DiamondTotemItem.getName(), -1, 10, - 0.5, false, true, 10); + IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), -1, 3, + 0.5, false, false, 2); + DIAMOND_TOTEM_CONFIG = new TotemConfig(builder, DiamondTotemItem.getName(), -1, 6, + 0.66, true, false, 3); NETHERITE_TOTEM_CONFIG = new TotemConfig(builder, NetheriteTotemItem.getName(), 1, 1, - 1, true, true, 0); + 1, false, true, 0); SPEC = builder.build(); } @@ -72,7 +72,7 @@ public final class Config { """) .defineInRange("chargeCostMultiplier", chargeCostMultiplier, 0.01, 100); CAN_REVIVE_MORE_EXPENSIVE_TARGETS = builder - .comment("Allows players with a higher cost to be revived as long as the totem is fully charged.") + .comment("DYNAMIC COST REQUIRED. Allows players with a higher cost to be revived as long as the totem is fully charged.") .define("canReviveMoreExpensiveTargets", canReviveMoreExpensiveTargets); CAN_REVIVE_ACROSS_DIMENSIONS = builder .comment("Allows players in different dimensions to be revived.") diff --git a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java index a51dc48..9356694 100644 --- a/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java +++ b/src/main/java/dev/micle/totem_of_reviving/util/LangAsset.java @@ -20,6 +20,7 @@ public enum LangAsset { TOOLTIP_TOTEM_CHARGES("tooltip", "totem_charges"), TOOLTIP_TOTEM_DURABILITY("tooltip", "totem_durability"), TOOLTIP_TOTEM_DYNAMIC_COST("tooltip", "totem_dynamic_cost"), + TOOLTIP_TOTEM_STATIC_COST("tooltip", "totem_static_cost"), TOOLTIP_TOTEM_CAN_REVIVE_MORE_EXPENSIVE_TARGETS("tooltip", "totem_can_revive_more_expensive_targets"), TOOLTIP_TOTEM_CAN_REVIVE_ACROSS_DIMENSIONS("tooltip", "totem_can_revive_across_dimensions"), TOOLTIP_TOTEM_REVIVE_INSTRUCTION("tooltip", "totem_revive_instruction"), diff --git a/src/main/resources/assets/totem_of_reviving/lang/en_us.json b/src/main/resources/assets/totem_of_reviving/lang/en_us.json index 5e61103..2e77817 100644 --- a/src/main/resources/assets/totem_of_reviving/lang/en_us.json +++ b/src/main/resources/assets/totem_of_reviving/lang/en_us.json @@ -13,6 +13,7 @@ "tooltip.totem_of_reviving.totem_charges": "Charges: %s", "tooltip.totem_of_reviving.totem_durability": "Durability: %s", "tooltip.totem_of_reviving.totem_dynamic_cost": "Dynamic cost (Multiplier: %s).", + "tooltip.totem_of_reviving.totem_static_cost": "Static cost (%s).", "tooltip.totem_of_reviving.totem_can_revive_more_expensive_targets": "Can revive more expensive targets.", "tooltip.totem_of_reviving.totem_can_revive_across_dimensions": "Can revive across dimensions.", "tooltip.totem_of_reviving.totem_revive_instruction": "When second hand is empty: revive target.", From ed3dcc3d1e4fdfbf22553f0085396599b5def4d1 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 02:21:02 +0100 Subject: [PATCH 48/51] Checking config for unbreakable status to make tooltips more accurate in menus such as the creative menu. --- .../totem_of_reviving/item/totem/TotemItem.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 005c08d..5b48646 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -62,6 +62,10 @@ public abstract class TotemItem extends Item { return getConfig().getChargeCost() == -1; } + private boolean isUnbreakable() { + return getConfig().getDurability() == 0; + } + private int getMaxCharge() { return isChargeCostDynamic() ? getConfig().getChargeCostLimit() @@ -217,11 +221,11 @@ public abstract class TotemItem extends Item { ).withStyle(ChatFormatting.GRAY)); tooltipComponents.add( - stack.isDamageableItem() - ? LangAsset.TOOLTIP_TOTEM_DURABILITY.getComponent( + isUnbreakable() + ? LangAsset.GENERAL_UNBREAKABLE.getComponent().withStyle(ChatFormatting.WHITE) + : LangAsset.TOOLTIP_TOTEM_DURABILITY.getComponent( Component.literal(String.format("%d / %d", stack.getMaxDamage() - stack.getDamageValue(), stack.getMaxDamage())).withStyle(ChatFormatting.WHITE) ).withStyle(ChatFormatting.GRAY) - : LangAsset.GENERAL_UNBREAKABLE.getComponent().withStyle(ChatFormatting.WHITE) ); tooltipComponents.add(Component.empty()); @@ -272,7 +276,7 @@ public abstract class TotemItem extends Item { TotemConfigHashData totemConfigHashData = stack.get(ModDataComponents.TOTEM_CONFIG_HASH_DATA); if (totemConfigHashData == null || totemConfigHashData.getConfigHash() != getConfig().getConfigHash()) { - if (getConfig().getDurability() == 0) { + if (isUnbreakable()) { stack.set(DataComponents.UNBREAKABLE, new Unbreakable(false)); stack.remove(DataComponents.MAX_DAMAGE); stack.remove(DataComponents.DAMAGE); From c21ba74432f3d9b1a2a44a682dcd7e4b07185e45 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 02:36:43 +0100 Subject: [PATCH 49/51] Using config for getting totem max durability for tooltip. --- .../java/dev/micle/totem_of_reviving/item/totem/TotemItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index 5b48646..ae6a01d 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -224,7 +224,7 @@ public abstract class TotemItem extends Item { isUnbreakable() ? LangAsset.GENERAL_UNBREAKABLE.getComponent().withStyle(ChatFormatting.WHITE) : LangAsset.TOOLTIP_TOTEM_DURABILITY.getComponent( - Component.literal(String.format("%d / %d", stack.getMaxDamage() - stack.getDamageValue(), stack.getMaxDamage())).withStyle(ChatFormatting.WHITE) + Component.literal(String.format("%d / %d", getConfig().getDurability() - stack.getDamageValue(), getConfig().getDurability())).withStyle(ChatFormatting.WHITE) ).withStyle(ChatFormatting.GRAY) ); From 05192b2601c413ab658d8edd0f5d854b5b7de518 Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 02:48:22 +0100 Subject: [PATCH 50/51] Fixed charge going below 0 when reviving more expensive targets with dynamic cost. Fixing tooltip cost appearing in red when the target's cost is more than the max charge capacity but the totem can revive more expensive targets. --- .../dev/micle/totem_of_reviving/item/totem/TotemItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java index ae6a01d..c2c4840 100644 --- a/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totem_of_reviving/item/totem/TotemItem.java @@ -184,7 +184,7 @@ public abstract class TotemItem extends Item { totemData.getTargetStringUUID(), totemData.getTargetName(), totemData.getTargetDeaths(), - totemData.getCharge() - totemItem.getTargetCost(totemData) + Math.max(0, totemData.getCharge() - totemItem.getTargetCost(totemData)) ); setTotemData(itemStack, totemData); itemStack.hurtAndBreak(1, user, slot); @@ -209,7 +209,7 @@ public abstract class TotemItem extends Item { tooltipComponents.add(LangAsset.TOOLTIP_TOTEM_TARGET_COST.getComponent( totemData.getTargetUUID().isPresent() ? Component.literal(String.format("%d", getTargetCost(totemData))).withStyle( - getTargetCost(totemData) <= getMaxCharge() + getTargetCost(totemData) <= getMaxCharge() || (getConfig().getCanReviveMoreExpensiveTargets()) ? ChatFormatting.WHITE : ChatFormatting.RED ) From 9f797a911211650d7513cffb562261e16b9b545a Mon Sep 17 00:00:00 2001 From: micle Date: Sun, 18 Jan 2026 02:52:54 +0100 Subject: [PATCH 51/51] Adjusted default config value. --- src/main/java/dev/micle/totem_of_reviving/setup/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java index 5babe82..71431ae 100644 --- a/src/main/java/dev/micle/totem_of_reviving/setup/Config.java +++ b/src/main/java/dev/micle/totem_of_reviving/setup/Config.java @@ -31,7 +31,7 @@ public final class Config { IRON_TOTEM_CONFIG = new TotemConfig(builder, IronTotemItem.getName(), -1, 3, 0.5, false, false, 2); DIAMOND_TOTEM_CONFIG = new TotemConfig(builder, DiamondTotemItem.getName(), -1, 6, - 0.66, true, false, 3); + 0.67, true, false, 3); NETHERITE_TOTEM_CONFIG = new TotemConfig(builder, NetheriteTotemItem.getName(), 1, 1, 1, false, true, 0);