diff --git a/.gradle/8.1.1/checksums/checksums.lock b/.gradle/8.1.1/checksums/checksums.lock new file mode 100644 index 00000000..41dcf69e Binary files /dev/null and b/.gradle/8.1.1/checksums/checksums.lock differ diff --git a/.gradle/8.1.1/checksums/md5-checksums.bin b/.gradle/8.1.1/checksums/md5-checksums.bin new file mode 100644 index 00000000..fae0ad4b Binary files /dev/null and b/.gradle/8.1.1/checksums/md5-checksums.bin differ diff --git a/.gradle/8.1.1/checksums/sha1-checksums.bin b/.gradle/8.1.1/checksums/sha1-checksums.bin new file mode 100644 index 00000000..1cc91636 Binary files /dev/null and b/.gradle/8.1.1/checksums/sha1-checksums.bin differ diff --git a/.gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 00000000..e761aa09 Binary files /dev/null and b/.gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/8.1.1/dependencies-accessors/gc.properties b/.gradle/8.1.1/dependencies-accessors/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/8.1.1/executionHistory/executionHistory.bin b/.gradle/8.1.1/executionHistory/executionHistory.bin new file mode 100644 index 00000000..2070c413 Binary files /dev/null and b/.gradle/8.1.1/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.1.1/executionHistory/executionHistory.lock b/.gradle/8.1.1/executionHistory/executionHistory.lock new file mode 100644 index 00000000..21894a9a Binary files /dev/null and b/.gradle/8.1.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.1.1/fileChanges/last-build.bin b/.gradle/8.1.1/fileChanges/last-build.bin new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/.gradle/8.1.1/fileChanges/last-build.bin differ diff --git a/.gradle/8.1.1/fileHashes/fileHashes.bin b/.gradle/8.1.1/fileHashes/fileHashes.bin new file mode 100644 index 00000000..ffe81ae7 Binary files /dev/null and b/.gradle/8.1.1/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.1.1/fileHashes/fileHashes.lock b/.gradle/8.1.1/fileHashes/fileHashes.lock new file mode 100644 index 00000000..f1075c79 Binary files /dev/null and b/.gradle/8.1.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.1.1/fileHashes/resourceHashesCache.bin b/.gradle/8.1.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 00000000..2478a56f Binary files /dev/null and b/.gradle/8.1.1/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/8.1.1/gc.properties b/.gradle/8.1.1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 00000000..131f46a9 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 00000000..de9509c3 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Mar 17 22:20:35 MDT 2026 +gradle.version=8.1.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 00000000..f371cf3c Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 00000000..15ab98a6 Binary files /dev/null and b/.gradle/file-system.probe differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/Git Redundancy - Delete me! b/Git Redundancy - Delete me! new file mode 100644 index 00000000..2018f17d --- /dev/null +++ b/Git Redundancy - Delete me! @@ -0,0 +1 @@ +# Fork check - Love, CephaoftheDromes diff --git a/build.gradle b/build.gradle index 31f48dd5..c183c4b2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,248 +1,97 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } -} -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. plugins { id 'java' - id 'eclipse' - id 'idea' - id 'maven-publish' - id 'net.minecraftforge.gradle' version '5.1.+' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' id 'org.spongepowered.mixin' version '0.7.+' + id 'maven-publish' } -archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group +base { archivesName = project.archives_base_name + '-forge' } -// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java { + toolchain.languageVersion = JavaLanguageVersion.of(17) + withSourcesJar() +} -println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { - // The mappings can be changed at any time and must be in the following format. - // Channel: Version: - // official MCVersion Official field/method names from Mojang mapping files - // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official - // - // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. - // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md - // - // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge - // Additional setup is needed to use their mappings: https://github.com/ParchmentMC/Parchment/wiki/Getting-Started - // - // Use non-default mappings at your own risk. They may not always work. - // Simply re-run your setup task after changing the mappings to update your workspace. mappings channel: 'official', version: '1.20.1' - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. runs { client { workingDirectory project.file('run') - - // 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. property '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 property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'playercollars' - - mods { - playercollars { - source sourceSets.main - } - } + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { playercollars { source sourceSets.main } } } - server { workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'playercollars' - - mods { - playercollars { - source sourceSets.main - } - } - } - - // 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 { - workingDirectory project.file('run') - - // 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. - property '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 - property 'forge.logging.console.level', 'debug' - - // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. - property 'forge.enabledGameTestNamespaces', 'playercollars' - - mods { - playercollars { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - property 'forge.logging.markers', 'REGISTRIES' - - property 'forge.logging.console.level', 'debug' - - // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', 'playercollars', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - playercollars { - source sourceSets.main - } - } + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + mods { playercollars { source sourceSets.main } } } } } -// Include resources generated by data generators. -sourceSets.main.resources { - srcDir 'src/generated/resources' +mixin { + add sourceSets.main, 'playercollars.refmap.json' + config 'playercollars.leashplayers.mixins.json' + config 'playercollars.mixins.json' } repositories { - // Put repositories for dependencies here - // ForgeGradle automatically adds the Forge maven and Maven Central for you - - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: - // flatDir { - // dir 'libs' - // } - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } - maven { url = "https://maven.terraformersmc.com/" } - maven { - // location of the maven that hosts JEI files before January 2023 - name = "Progwml6's maven" - url = "https://dvs1.progwml6.com/files/maven/" - } - maven { - // location of the maven that hosts JEI files since January 2023 - name = "Jared's maven" - url = "https://maven.blamejared.com/" - } + mavenCentral() + maven { name = 'CurseMaven'; url = 'https://cursemaven.com' } + maven { name = 'Ldtteam'; url = 'https://ldtteam.jfrog.io/artifactory/patchworkmc-maven/' } + maven { name = 'Jared'; url = 'https://maven.blamejared.com' } maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.dev" + name = 'ModMaven' + url = 'https://modmaven.dev' } + maven { name = 'Kotlin for Forge'; url = 'https://thedarkcolour.github.io/KotlinForForge/' } + // Curios + maven { url = 'https://maven.theillusivec4.top/' } } dependencies { - // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed - // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.20.1-47.3.0' + minecraft "net.minecraftforge:forge:1.20.1-47.3.0" - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - - // Real mod deobf dependency examples - these get remapped to your current mappings - // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency - // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency - // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency + // Curios (Forge equivalent of Trinkets) + compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:5.9.1+1.20.1:api") + runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:5.9.1+1.20.1") - // Examples using mod jars from ./libs - // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") + // MixinExtras (bundled via Forge 47.1+, but adding explicitly for safety) + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - // For more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - implementation fg.deobf("curse.maven:curios-309927:5367944") - runtimeOnly fg.deobf("curse.maven:geckolib-388172:5460309") - implementation fg.deobf("curse.maven:kawaii-dishes-694309:4701259") +} - compileOnly "mezz.jei:jei-1.20.1-common-api:15.3.0.8" - compileOnly "mezz.jei:jei-1.20.1-forge-api:15.3.0.8" - // at runtime, use the full JEI jar - runtimeOnly fg.deobf("mezz.jei:jei-1.20.1-forge:15.3.0.8") +processResources { + inputs.property 'version', project.version + filesMatching('META-INF/mods.toml') { expand version: project.version } } -mixin { - add sourceSets.main, "playercollars.mixins.refmap.json" - config "playercollars.mixins.json" - config "playercollars.mixins.compat.json" +tasks.withType(JavaCompile).configureEach { + it.options.encoding = 'UTF-8' + it.options.release = 17 } -// Example for how to get properties into the manifest for reading at runtime. jar { - manifest { - attributes([ - "Specification-Title" : project.name, - "Specification-Vendor" : "jlortiz", - "Specification-Version" : mod_version, - "Implementation-Title" : project.name, - "Implementation-Version" : mod_version, - "Implementation-Vendor" : "jlortiz", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - "Automatic-Module-Name": "playercollars" - ]) - } + manifest { attributes(['MixinConfigs': 'playercollars.leashplayers.mixins.json,playercollars.mixins.json']) } + from('LICENSE') { rename { "${it}_${project.base.archivesName.get()}" } } + finalizedBy 'reobfJar' } -// Example configuration to allow publishing using the maven-publish plugin -// This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfJar') -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -// publish.dependsOn('reobfJar') - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - } - } - repositories { - maven { - url "file://${project.projectDir}/mcmodsrepo" +sourceSets { + main { + resources { + srcDirs += ['src/main/generated'] + exclude '.cache/**' } } } - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} diff --git a/gradle.properties b/gradle.properties index ccf896cf..4732967f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,7 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G +org.gradle.parallel=true -# Mod Properties -mod_version = 1.2.6+1.20.1 -maven_group = org.jlortiz -archives_base_name = PlayerCollars \ No newline at end of file +minecraft_version=1.20.1 +mod_version=1.6.0+1.20.1 +maven_group=org.jlortiz +archives_base_name=PlayerCollars diff --git a/gradlew b/gradlew index 1b6c7873..1aa94a42 100644 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd32..25da30db 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle index 0b0a605a..211e327b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,26 +1,8 @@ pluginManagement { repositories { - mavenCentral() gradlePluginPortal() - - // Add the Forge Repository (ForgeGradle fetches most of its stuff from here) - maven { - name = "Forge" - url = "https://maven.minecraftforge.net" - } - - // Add the Jitpack Repository (We fetch ForgeGradle from this) - maven { - name = "Jitpack" - url = "https://jitpack.io/" - } - } - resolutionStrategy { - eachPlugin { - // If the "net.minecraftforge.gradle.forge" plugin is requested we redirect it to asbyth's ForgeGradle fork - if (requested.id.id == "net.minecraftforge.gradle.forge") { - useModule("com.github.asbyth:ForgeGradle:${requested.version}") - } - } + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } } } +rootProject.name = 'PlayerCollars-forge' diff --git a/src/main/generated/assets/playercollars/blockstates/black_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/black_dog_bed.json new file mode 100644 index 00000000..66ba211e --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/black_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/black_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/black_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/black_dog_bowl.json new file mode 100644 index 00000000..c780bdbf --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/black_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/black_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/black_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/black_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/black_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/black_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/black_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/black_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/black_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/blue_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/blue_dog_bed.json new file mode 100644 index 00000000..5e5164b6 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/blue_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/blue_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/blue_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/blue_dog_bowl.json new file mode 100644 index 00000000..a565f8a1 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/blue_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/blue_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/blue_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/blue_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/blue_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/blue_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/blue_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/blue_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/blue_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/brown_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/brown_dog_bed.json new file mode 100644 index 00000000..e172ba7d --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/brown_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/brown_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/brown_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/brown_dog_bowl.json new file mode 100644 index 00000000..117b37d3 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/brown_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/brown_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/brown_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/brown_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/brown_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/brown_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/brown_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/brown_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/brown_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/cyan_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/cyan_dog_bed.json new file mode 100644 index 00000000..2b660f27 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/cyan_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/cyan_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/cyan_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/cyan_dog_bowl.json new file mode 100644 index 00000000..9d96e1e7 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/cyan_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/cyan_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/cyan_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/cyan_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/cyan_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/cyan_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/cyan_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/cyan_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/cyan_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/gray_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/gray_dog_bed.json new file mode 100644 index 00000000..2e920a0a --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/gray_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/gray_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/gray_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/gray_dog_bowl.json new file mode 100644 index 00000000..4beac695 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/gray_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/gray_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/gray_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/gray_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/gray_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/gray_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/gray_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/gray_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/gray_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/green_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/green_dog_bed.json new file mode 100644 index 00000000..56a9cc18 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/green_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/green_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/green_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/green_dog_bowl.json new file mode 100644 index 00000000..33b88ae8 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/green_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/green_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/green_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/green_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/green_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/green_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/green_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/green_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/green_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/invisible_fence.json b/src/main/generated/assets/playercollars/blockstates/invisible_fence.json new file mode 100644 index 00000000..e94b03ab --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/invisible_fence.json @@ -0,0 +1,48 @@ +{ + "multipart": [ + { + "apply": { + "model": "playercollars:block/invisible_fence_post" + } + }, + { + "apply": { + "model": "playercollars:block/invisible_fence_side", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "playercollars:block/invisible_fence_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "playercollars:block/invisible_fence_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "playercollars:block/invisible_fence_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bed.json new file mode 100644 index 00000000..c58b7f8e --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/light_blue_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bowl.json new file mode 100644 index 00000000..dbd8ea9a --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/light_blue_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/light_blue_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/light_blue_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/light_blue_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/light_blue_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/light_blue_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/light_blue_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/light_blue_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/light_blue_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bed.json new file mode 100644 index 00000000..8f724c2b --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/light_gray_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bowl.json new file mode 100644 index 00000000..2d7122c7 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/light_gray_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/light_gray_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/light_gray_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/light_gray_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/light_gray_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/light_gray_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/light_gray_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/light_gray_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/light_gray_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/lime_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/lime_dog_bed.json new file mode 100644 index 00000000..fb41a921 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/lime_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/lime_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/lime_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/lime_dog_bowl.json new file mode 100644 index 00000000..5d016906 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/lime_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/lime_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/lime_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/lime_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/lime_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/lime_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/lime_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/lime_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/lime_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/magenta_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/magenta_dog_bed.json new file mode 100644 index 00000000..f68bb092 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/magenta_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/magenta_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/magenta_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/magenta_dog_bowl.json new file mode 100644 index 00000000..eec96640 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/magenta_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/magenta_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/magenta_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/magenta_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/magenta_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/magenta_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/magenta_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/magenta_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/magenta_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/orange_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/orange_dog_bed.json new file mode 100644 index 00000000..e12093e5 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/orange_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/orange_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/orange_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/orange_dog_bowl.json new file mode 100644 index 00000000..64ca11b2 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/orange_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/orange_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/orange_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/orange_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/orange_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/orange_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/orange_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/orange_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/orange_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/pink_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/pink_dog_bed.json new file mode 100644 index 00000000..37f05024 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/pink_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/pink_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/pink_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/pink_dog_bowl.json new file mode 100644 index 00000000..5af95d75 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/pink_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/pink_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/pink_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/pink_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/pink_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/pink_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/pink_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/pink_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/pink_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/purple_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/purple_dog_bed.json new file mode 100644 index 00000000..0c79d813 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/purple_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/purple_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/purple_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/purple_dog_bowl.json new file mode 100644 index 00000000..daced003 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/purple_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/purple_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/purple_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/purple_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/purple_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/purple_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/purple_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/purple_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/purple_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/red_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/red_dog_bed.json new file mode 100644 index 00000000..ec06b349 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/red_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/red_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/red_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/red_dog_bowl.json new file mode 100644 index 00000000..b1a89c53 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/red_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/red_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/red_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/red_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/red_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/red_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/red_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/red_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/red_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/white_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/white_dog_bed.json new file mode 100644 index 00000000..860cc50a --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/white_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/white_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/white_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/white_dog_bowl.json new file mode 100644 index 00000000..9c602d27 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/white_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/white_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/white_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/white_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/white_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/white_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/white_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/white_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/white_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/yellow_dog_bed.json b/src/main/generated/assets/playercollars/blockstates/yellow_dog_bed.json new file mode 100644 index 00000000..3240a7f7 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/yellow_dog_bed.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,part=foot": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 270 + }, + "facing=east,part=head": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 90 + }, + "facing=north,part=foot": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 180 + }, + "facing=north,part=head": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=foot": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 0 + }, + "facing=south,part=head": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 180 + }, + "facing=west,part=foot": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 90 + }, + "facing=west,part=head": { + "model": "playercollars:block/yellow_dog_bed", + "x": 0, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/blockstates/yellow_dog_bowl.json b/src/main/generated/assets/playercollars/blockstates/yellow_dog_bowl.json new file mode 100644 index 00000000..00284ad1 --- /dev/null +++ b/src/main/generated/assets/playercollars/blockstates/yellow_dog_bowl.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,snowy=false": { + "model": "playercollars:block/yellow_dog_bowl_0" + }, + "age=0,snowy=true": { + "model": "playercollars:block/yellow_dog_bowl_milk" + }, + "age=1,snowy=false": { + "model": "playercollars:block/yellow_dog_bowl_1" + }, + "age=1,snowy=true": { + "model": "playercollars:block/yellow_dog_bowl_milk" + }, + "age=2,snowy=false": { + "model": "playercollars:block/yellow_dog_bowl_2" + }, + "age=2,snowy=true": { + "model": "playercollars:block/yellow_dog_bowl_milk" + }, + "age=3,snowy=false": { + "model": "playercollars:block/yellow_dog_bowl_3" + }, + "age=3,snowy=true": { + "model": "playercollars:block/yellow_dog_bowl_milk" + } + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/lang/en_us.json b/src/main/generated/assets/playercollars/lang/en_us.json new file mode 100644 index 00000000..adab91bf --- /dev/null +++ b/src/main/generated/assets/playercollars/lang/en_us.json @@ -0,0 +1,139 @@ +{ + "attribute.playercollars.clicker_distance": "Clicker Distance", + "attribute.playercollars.leash_distance": "Leash Distance", + "block.playercollars.black_dog_bed": "Black Human-Sized Dog Bed", + "block.playercollars.black_dog_bowl": "Black Dog Bowl", + "block.playercollars.blue_dog_bed": "Blue Human-Sized Dog Bed", + "block.playercollars.blue_dog_bowl": "Blue Dog Bowl", + "block.playercollars.brown_dog_bed": "Brown Human-Sized Dog Bed", + "block.playercollars.brown_dog_bowl": "Brown Dog Bowl", + "block.playercollars.cyan_dog_bed": "Cyan Human-Sized Dog Bed", + "block.playercollars.cyan_dog_bowl": "Cyan Dog Bowl", + "block.playercollars.gray_dog_bed": "Gray Human-Sized Dog Bed", + "block.playercollars.gray_dog_bowl": "Gray Dog Bowl", + "block.playercollars.green_dog_bed": "Green Human-Sized Dog Bed", + "block.playercollars.green_dog_bowl": "Green Dog Bowl", + "block.playercollars.invisible_fence": "Invisible Fence", + "block.playercollars.invisible_fence.toggle_fail": "Pets can't toggle fencing", + "block.playercollars.invisible_fence.toggle_off": "Fences disabled", + "block.playercollars.invisible_fence.toggle_on": "Fences enabled", + "block.playercollars.light_blue_dog_bed": "Light Blue Human-Sized Dog Bed", + "block.playercollars.light_blue_dog_bowl": "Light Blue Dog Bowl", + "block.playercollars.light_gray_dog_bed": "Light Gray Human-Sized Dog Bed", + "block.playercollars.light_gray_dog_bowl": "Light Gray Dog Bowl", + "block.playercollars.lime_dog_bed": "Lime Human-Sized Dog Bed", + "block.playercollars.lime_dog_bowl": "Lime Dog Bowl", + "block.playercollars.magenta_dog_bed": "Magenta Human-Sized Dog Bed", + "block.playercollars.magenta_dog_bowl": "Magenta Dog Bowl", + "block.playercollars.orange_dog_bed": "Orange Human-Sized Dog Bed", + "block.playercollars.orange_dog_bowl": "Orange Dog Bowl", + "block.playercollars.pink_dog_bed": "Pink Human-Sized Dog Bed", + "block.playercollars.pink_dog_bowl": "Pink Dog Bowl", + "block.playercollars.purple_dog_bed": "Purple Human-Sized Dog Bed", + "block.playercollars.purple_dog_bowl": "Purple Dog Bowl", + "block.playercollars.red_dog_bed": "Red Human-Sized Dog Bed", + "block.playercollars.red_dog_bowl": "Red Dog Bowl", + "block.playercollars.white_dog_bed": "White Human-Sized Dog Bed", + "block.playercollars.white_dog_bowl": "White Dog Bowl", + "block.playercollars.yellow_dog_bed": "Yellow Human-Sized Dog Bed", + "block.playercollars.yellow_dog_bowl": "Yellow Dog Bowl", + "enchantment.playercollars.clicker": "Audible", + "enchantment.playercollars.clicker_walk": "Beckon", + "enchantment.playercollars.regeneration": "Healing", + "enchantment.playercollars.short_leash": "Tight Leash", + "enchantment.playercollars.thorns": "Spiked", + "gamerule.allowUnleashUnownedPlayer": "Allow unleashing players you don't own", + "gamerule.leashedPlayersRideEntities": "Leashed players can ride entities", + "gamerule.playerAllowAttackOwner": "Players can attack owners", + "gamerule.playerLeashesBreak": "Player collar leashes break if stretched too far", + "gui.playercollars.paw_configurator.block.open": "Interactable Blocks", + "gui.playercollars.paw_configurator.block.title": "%s's Paws - Blocks", + "gui.playercollars.paw_configurator.item.open": "Holdable Items", + "gui.playercollars.paw_configurator.item.title": "%s's Paws - Items", + "gui.playercollars.paw_configurator.title": "%s's Paws", + "item.playercollars.black_foot_paws": "Black Foot Paws", + "item.playercollars.black_paws": "Black Paws", + "item.playercollars.blue_foot_paws": "Blue Foot Paws", + "item.playercollars.blue_paws": "Blue Paws", + "item.playercollars.brown_foot_paws": "Brown Foot Paws", + "item.playercollars.brown_paws": "Brown Paws", + "item.playercollars.clicker": "Clicker", + "item.playercollars.clicker.turn": "Pets will turn towards this sound", + "item.playercollars.clicker.turn_disable": "Force turning disabled", + "item.playercollars.clicker.turn_enable": "Force turning enabled", + "item.playercollars.collar": "Collar", + "item.playercollars.collar.become_owner": "Become Owner", + "item.playercollars.collar.named": "%s's Collar", + "item.playercollars.collar.owner": "Owner: %s", + "item.playercollars.collar.paw": "Paw", + "item.playercollars.collar.paw_color": "Paw: #%s", + "item.playercollars.collar.remove_owner": "Remove Owner", + "item.playercollars.collar_locker": "Collar Lock-inator", + "item.playercollars.collar_locker.locked": "Collar locked on", + "item.playercollars.collar_locker.no_set_non_deed": "Collar must be crafted with a Deed of Ownership to lock", + "item.playercollars.collar_locker.no_set_non_owner": "Must be owner to lock", + "item.playercollars.collar_locker.unlocked": "Collar unlocked", + "item.playercollars.cyan_foot_paws": "Cyan Foot Paws", + "item.playercollars.cyan_paws": "Cyan Paws", + "item.playercollars.deed_of_ownership": "Blank Deed of Ownership", + "item.playercollars.deed_of_ownership.filled": "Unsigned Deed of Ownership", + "item.playercollars.deed_of_ownership.filled_out": "Give the deed to your pet to sign", + "item.playercollars.deed_of_ownership.line1": "By stamping this contact, I, %s, accept %s as my OWNER.", + "item.playercollars.deed_of_ownership.line2": "I attest that a discussion about consent has occurred,", + "item.playercollars.deed_of_ownership.line3": "and we have agreed on boundaries to both of our satisfactions.", + "item.playercollars.deed_of_ownership.line4": "I understand that -- barring use of Curse of Binding -- ", + "item.playercollars.deed_of_ownership.line5": "I can revoke this at any time by removing my collar.", + "item.playercollars.deed_of_ownership.line6": "I acknowledge that, when wearing my collar, I will", + "item.playercollars.deed_of_ownership.line7": "bear the consequences should I attack my owner.", + "item.playercollars.deed_of_ownership.line8": "WITNESS my paw and official seal (on reverse).", + "item.playercollars.deed_of_ownership.no_self_own": "Can't sign a contract with yourself!", + "item.playercollars.deed_of_ownership.stamp": "Stamp Deed", + "item.playercollars.golden_spatula": "Golden Spatula", + "item.playercollars.gray_foot_paws": "Gray Foot Paws", + "item.playercollars.gray_paws": "Gray Paws", + "item.playercollars.green_foot_paws": "Green Foot Paws", + "item.playercollars.green_paws": "Green Paws", + "item.playercollars.invisible_fence": "Invisible Fence", + "item.playercollars.light_blue_foot_paws": "Light Blue Foot Paws", + "item.playercollars.light_blue_paws": "Light Blue Paws", + "item.playercollars.light_gray_foot_paws": "Light Gray Foot Paws", + "item.playercollars.light_gray_paws": "Light Gray Paws", + "item.playercollars.lime_foot_paws": "Lime Foot Paws", + "item.playercollars.lime_paws": "Lime Paws", + "item.playercollars.magenta_foot_paws": "Magenta Foot Paws", + "item.playercollars.magenta_paws": "Magenta Paws", + "item.playercollars.orange_foot_paws": "Orange Foot Paws", + "item.playercollars.orange_paws": "Orange Paws", + "item.playercollars.paw_configurator": "Paw Patroller", + "item.playercollars.paw_configurator.no_paws": "Paws not equipped", + "item.playercollars.paw_configurator.no_remove": "%s does not require hands to use", + "item.playercollars.paw_configurator.no_set_non_owner": "Must be owner to configure", + "item.playercollars.paws": "Paws", + "item.playercollars.paws.interaction": "Cumbersome - cannot interact with blocks", + "item.playercollars.paws.slippery": "Slippery - cannot hold items", + "item.playercollars.pink_foot_paws": "Pink Foot Paws", + "item.playercollars.pink_paws": "Pink Paws", + "item.playercollars.purple_foot_paws": "Purple Foot Paws", + "item.playercollars.purple_paws": "Purple Paws", + "item.playercollars.red_foot_paws": "Red Foot Paws", + "item.playercollars.red_paws": "Red Paws", + "item.playercollars.stamped_deed_of_ownership": "%s's Deed of Ownership", + "item.playercollars.tagless_collar": "Tagless Collar", + "item.playercollars.white_foot_paws": "White Foot Paws", + "item.playercollars.white_paws": "White Paws", + "item.playercollars.yellow_foot_paws": "Yellow Foot Paws", + "item.playercollars.yellow_paws": "Yellow Paws", + "itemGroup.playercollars": "Leashable Collars", + "message.playercollars.no_attack_owner": "Don't attack your owner!", + "message.playercollars.no_break_fence": "Can't unleash yourself!", + "message.playercollars.no_break_fence_other": "Can't unleash %s!", + "message.playercollars.no_ride_entity": "Can't ride this entity!", + "sound.playercollars.clicker_off": "Clicker clicks off", + "sound.playercollars.clicker_on": "Clicker clicks on", + "tag.block.playercollars.paws_allow_interact": "Usable with Paws", + "tag.item.trinkets.chest.necklace": "Necklace", + "tag.item.trinkets.hand.glove": "Glove", + "curios.identifier.feet": "Feet", + "curios.identifier.hands": "Hands", + "curios.identifier.necklace": "Necklace" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bed.json b/src/main/generated/assets/playercollars/models/block/black_dog_bed.json new file mode 100644 index 00000000..b0da5265 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/black_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_0.json new file mode 100644 index 00000000..450d4a82 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_1.json new file mode 100644 index 00000000..2a91859f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_2.json new file mode 100644 index 00000000..0bbda9fa --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_3.json new file mode 100644 index 00000000..b62e3b1d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/black_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_milk.json new file mode 100644 index 00000000..6b01261c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/black_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bed.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bed.json new file mode 100644 index 00000000..a79b41af --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/blue_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_0.json new file mode 100644 index 00000000..60f554d7 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_1.json new file mode 100644 index 00000000..dd4eecf3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_2.json new file mode 100644 index 00000000..4c55cfb2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_3.json new file mode 100644 index 00000000..71078684 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_milk.json new file mode 100644 index 00000000..a8a7a94d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/blue_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bed.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bed.json new file mode 100644 index 00000000..3d74d3f4 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/brown_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_0.json new file mode 100644 index 00000000..ec4dcabf --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_1.json new file mode 100644 index 00000000..593642f5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_2.json new file mode 100644 index 00000000..ec0364bc --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_3.json new file mode 100644 index 00000000..3ed066ca --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_milk.json new file mode 100644 index 00000000..608fc270 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/brown_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bed.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bed.json new file mode 100644 index 00000000..c9d98826 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/cyan_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_0.json new file mode 100644 index 00000000..b8f837f8 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_1.json new file mode 100644 index 00000000..df4a32c0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_2.json new file mode 100644 index 00000000..ab64a6f5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_3.json new file mode 100644 index 00000000..9c443517 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_milk.json new file mode 100644 index 00000000..f272716d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bed.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bed.json new file mode 100644 index 00000000..145e9464 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/gray_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_0.json new file mode 100644 index 00000000..2d3e87c6 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_1.json new file mode 100644 index 00000000..74030c36 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_2.json new file mode 100644 index 00000000..f7f10d0b --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_3.json new file mode 100644 index 00000000..1e59e866 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_milk.json new file mode 100644 index 00000000..2c5c3b31 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/gray_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bed.json b/src/main/generated/assets/playercollars/models/block/green_dog_bed.json new file mode 100644 index 00000000..3321cfaf --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/green_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_0.json new file mode 100644 index 00000000..4cd93491 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_1.json new file mode 100644 index 00000000..7c17d666 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_2.json new file mode 100644 index 00000000..0219768a --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_3.json new file mode 100644 index 00000000..dd1f2fb5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/green_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_milk.json new file mode 100644 index 00000000..bdf44c3c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/green_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/invisible_fence_post.json b/src/main/generated/assets/playercollars/models/block/invisible_fence_post.json new file mode 100644 index 00000000..2cd295ca --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/invisible_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/invisible_fence_side.json b/src/main/generated/assets/playercollars/models/block/invisible_fence_side.json new file mode 100644 index 00000000..3f30b623 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/invisible_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bed.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bed.json new file mode 100644 index 00000000..4f758beb --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/light_blue_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_0.json new file mode 100644 index 00000000..9716a4a4 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_1.json new file mode 100644 index 00000000..a7c17e93 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_2.json new file mode 100644 index 00000000..0b31b399 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_3.json new file mode 100644 index 00000000..6c8b7576 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_milk.json new file mode 100644 index 00000000..267346b3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bed.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bed.json new file mode 100644 index 00000000..a3fefadb --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/light_gray_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_0.json new file mode 100644 index 00000000..30809db0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_1.json new file mode 100644 index 00000000..14902b79 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_2.json new file mode 100644 index 00000000..2ad2e10d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_3.json new file mode 100644 index 00000000..f7398276 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_milk.json new file mode 100644 index 00000000..a87a0d4f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bed.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bed.json new file mode 100644 index 00000000..65fb343a --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/lime_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_0.json new file mode 100644 index 00000000..9c6e815f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_1.json new file mode 100644 index 00000000..a2ab0265 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_2.json new file mode 100644 index 00000000..fa485a86 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_3.json new file mode 100644 index 00000000..dd25eef8 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_milk.json new file mode 100644 index 00000000..214f7755 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/lime_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bed.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bed.json new file mode 100644 index 00000000..4e4c23f4 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/magenta_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_0.json new file mode 100644 index 00000000..d2ec929c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_1.json new file mode 100644 index 00000000..508e5e77 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_2.json new file mode 100644 index 00000000..e90e4c23 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_3.json new file mode 100644 index 00000000..2fb47ad5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_milk.json new file mode 100644 index 00000000..a79c4b82 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bed.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bed.json new file mode 100644 index 00000000..a7996160 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/orange_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_0.json new file mode 100644 index 00000000..29b8e8b2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_1.json new file mode 100644 index 00000000..044280dc --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_2.json new file mode 100644 index 00000000..250722e2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_3.json new file mode 100644 index 00000000..b6baf38c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_milk.json new file mode 100644 index 00000000..e6395285 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/orange_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bed.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bed.json new file mode 100644 index 00000000..dc46ad2f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/pink_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_0.json new file mode 100644 index 00000000..4b3db144 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_1.json new file mode 100644 index 00000000..bbb038b0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_2.json new file mode 100644 index 00000000..e2c69e4d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_3.json new file mode 100644 index 00000000..6a8dc1c0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_milk.json new file mode 100644 index 00000000..f8f0d35d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/pink_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bed.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bed.json new file mode 100644 index 00000000..3b1e7304 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/purple_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_0.json new file mode 100644 index 00000000..8c2f26ab --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_1.json new file mode 100644 index 00000000..9ba94033 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_2.json new file mode 100644 index 00000000..424d4125 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_3.json new file mode 100644 index 00000000..d4042990 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_milk.json new file mode 100644 index 00000000..7c777f65 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/purple_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/red_dog_bed.json b/src/main/generated/assets/playercollars/models/block/red_dog_bed.json new file mode 100644 index 00000000..aad4793c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/red_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/red_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/white_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_0.json new file mode 100644 index 00000000..b2744966 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/white_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_1.json new file mode 100644 index 00000000..6fe7bbfa --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/white_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_2.json new file mode 100644 index 00000000..50e7a0c5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/white_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_3.json new file mode 100644 index 00000000..a0b529a2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/white_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_milk.json new file mode 100644 index 00000000..3111ae6c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/white_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bed.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bed.json new file mode 100644 index 00000000..9f193155 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/white_dog_bed", + "textures": { + "particle": "minecraft:block/yellow_wool" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_0.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_0.json new file mode 100644 index 00000000..36e215e5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_0.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_0", + "textures": { + "particle": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_1.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_1.json new file mode 100644 index 00000000..f37b16cb --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_1.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_1", + "textures": { + "particle": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_2.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_2.json new file mode 100644 index 00000000..d01575ef --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_2.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "particle": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_3.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_3.json new file mode 100644 index 00000000..964db2b4 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_3.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3", + "textures": { + "particle": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_milk.json b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_milk.json new file mode 100644 index 00000000..371c3b57 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_milk", + "textures": { + "particle": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/black_dog_bed.json b/src/main/generated/assets/playercollars/models/item/black_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/black_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/black_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/black_dog_bowl.json new file mode 100644 index 00000000..b8a7966f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/black_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/black_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/black_foot_paws.json b/src/main/generated/assets/playercollars/models/item/black_foot_paws.json new file mode 100644 index 00000000..6587ccac --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/black_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/black_wool", + "particle": "minecraft:block/black_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/black_paws.json b/src/main/generated/assets/playercollars/models/item/black_paws.json new file mode 100644 index 00000000..afe75238 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/black_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/black_wool", + "particle": "minecraft:block/black_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/blue_dog_bed.json b/src/main/generated/assets/playercollars/models/item/blue_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/blue_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/blue_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/blue_dog_bowl.json new file mode 100644 index 00000000..4578e4d2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/blue_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/blue_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/blue_foot_paws.json b/src/main/generated/assets/playercollars/models/item/blue_foot_paws.json new file mode 100644 index 00000000..12526030 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/blue_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/blue_wool", + "particle": "minecraft:block/blue_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/blue_paws.json b/src/main/generated/assets/playercollars/models/item/blue_paws.json new file mode 100644 index 00000000..2c7597a0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/blue_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/blue_wool", + "particle": "minecraft:block/blue_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/brown_dog_bed.json b/src/main/generated/assets/playercollars/models/item/brown_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/brown_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/brown_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/brown_dog_bowl.json new file mode 100644 index 00000000..17c980c2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/brown_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/brown_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/brown_foot_paws.json b/src/main/generated/assets/playercollars/models/item/brown_foot_paws.json new file mode 100644 index 00000000..9c5b99c7 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/brown_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/brown_wool", + "particle": "minecraft:block/brown_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/brown_paws.json b/src/main/generated/assets/playercollars/models/item/brown_paws.json new file mode 100644 index 00000000..2e119485 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/brown_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/brown_wool", + "particle": "minecraft:block/brown_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/collar_locker.json b/src/main/generated/assets/playercollars/models/item/collar_locker.json new file mode 100644 index 00000000..c07e1b4d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/collar_locker.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/collar_locker" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/cyan_dog_bed.json b/src/main/generated/assets/playercollars/models/item/cyan_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/cyan_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/cyan_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/cyan_dog_bowl.json new file mode 100644 index 00000000..395f4690 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/cyan_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/cyan_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/cyan_foot_paws.json b/src/main/generated/assets/playercollars/models/item/cyan_foot_paws.json new file mode 100644 index 00000000..02dd00f0 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/cyan_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/cyan_wool", + "particle": "minecraft:block/cyan_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/cyan_paws.json b/src/main/generated/assets/playercollars/models/item/cyan_paws.json new file mode 100644 index 00000000..68222d55 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/cyan_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/cyan_wool", + "particle": "minecraft:block/cyan_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/deed_of_ownership.json b/src/main/generated/assets/playercollars/models/item/deed_of_ownership.json new file mode 100644 index 00000000..83e94cb3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/deed_of_ownership.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/deed_of_ownership" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/golden_spatula.json b/src/main/generated/assets/playercollars/models/item/golden_spatula.json new file mode 100644 index 00000000..f07cfc0b --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/golden_spatula.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "playercollars:item/golden_spatula" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/gray_dog_bed.json b/src/main/generated/assets/playercollars/models/item/gray_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/gray_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/gray_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/gray_dog_bowl.json new file mode 100644 index 00000000..b7350326 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/gray_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/gray_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/gray_foot_paws.json b/src/main/generated/assets/playercollars/models/item/gray_foot_paws.json new file mode 100644 index 00000000..9d73cb0c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/gray_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/gray_wool", + "particle": "minecraft:block/gray_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/gray_paws.json b/src/main/generated/assets/playercollars/models/item/gray_paws.json new file mode 100644 index 00000000..7e00e30c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/gray_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/gray_wool", + "particle": "minecraft:block/gray_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/green_dog_bed.json b/src/main/generated/assets/playercollars/models/item/green_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/green_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/green_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/green_dog_bowl.json new file mode 100644 index 00000000..e1d4518e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/green_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/green_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/green_foot_paws.json b/src/main/generated/assets/playercollars/models/item/green_foot_paws.json new file mode 100644 index 00000000..0d9c8829 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/green_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/green_wool", + "particle": "minecraft:block/green_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/green_paws.json b/src/main/generated/assets/playercollars/models/item/green_paws.json new file mode 100644 index 00000000..76ad13bd --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/green_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/green_wool", + "particle": "minecraft:block/green_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/invisible_fence.json b/src/main/generated/assets/playercollars/models/item/invisible_fence.json new file mode 100644 index 00000000..8386c2a3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/invisible_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/light_blue_dog_bed.json b/src/main/generated/assets/playercollars/models/item/light_blue_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_blue_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/light_blue_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/light_blue_dog_bowl.json new file mode 100644 index 00000000..2481cad8 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_blue_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/light_blue_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/light_blue_foot_paws.json b/src/main/generated/assets/playercollars/models/item/light_blue_foot_paws.json new file mode 100644 index 00000000..ffe477df --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_blue_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/light_blue_wool", + "particle": "minecraft:block/light_blue_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/light_blue_paws.json b/src/main/generated/assets/playercollars/models/item/light_blue_paws.json new file mode 100644 index 00000000..fb0e6f81 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_blue_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/light_blue_wool", + "particle": "minecraft:block/light_blue_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/light_gray_dog_bed.json b/src/main/generated/assets/playercollars/models/item/light_gray_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_gray_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/light_gray_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/light_gray_dog_bowl.json new file mode 100644 index 00000000..455d327f --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_gray_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/light_gray_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/light_gray_foot_paws.json b/src/main/generated/assets/playercollars/models/item/light_gray_foot_paws.json new file mode 100644 index 00000000..da16a8ce --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_gray_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/light_gray_wool", + "particle": "minecraft:block/light_gray_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/light_gray_paws.json b/src/main/generated/assets/playercollars/models/item/light_gray_paws.json new file mode 100644 index 00000000..cfa2e1c5 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/light_gray_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/light_gray_wool", + "particle": "minecraft:block/light_gray_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/lime_dog_bed.json b/src/main/generated/assets/playercollars/models/item/lime_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/lime_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/lime_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/lime_dog_bowl.json new file mode 100644 index 00000000..6f38b8f2 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/lime_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/lime_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/lime_foot_paws.json b/src/main/generated/assets/playercollars/models/item/lime_foot_paws.json new file mode 100644 index 00000000..bf6618e3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/lime_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/lime_wool", + "particle": "minecraft:block/lime_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/lime_paws.json b/src/main/generated/assets/playercollars/models/item/lime_paws.json new file mode 100644 index 00000000..a758a78e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/lime_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/lime_wool", + "particle": "minecraft:block/lime_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/magenta_dog_bed.json b/src/main/generated/assets/playercollars/models/item/magenta_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/magenta_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/magenta_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/magenta_dog_bowl.json new file mode 100644 index 00000000..d0f325f8 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/magenta_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/magenta_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/magenta_foot_paws.json b/src/main/generated/assets/playercollars/models/item/magenta_foot_paws.json new file mode 100644 index 00000000..89886c81 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/magenta_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/magenta_wool", + "particle": "minecraft:block/magenta_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/magenta_paws.json b/src/main/generated/assets/playercollars/models/item/magenta_paws.json new file mode 100644 index 00000000..d07a522d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/magenta_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/magenta_wool", + "particle": "minecraft:block/magenta_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/orange_dog_bed.json b/src/main/generated/assets/playercollars/models/item/orange_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/orange_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/orange_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/orange_dog_bowl.json new file mode 100644 index 00000000..c0cf35bc --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/orange_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/orange_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/orange_foot_paws.json b/src/main/generated/assets/playercollars/models/item/orange_foot_paws.json new file mode 100644 index 00000000..d1dff283 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/orange_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/orange_wool", + "particle": "minecraft:block/orange_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/orange_paws.json b/src/main/generated/assets/playercollars/models/item/orange_paws.json new file mode 100644 index 00000000..42de640d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/orange_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/orange_wool", + "particle": "minecraft:block/orange_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/pink_dog_bed.json b/src/main/generated/assets/playercollars/models/item/pink_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/pink_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/pink_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/pink_dog_bowl.json new file mode 100644 index 00000000..ab528c96 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/pink_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/pink_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/pink_foot_paws.json b/src/main/generated/assets/playercollars/models/item/pink_foot_paws.json new file mode 100644 index 00000000..7732cd2b --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/pink_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/pink_wool", + "particle": "minecraft:block/pink_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/pink_paws.json b/src/main/generated/assets/playercollars/models/item/pink_paws.json new file mode 100644 index 00000000..8c94f553 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/pink_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/pink_wool", + "particle": "minecraft:block/pink_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/purple_dog_bed.json b/src/main/generated/assets/playercollars/models/item/purple_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/purple_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/purple_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/purple_dog_bowl.json new file mode 100644 index 00000000..12137e74 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/purple_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/purple_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/purple_foot_paws.json b/src/main/generated/assets/playercollars/models/item/purple_foot_paws.json new file mode 100644 index 00000000..49e9df1e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/purple_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/purple_wool", + "particle": "minecraft:block/purple_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/purple_paws.json b/src/main/generated/assets/playercollars/models/item/purple_paws.json new file mode 100644 index 00000000..a08665b6 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/purple_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/purple_wool", + "particle": "minecraft:block/purple_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/red_dog_bed.json b/src/main/generated/assets/playercollars/models/item/red_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/red_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/red_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/red_dog_bowl.json new file mode 100644 index 00000000..ca30c8a1 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/red_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/red_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/red_foot_paws.json b/src/main/generated/assets/playercollars/models/item/red_foot_paws.json new file mode 100644 index 00000000..d299cea3 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/red_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/red_wool", + "particle": "minecraft:block/red_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/red_paws.json b/src/main/generated/assets/playercollars/models/item/red_paws.json new file mode 100644 index 00000000..fa71506c --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/red_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/red_wool", + "particle": "minecraft:block/red_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/stamped_deed_of_ownership.json b/src/main/generated/assets/playercollars/models/item/stamped_deed_of_ownership.json new file mode 100644 index 00000000..8a33f55a --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/stamped_deed_of_ownership.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/stamped_deed_of_ownership" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/white_dog_bed.json b/src/main/generated/assets/playercollars/models/item/white_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/white_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/white_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/white_dog_bowl.json new file mode 100644 index 00000000..edeca634 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/white_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/white_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/yellow_dog_bed.json b/src/main/generated/assets/playercollars/models/item/yellow_dog_bed.json new file mode 100644 index 00000000..c0323e8e --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/yellow_dog_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "playercollars:item/white_dog_bed" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/yellow_dog_bowl.json b/src/main/generated/assets/playercollars/models/item/yellow_dog_bowl.json new file mode 100644 index 00000000..e8ccb6dc --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/yellow_dog_bowl.json @@ -0,0 +1,3 @@ +{ + "parent": "playercollars:block/yellow_dog_bowl_3" +} \ No newline at end of file diff --git a/src/main/generated/assets/playercollars/models/item/yellow_foot_paws.json b/src/main/generated/assets/playercollars/models/item/yellow_foot_paws.json new file mode 100644 index 00000000..270f712d --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/yellow_foot_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_foot_paws", + "textures": { + "layer0": "minecraft:block/yellow_wool", + "particle": "minecraft:block/yellow_wool" + } +} diff --git a/src/main/generated/assets/playercollars/models/item/yellow_paws.json b/src/main/generated/assets/playercollars/models/item/yellow_paws.json new file mode 100644 index 00000000..5a1b7b59 --- /dev/null +++ b/src/main/generated/assets/playercollars/models/item/yellow_paws.json @@ -0,0 +1,7 @@ +{ + "parent": "playercollars:item/white_paws", + "textures": { + "layer0": "minecraft:block/yellow_wool", + "particle": "minecraft:block/yellow_wool" + } +} diff --git a/src/main/generated/data/c/tags/items/collars.json b/src/main/generated/data/c/tags/items/collars.json new file mode 100644 index 00000000..f8093113 --- /dev/null +++ b/src/main/generated/data/c/tags/items/collars.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "playercollars:collar", + "playercollars:tagless_collar", + { + "id": "#petworks:collars", + "required": false + } + ] +} diff --git a/src/main/generated/data/minecraft/tags/blocks/beds.json b/src/main/generated/data/minecraft/tags/blocks/beds.json new file mode 100644 index 00000000..117b0861 --- /dev/null +++ b/src/main/generated/data/minecraft/tags/blocks/beds.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "playercollars:white_dog_bed", + "playercollars:orange_dog_bed", + "playercollars:magenta_dog_bed", + "playercollars:light_blue_dog_bed", + "playercollars:yellow_dog_bed", + "playercollars:lime_dog_bed", + "playercollars:pink_dog_bed", + "playercollars:gray_dog_bed", + "playercollars:light_gray_dog_bed", + "playercollars:cyan_dog_bed", + "playercollars:purple_dog_bed", + "playercollars:blue_dog_bed", + "playercollars:brown_dog_bed", + "playercollars:green_dog_bed", + "playercollars:red_dog_bed", + "playercollars:black_dog_bed" + ] +} diff --git a/src/main/generated/data/minecraft/tags/blocks/fences.json b/src/main/generated/data/minecraft/tags/blocks/fences.json new file mode 100644 index 00000000..233b5570 --- /dev/null +++ b/src/main/generated/data/minecraft/tags/blocks/fences.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "playercollars:invisible_fence" + ] +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/building_blocks/invisible_fence.json b/src/main/generated/data/playercollars/advancements/recipes/building_blocks/invisible_fence.json new file mode 100644 index 00000000..ccd4a503 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/building_blocks/invisible_fence.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_redstone": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:redstone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:invisible_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_redstone", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:invisible_fence" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bed.json new file mode 100644 index 00000000..aa63b002 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_black_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:black_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:black_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_black_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:black_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bowl.json new file mode 100644 index 00000000..afa4bd81 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_black_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:black_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:black_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_black_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:black_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bed.json new file mode 100644 index 00000000..49a51e7d --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:blue_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:blue_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blue_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:blue_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bowl.json new file mode 100644 index 00000000..be4aafae --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:blue_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:blue_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blue_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:blue_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bed.json new file mode 100644 index 00000000..49cd49ac --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brown_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:brown_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:brown_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brown_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:brown_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bowl.json new file mode 100644 index 00000000..6a21bc83 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brown_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:brown_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:brown_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brown_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:brown_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bed.json new file mode 100644 index 00000000..59a95544 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cyan_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:cyan_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:cyan_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cyan_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:cyan_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bowl.json new file mode 100644 index 00000000..8c945f4b --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cyan_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:cyan_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:cyan_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cyan_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:cyan_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bed.json new file mode 100644 index 00000000..6b5594a3 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gray_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:gray_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:gray_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gray_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:gray_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bowl.json new file mode 100644 index 00000000..9c503c9e --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gray_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:gray_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:gray_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gray_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:gray_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bed.json new file mode 100644 index 00000000..af5c7e37 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:green_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:green_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_green_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:green_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bowl.json new file mode 100644 index 00000000..c4f93f42 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:green_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:green_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_green_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:green_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bed.json new file mode 100644 index 00000000..2bcb4f3b --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_blue_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_blue_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_blue_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_blue_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_blue_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bowl.json new file mode 100644 index 00000000..0ab7a058 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_blue_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_blue_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_blue_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_blue_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_blue_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bed.json new file mode 100644 index 00000000..7b48af96 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_gray_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_gray_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_gray_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_gray_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_gray_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bowl.json new file mode 100644 index 00000000..32c9fac2 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_gray_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_gray_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_gray_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_gray_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_gray_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bed.json new file mode 100644 index 00000000..f4de012d --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lime_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:lime_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:lime_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lime_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:lime_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bowl.json new file mode 100644 index 00000000..eb7dad8b --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lime_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:lime_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:lime_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lime_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:lime_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bed.json new file mode 100644 index 00000000..5ebdbf9c --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_magenta_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:magenta_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:magenta_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_magenta_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:magenta_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bowl.json new file mode 100644 index 00000000..d2eefd81 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_magenta_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:magenta_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:magenta_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_magenta_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:magenta_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bed.json new file mode 100644 index 00000000..7e95273d --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_orange_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:orange_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:orange_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_orange_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:orange_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bowl.json new file mode 100644 index 00000000..c78f3e85 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_orange_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:orange_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:orange_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_orange_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:orange_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bed.json new file mode 100644 index 00000000..6ac33e09 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_pink_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:pink_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:pink_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_pink_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:pink_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bowl.json new file mode 100644 index 00000000..740a2310 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_pink_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:pink_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:pink_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_pink_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:pink_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bed.json new file mode 100644 index 00000000..4e1abd4e --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_purple_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:purple_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:purple_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_purple_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:purple_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bowl.json new file mode 100644 index 00000000..e452ff18 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_purple_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:purple_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:purple_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_purple_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:purple_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bed.json new file mode 100644 index 00000000..592ef54e --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_red_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:red_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:red_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_red_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:red_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bowl.json new file mode 100644 index 00000000..a5134006 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_red_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:red_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:red_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_red_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:red_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bed.json new file mode 100644 index 00000000..3dbb9bc3 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:white_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:white_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:white_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bowl.json new file mode 100644 index 00000000..8ada5e00 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:white_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:white_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:white_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bed.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bed.json new file mode 100644 index 00000000..a681a3b7 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:yellow_dog_bed" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_yellow_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:yellow_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_yellow_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:yellow_dog_bed" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bowl.json b/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bowl.json new file mode 100644 index 00000000..4e5223fb --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bowl.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:yellow_dog_bowl" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_yellow_terracotta": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:yellow_terracotta" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_yellow_terracotta", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:yellow_dog_bowl" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/black_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/black_foot_paws.json new file mode 100644 index 00000000..c682670f --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/black_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:black_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:black_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/black_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/black_paws.json new file mode 100644 index 00000000..170ebcfb --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/black_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_black_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:black_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:black_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_black_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:black_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/blue_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/blue_foot_paws.json new file mode 100644 index 00000000..bebc8a31 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/blue_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:blue_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:blue_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/blue_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/blue_paws.json new file mode 100644 index 00000000..41ac4aa4 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/blue_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:blue_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:blue_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blue_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:blue_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/brown_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/brown_foot_paws.json new file mode 100644 index 00000000..da314ed1 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/brown_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:brown_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:brown_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/brown_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/brown_paws.json new file mode 100644 index 00000000..80b79632 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/brown_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brown_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:brown_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:brown_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brown_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:brown_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/clicker.json b/src/main/generated/data/playercollars/advancements/recipes/misc/clicker.json new file mode 100644 index 00000000..8b9d2aef --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/clicker.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_iron_ingot": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:clicker" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:clicker" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/collar.json b/src/main/generated/data/playercollars/advancements/recipes/misc/collar.json new file mode 100644 index 00000000..84a44a7f --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/collar.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:collar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:collar" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_foot_paws.json new file mode 100644 index 00000000..e8ee4710 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:cyan_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:cyan_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_paws.json new file mode 100644 index 00000000..8c0d601c --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/cyan_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cyan_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:cyan_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:cyan_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cyan_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:cyan_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/deed_of_ownership.json b/src/main/generated/data/playercollars/advancements/recipes/misc/deed_of_ownership.json new file mode 100644 index 00000000..da78d5d0 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/deed_of_ownership.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_paper": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:paper" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:deed_of_ownership" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_paper", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:deed_of_ownership" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/gray_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/gray_foot_paws.json new file mode 100644 index 00000000..9db53e49 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/gray_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:gray_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:gray_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/gray_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/gray_paws.json new file mode 100644 index 00000000..9969708e --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/gray_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gray_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:gray_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:gray_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gray_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:gray_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/green_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/green_foot_paws.json new file mode 100644 index 00000000..e709fe5f --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/green_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:green_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:green_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/green_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/green_paws.json new file mode 100644 index 00000000..3ac1fcc2 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/green_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:green_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:green_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_green_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:green_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_foot_paws.json new file mode 100644 index 00000000..6ad5d1ff --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_blue_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_blue_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_paws.json new file mode 100644 index 00000000..c33a134b --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_blue_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_blue_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_blue_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_blue_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_blue_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_foot_paws.json new file mode 100644 index 00000000..c2647e52 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_gray_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_gray_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_paws.json new file mode 100644 index 00000000..4e3448b9 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_gray_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:light_gray_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:light_gray_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_gray_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:light_gray_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/lime_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/lime_foot_paws.json new file mode 100644 index 00000000..f508ccb7 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/lime_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:lime_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:lime_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/lime_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/lime_paws.json new file mode 100644 index 00000000..a06e7556 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/lime_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lime_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:lime_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:lime_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lime_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:lime_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_foot_paws.json new file mode 100644 index 00000000..f38082a5 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:magenta_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:magenta_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_paws.json new file mode 100644 index 00000000..0af62714 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/magenta_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_magenta_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:magenta_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:magenta_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_magenta_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:magenta_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/orange_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/orange_foot_paws.json new file mode 100644 index 00000000..3c32e985 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/orange_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:orange_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:orange_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/orange_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/orange_paws.json new file mode 100644 index 00000000..34a5dd68 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/orange_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_orange_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:orange_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:orange_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_orange_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:orange_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/pink_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/pink_foot_paws.json new file mode 100644 index 00000000..13cc1409 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/pink_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:pink_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:pink_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/pink_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/pink_paws.json new file mode 100644 index 00000000..6cc5acdb --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/pink_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_pink_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:pink_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:pink_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_pink_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:pink_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/purple_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/purple_foot_paws.json new file mode 100644 index 00000000..c3a09dc6 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/purple_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:purple_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:purple_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/purple_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/purple_paws.json new file mode 100644 index 00000000..4df235c5 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/purple_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_purple_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:purple_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:purple_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_purple_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:purple_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/red_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/red_foot_paws.json new file mode 100644 index 00000000..d43ab234 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/red_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:red_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:red_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/red_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/red_paws.json new file mode 100644 index 00000000..a6d6ab6d --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/red_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_red_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:red_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:red_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_red_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:red_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/tagless_collar.json b/src/main/generated/data/playercollars/advancements/recipes/misc/tagless_collar.json new file mode 100644 index 00000000..045e5e3f --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/tagless_collar.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:tagless_collar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:tagless_collar" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/white_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/white_foot_paws.json new file mode 100644 index 00000000..4c9a0fa2 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/white_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:white_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:white_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/white_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/white_paws.json new file mode 100644 index 00000000..b41ea6ee --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/white_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:white_paws" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:white_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:white_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_foot_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_foot_paws.json new file mode 100644 index 00000000..ce769db6 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_foot_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_leather": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:leather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:yellow_foot_paws" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_leather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:yellow_foot_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_paws.json b/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_paws.json new file mode 100644 index 00000000..3a9b020f --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/misc/yellow_paws.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:yellow_paws" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_yellow_wool": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:yellow_wool" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_yellow_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:yellow_paws" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/tools/collar_locker.json b/src/main/generated/data/playercollars/advancements/recipes/tools/collar_locker.json new file mode 100644 index 00000000..c7ac4eb2 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/tools/collar_locker.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_stamped_deed_of_ownership": { + "conditions": { + "items": [ + { + "items": [ + "playercollars:stamped_deed_of_ownership" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:collar_locker" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_stamped_deed_of_ownership", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:collar_locker" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/tools/golden_spatula.json b/src/main/generated/data/playercollars/advancements/recipes/tools/golden_spatula.json new file mode 100644 index 00000000..f0304f98 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/tools/golden_spatula.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gold_ingot": { + "conditions": { + "items": [ + { + "tag": "c:gold_ingots" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:golden_spatula" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gold_ingot", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:golden_spatula" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/advancements/recipes/tools/paw_configurator.json b/src/main/generated/data/playercollars/advancements/recipes/tools/paw_configurator.json new file mode 100644 index 00000000..288ceec1 --- /dev/null +++ b/src/main/generated/data/playercollars/advancements/recipes/tools/paw_configurator.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "playercollars:paw_configurator" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_paws": { + "conditions": { + "items": [ + { + "tag": "playercollars:paws" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_paws", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "playercollars:paw_configurator" + ] + }, + "sends_telemetry_event": false +} diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bed.json new file mode 100644 index 00000000..b7af16b6 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:black_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:black_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bowl.json new file mode 100644 index 00000000..4ed7e04b --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:black_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bed.json new file mode 100644 index 00000000..c653203b --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:blue_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:blue_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bowl.json new file mode 100644 index 00000000..a22515c1 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:blue_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bed.json new file mode 100644 index 00000000..86e84557 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:brown_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:brown_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bowl.json new file mode 100644 index 00000000..91b01905 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:brown_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bed.json new file mode 100644 index 00000000..4939656f --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:cyan_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:cyan_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bowl.json new file mode 100644 index 00000000..1443af51 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:cyan_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bed.json new file mode 100644 index 00000000..26869003 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:gray_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:gray_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bowl.json new file mode 100644 index 00000000..65ea0e56 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:gray_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bed.json new file mode 100644 index 00000000..f23b4893 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:green_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:green_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bowl.json new file mode 100644 index 00000000..f7af422c --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:green_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/invisible_fence.json b/src/main/generated/data/playercollars/loot_tables/blocks/invisible_fence.json new file mode 100644 index 00000000..76d8f14f --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/invisible_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:invisible_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bed.json new file mode 100644 index 00000000..d530eb5d --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:light_blue_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:light_blue_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bowl.json new file mode 100644 index 00000000..65fc525e --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:light_blue_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bed.json new file mode 100644 index 00000000..74f118ec --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:light_gray_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:light_gray_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bowl.json new file mode 100644 index 00000000..fc6e8ce9 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:light_gray_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bed.json new file mode 100644 index 00000000..0254085b --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:lime_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:lime_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bowl.json new file mode 100644 index 00000000..789f9f62 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:lime_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bed.json new file mode 100644 index 00000000..723712d5 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:magenta_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:magenta_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bowl.json new file mode 100644 index 00000000..4a7b19c1 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:magenta_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bed.json new file mode 100644 index 00000000..2e16145e --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:orange_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:orange_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bowl.json new file mode 100644 index 00000000..912840da --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:orange_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bed.json new file mode 100644 index 00000000..8f83dddf --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:pink_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:pink_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bowl.json new file mode 100644 index 00000000..06206276 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:pink_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bed.json new file mode 100644 index 00000000..6956c4fd --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:purple_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:purple_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bowl.json new file mode 100644 index 00000000..23035f06 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:purple_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bed.json new file mode 100644 index 00000000..9bf35013 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:red_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:red_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bowl.json new file mode 100644 index 00000000..3b5ff7cb --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:red_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bed.json new file mode 100644 index 00000000..49603cd2 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:white_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:white_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bowl.json new file mode 100644 index 00000000..91e75144 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:white_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bed.json b/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bed.json new file mode 100644 index 00000000..1372f9f1 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bed.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "playercollars:yellow_dog_bed", + "condition": "minecraft:block_state_property", + "properties": { + "part": "head" + } + } + ], + "name": "playercollars:yellow_dog_bed" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bowl.json b/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bowl.json new file mode 100644 index 00000000..51bfa472 --- /dev/null +++ b/src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bowl.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "playercollars:yellow_dog_bowl" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/playercollars/recipes/black_dog_bed.json b/src/main/generated/data/playercollars/recipes/black_dog_bed.json new file mode 100644 index 00000000..5dd225f7 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/black_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:black_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:black_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/black_dog_bowl.json b/src/main/generated/data/playercollars/recipes/black_dog_bowl.json new file mode 100644 index 00000000..86e73e1c --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/black_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:black_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:black_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/black_foot_paws.json b/src/main/generated/data/playercollars/recipes/black_foot_paws.json new file mode 100644 index 00000000..8c4f75a5 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/black_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:black_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:black_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/black_paws.json b/src/main/generated/data/playercollars/recipes/black_paws.json new file mode 100644 index 00000000..dd660508 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/black_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:black_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:black_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/blue_dog_bed.json b/src/main/generated/data/playercollars/recipes/blue_dog_bed.json new file mode 100644 index 00000000..857ae06c --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/blue_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:blue_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:blue_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/blue_dog_bowl.json b/src/main/generated/data/playercollars/recipes/blue_dog_bowl.json new file mode 100644 index 00000000..efa76af8 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/blue_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:blue_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:blue_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/blue_foot_paws.json b/src/main/generated/data/playercollars/recipes/blue_foot_paws.json new file mode 100644 index 00000000..72a3a74e --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/blue_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:blue_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:blue_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/blue_paws.json b/src/main/generated/data/playercollars/recipes/blue_paws.json new file mode 100644 index 00000000..39e4a854 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/blue_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:blue_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:blue_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/brown_dog_bed.json b/src/main/generated/data/playercollars/recipes/brown_dog_bed.json new file mode 100644 index 00000000..01fc14cd --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/brown_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:brown_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:brown_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/brown_dog_bowl.json b/src/main/generated/data/playercollars/recipes/brown_dog_bowl.json new file mode 100644 index 00000000..96f1aa58 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/brown_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:brown_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:brown_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/brown_foot_paws.json b/src/main/generated/data/playercollars/recipes/brown_foot_paws.json new file mode 100644 index 00000000..ee7dc313 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/brown_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:brown_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:brown_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/brown_paws.json b/src/main/generated/data/playercollars/recipes/brown_paws.json new file mode 100644 index 00000000..256f70e5 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/brown_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:brown_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:brown_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/clicker.json b/src/main/generated/data/playercollars/recipes/clicker.json new file mode 100644 index 00000000..2155a0f7 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/clicker.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "b": { + "tag": "minecraft:buttons" + }, + "i": { + "tag": "forge:ingots/iron" + }, + "p": { + "tag": "minecraft:planks" + } + }, + "pattern": [ + " b ", + "pip", + " p " + ], + "result": { + "item": "playercollars:clicker" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/collar.json b/src/main/generated/data/playercollars/recipes/collar.json new file mode 100644 index 00000000..80e2bed4 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/collar.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "d": { + "tag": "forge:dyes" + }, + "i": { + "tag": "forge:ingots/gold" + }, + "l": { + "item": "minecraft:leather" + } + }, + "pattern": [ + " l ", + "lil", + " d " + ], + "result": { + "item": "playercollars:collar" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/collar_locker.json b/src/main/generated/data/playercollars/recipes/collar_locker.json new file mode 100644 index 00000000..81cbb58d --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/collar_locker.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "tag": "forge:dusts/redstone" + }, + { + "item": "minecraft:chain" + }, + { + "item": "minecraft:chain" + }, + { + "item": "minecraft:iron_bars" + } + ], + "result": { + "item": "playercollars:collar_locker" + } +} diff --git a/src/main/generated/data/playercollars/recipes/cyan_dog_bed.json b/src/main/generated/data/playercollars/recipes/cyan_dog_bed.json new file mode 100644 index 00000000..7ef628f0 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/cyan_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:cyan_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:cyan_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/cyan_dog_bowl.json b/src/main/generated/data/playercollars/recipes/cyan_dog_bowl.json new file mode 100644 index 00000000..52799123 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/cyan_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:cyan_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:cyan_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/cyan_foot_paws.json b/src/main/generated/data/playercollars/recipes/cyan_foot_paws.json new file mode 100644 index 00000000..2ccaaf40 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/cyan_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:cyan_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:cyan_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/cyan_paws.json b/src/main/generated/data/playercollars/recipes/cyan_paws.json new file mode 100644 index 00000000..030f8ead --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/cyan_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:cyan_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:cyan_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/deed_of_ownership.json b/src/main/generated/data/playercollars/recipes/deed_of_ownership.json new file mode 100644 index 00000000..375f7549 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/deed_of_ownership.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:lead" + }, + { + "item": "minecraft:ink_sac" + }, + { + "item": "minecraft:feather" + } + ], + "result": { + "item": "playercollars:deed_of_ownership" + } +} diff --git a/src/main/generated/data/playercollars/recipes/golden_spatula.json b/src/main/generated/data/playercollars/recipes/golden_spatula.json new file mode 100644 index 00000000..67c8b1ca --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/golden_spatula.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "g": { + "tag": "forge:ingots/gold" + }, + "s": { + "item": "minecraft:stick" + } + }, + "pattern": [ + " g", + " g ", + "s " + ], + "result": { + "item": "playercollars:golden_spatula" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/gray_dog_bed.json b/src/main/generated/data/playercollars/recipes/gray_dog_bed.json new file mode 100644 index 00000000..cd4584fe --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/gray_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:gray_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:gray_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/gray_dog_bowl.json b/src/main/generated/data/playercollars/recipes/gray_dog_bowl.json new file mode 100644 index 00000000..856aebf5 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/gray_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:gray_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:gray_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/gray_foot_paws.json b/src/main/generated/data/playercollars/recipes/gray_foot_paws.json new file mode 100644 index 00000000..99e42fb0 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/gray_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:gray_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:gray_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/gray_paws.json b/src/main/generated/data/playercollars/recipes/gray_paws.json new file mode 100644 index 00000000..81a74795 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/gray_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:gray_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:gray_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/green_dog_bed.json b/src/main/generated/data/playercollars/recipes/green_dog_bed.json new file mode 100644 index 00000000..0133e5b4 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/green_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:green_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:green_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/green_dog_bowl.json b/src/main/generated/data/playercollars/recipes/green_dog_bowl.json new file mode 100644 index 00000000..c659adaa --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/green_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:green_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:green_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/green_foot_paws.json b/src/main/generated/data/playercollars/recipes/green_foot_paws.json new file mode 100644 index 00000000..7f7fdc6a --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/green_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:green_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:green_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/green_paws.json b/src/main/generated/data/playercollars/recipes/green_paws.json new file mode 100644 index 00000000..71de4d35 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/green_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:green_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:green_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/invisible_fence.json b/src/main/generated/data/playercollars/recipes/invisible_fence.json new file mode 100644 index 00000000..da76701a --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/invisible_fence.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "g": { + "item": "minecraft:glass_pane" + }, + "r": { + "item": "minecraft:redstone" + }, + "s": { + "item": "minecraft:stone" + } + }, + "pattern": [ + "grg", + "srs" + ], + "result": { + "count": 3, + "item": "playercollars:invisible_fence" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_blue_dog_bed.json b/src/main/generated/data/playercollars/recipes/light_blue_dog_bed.json new file mode 100644 index 00000000..4be87780 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_blue_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:light_blue_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:light_blue_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_blue_dog_bowl.json b/src/main/generated/data/playercollars/recipes/light_blue_dog_bowl.json new file mode 100644 index 00000000..bca59536 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_blue_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:light_blue_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:light_blue_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_blue_foot_paws.json b/src/main/generated/data/playercollars/recipes/light_blue_foot_paws.json new file mode 100644 index 00000000..ee9eaede --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_blue_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:light_blue_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:light_blue_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_blue_paws.json b/src/main/generated/data/playercollars/recipes/light_blue_paws.json new file mode 100644 index 00000000..db999cc0 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_blue_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:light_blue_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:light_blue_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_gray_dog_bed.json b/src/main/generated/data/playercollars/recipes/light_gray_dog_bed.json new file mode 100644 index 00000000..4fedb756 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_gray_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:light_gray_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:light_gray_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_gray_dog_bowl.json b/src/main/generated/data/playercollars/recipes/light_gray_dog_bowl.json new file mode 100644 index 00000000..95a5a09d --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_gray_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:light_gray_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:light_gray_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_gray_foot_paws.json b/src/main/generated/data/playercollars/recipes/light_gray_foot_paws.json new file mode 100644 index 00000000..e85d731e --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_gray_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:light_gray_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:light_gray_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/light_gray_paws.json b/src/main/generated/data/playercollars/recipes/light_gray_paws.json new file mode 100644 index 00000000..faf5d6c8 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/light_gray_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:light_gray_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:light_gray_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/lime_dog_bed.json b/src/main/generated/data/playercollars/recipes/lime_dog_bed.json new file mode 100644 index 00000000..38fe25e1 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/lime_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:lime_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:lime_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/lime_dog_bowl.json b/src/main/generated/data/playercollars/recipes/lime_dog_bowl.json new file mode 100644 index 00000000..3d3f1a72 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/lime_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:lime_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:lime_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/lime_foot_paws.json b/src/main/generated/data/playercollars/recipes/lime_foot_paws.json new file mode 100644 index 00000000..352f8e0e --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/lime_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:lime_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:lime_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/lime_paws.json b/src/main/generated/data/playercollars/recipes/lime_paws.json new file mode 100644 index 00000000..f629ecef --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/lime_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:lime_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:lime_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/magenta_dog_bed.json b/src/main/generated/data/playercollars/recipes/magenta_dog_bed.json new file mode 100644 index 00000000..5832df13 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/magenta_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:magenta_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:magenta_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/magenta_dog_bowl.json b/src/main/generated/data/playercollars/recipes/magenta_dog_bowl.json new file mode 100644 index 00000000..dcc0893c --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/magenta_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:magenta_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:magenta_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/magenta_foot_paws.json b/src/main/generated/data/playercollars/recipes/magenta_foot_paws.json new file mode 100644 index 00000000..492435bf --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/magenta_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:magenta_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:magenta_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/magenta_paws.json b/src/main/generated/data/playercollars/recipes/magenta_paws.json new file mode 100644 index 00000000..213a7140 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/magenta_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:magenta_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:magenta_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/orange_dog_bed.json b/src/main/generated/data/playercollars/recipes/orange_dog_bed.json new file mode 100644 index 00000000..2e9d20a9 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/orange_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:orange_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:orange_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/orange_dog_bowl.json b/src/main/generated/data/playercollars/recipes/orange_dog_bowl.json new file mode 100644 index 00000000..050b69cd --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/orange_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:orange_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:orange_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/orange_foot_paws.json b/src/main/generated/data/playercollars/recipes/orange_foot_paws.json new file mode 100644 index 00000000..6059a991 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/orange_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:orange_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:orange_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/orange_paws.json b/src/main/generated/data/playercollars/recipes/orange_paws.json new file mode 100644 index 00000000..587fdefc --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/orange_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:orange_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:orange_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/paw_configurator.json b/src/main/generated/data/playercollars/recipes/paw_configurator.json new file mode 100644 index 00000000..348fa289 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/paw_configurator.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "tag": "forge:dusts/redstone" + }, + { + "tag": "forge:ingots/copper" + }, + { + "item": "playercollars:collar_locker" + } + ], + "result": { + "item": "playercollars:paw_configurator" + } +} diff --git a/src/main/generated/data/playercollars/recipes/pink_dog_bed.json b/src/main/generated/data/playercollars/recipes/pink_dog_bed.json new file mode 100644 index 00000000..3e4091b9 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/pink_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:pink_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:pink_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/pink_dog_bowl.json b/src/main/generated/data/playercollars/recipes/pink_dog_bowl.json new file mode 100644 index 00000000..0ce2859b --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/pink_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:pink_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:pink_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/pink_foot_paws.json b/src/main/generated/data/playercollars/recipes/pink_foot_paws.json new file mode 100644 index 00000000..688afe97 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/pink_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:pink_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:pink_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/pink_paws.json b/src/main/generated/data/playercollars/recipes/pink_paws.json new file mode 100644 index 00000000..db48f31a --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/pink_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:pink_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:pink_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/purple_dog_bed.json b/src/main/generated/data/playercollars/recipes/purple_dog_bed.json new file mode 100644 index 00000000..0f36e85d --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/purple_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:purple_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:purple_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/purple_dog_bowl.json b/src/main/generated/data/playercollars/recipes/purple_dog_bowl.json new file mode 100644 index 00000000..2c252878 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/purple_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:purple_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:purple_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/purple_foot_paws.json b/src/main/generated/data/playercollars/recipes/purple_foot_paws.json new file mode 100644 index 00000000..474408c0 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/purple_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:purple_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:purple_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/purple_paws.json b/src/main/generated/data/playercollars/recipes/purple_paws.json new file mode 100644 index 00000000..2e3e427b --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/purple_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:purple_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:purple_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/red_dog_bed.json b/src/main/generated/data/playercollars/recipes/red_dog_bed.json new file mode 100644 index 00000000..618a355e --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/red_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:red_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:red_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/red_dog_bowl.json b/src/main/generated/data/playercollars/recipes/red_dog_bowl.json new file mode 100644 index 00000000..8d5e0da9 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/red_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:red_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:red_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/red_foot_paws.json b/src/main/generated/data/playercollars/recipes/red_foot_paws.json new file mode 100644 index 00000000..7055b661 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/red_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:red_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:red_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/red_paws.json b/src/main/generated/data/playercollars/recipes/red_paws.json new file mode 100644 index 00000000..0b511125 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/red_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:red_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:red_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/tagless_collar.json b/src/main/generated/data/playercollars/recipes/tagless_collar.json new file mode 100644 index 00000000..94328a8a --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/tagless_collar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "d": { + "tag": "forge:dyes" + }, + "l": { + "item": "minecraft:leather" + } + }, + "pattern": [ + " l ", + "ldl" + ], + "result": { + "item": "playercollars:tagless_collar" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/white_dog_bed.json b/src/main/generated/data/playercollars/recipes/white_dog_bed.json new file mode 100644 index 00000000..7e52908a --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/white_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:white_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:white_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/white_dog_bowl.json b/src/main/generated/data/playercollars/recipes/white_dog_bowl.json new file mode 100644 index 00000000..261a32eb --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/white_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:white_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:white_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/white_foot_paws.json b/src/main/generated/data/playercollars/recipes/white_foot_paws.json new file mode 100644 index 00000000..8bbab710 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/white_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:white_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:white_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/white_paws.json b/src/main/generated/data/playercollars/recipes/white_paws.json new file mode 100644 index 00000000..93dc0f50 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/white_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:white_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:white_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/yellow_dog_bed.json b/src/main/generated/data/playercollars/recipes/yellow_dog_bed.json new file mode 100644 index 00000000..8bd17808 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/yellow_dog_bed.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bed", + "key": { + "w": { + "item": "minecraft:yellow_wool" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:yellow_dog_bed" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/yellow_dog_bowl.json b/src/main/generated/data/playercollars/recipes/yellow_dog_bowl.json new file mode 100644 index 00000000..9f8538d3 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/yellow_dog_bowl.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "dog_bowl", + "key": { + "w": { + "item": "minecraft:yellow_terracotta" + } + }, + "pattern": [ + "w w", + "www" + ], + "result": { + "item": "playercollars:yellow_dog_bowl" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/yellow_foot_paws.json b/src/main/generated/data/playercollars/recipes/yellow_foot_paws.json new file mode 100644 index 00000000..591a6cf5 --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/yellow_foot_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "foot_paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:yellow_wool" + } + }, + "pattern": [ + " w ", + " w ", + "wlw" + ], + "result": { + "item": "playercollars:yellow_foot_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/recipes/yellow_paws.json b/src/main/generated/data/playercollars/recipes/yellow_paws.json new file mode 100644 index 00000000..8cb5b8df --- /dev/null +++ b/src/main/generated/data/playercollars/recipes/yellow_paws.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "paws", + "key": { + "l": { + "item": "minecraft:leather" + }, + "w": { + "item": "minecraft:yellow_wool" + } + }, + "pattern": [ + " w ", + "wlw", + " w " + ], + "result": { + "item": "playercollars:yellow_paws" + }, + "show_notification": true +} diff --git a/src/main/generated/data/playercollars/tags/items/foot_paws.json b/src/main/generated/data/playercollars/tags/items/foot_paws.json new file mode 100644 index 00000000..22f15b87 --- /dev/null +++ b/src/main/generated/data/playercollars/tags/items/foot_paws.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "playercollars:white_foot_paws", + "playercollars:orange_foot_paws", + "playercollars:magenta_foot_paws", + "playercollars:light_blue_foot_paws", + "playercollars:yellow_foot_paws", + "playercollars:lime_foot_paws", + "playercollars:pink_foot_paws", + "playercollars:gray_foot_paws", + "playercollars:light_gray_foot_paws", + "playercollars:cyan_foot_paws", + "playercollars:purple_foot_paws", + "playercollars:blue_foot_paws", + "playercollars:brown_foot_paws", + "playercollars:green_foot_paws", + "playercollars:red_foot_paws", + "playercollars:black_foot_paws" + ] +} diff --git a/src/main/generated/data/playercollars/tags/items/paws.json b/src/main/generated/data/playercollars/tags/items/paws.json new file mode 100644 index 00000000..b223d8a3 --- /dev/null +++ b/src/main/generated/data/playercollars/tags/items/paws.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "playercollars:white_paws", + "playercollars:orange_paws", + "playercollars:magenta_paws", + "playercollars:light_blue_paws", + "playercollars:yellow_paws", + "playercollars:lime_paws", + "playercollars:pink_paws", + "playercollars:gray_paws", + "playercollars:light_gray_paws", + "playercollars:cyan_paws", + "playercollars:purple_paws", + "playercollars:blue_paws", + "playercollars:brown_paws", + "playercollars:green_paws", + "playercollars:red_paws", + "playercollars:black_paws" + ] +} diff --git a/src/main/generated/data/trinkets/tags/items/chest/necklace.json b/src/main/generated/data/trinkets/tags/items/chest/necklace.json new file mode 100644 index 00000000..d90f7d29 --- /dev/null +++ b/src/main/generated/data/trinkets/tags/items/chest/necklace.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "playercollars:collar", + "playercollars:tagless_collar" + ] +} diff --git a/src/main/generated/data/trinkets/tags/items/feet/shoes.json b/src/main/generated/data/trinkets/tags/items/feet/shoes.json new file mode 100644 index 00000000..04fd862f --- /dev/null +++ b/src/main/generated/data/trinkets/tags/items/feet/shoes.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#playercollars:foot_paws" + ] +} diff --git a/src/main/generated/data/trinkets/tags/items/hand/glove.json b/src/main/generated/data/trinkets/tags/items/hand/glove.json new file mode 100644 index 00000000..ef1f09f6 --- /dev/null +++ b/src/main/generated/data/trinkets/tags/items/hand/glove.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#playercollars:paws" + ] +} diff --git a/src/main/java/org/jlortiz/playercollars/OwnerComponent.java b/src/main/java/org/jlortiz/playercollars/OwnerComponent.java new file mode 100644 index 00000000..dfa765de --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/OwnerComponent.java @@ -0,0 +1,10 @@ +package org.jlortiz.playercollars; + +import java.util.Optional; +import java.util.UUID; + +public record OwnerComponent(UUID uuid, String name, Optional owned, Optional ownedName) { + public OwnerComponent(UUID uuid, String name) { + this(uuid, name, Optional.empty(), Optional.empty()); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/PlayerCollarsMod.java b/src/main/java/org/jlortiz/playercollars/PlayerCollarsMod.java index b6901edf..a38812cf 100644 --- a/src/main/java/org/jlortiz/playercollars/PlayerCollarsMod.java +++ b/src/main/java/org/jlortiz/playercollars/PlayerCollarsMod.java @@ -1,67 +1,398 @@ package org.jlortiz.playercollars; -import com.mojang.datafixers.util.Pair; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.ChatFormatting; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.tags.TagKey; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.attributes.RangedAttribute; +import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BedItem; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -import org.jlortiz.playercollars.item.ClickerItem; -import org.jlortiz.playercollars.item.CollarItem; -import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; +import org.jetbrains.annotations.Nullable; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import org.jlortiz.playercollars.enchantment.AudibleEnchantment; +import org.jlortiz.playercollars.enchantment.HealingEnchantment; +import org.jlortiz.playercollars.enchantment.SpikedEnchantment; +import org.jlortiz.playercollars.enchantment.TightLeashEnchantment; +import org.jlortiz.playercollars.block.DogBedBlock; +import org.jlortiz.playercollars.block.DogBowlBlock; +import org.jlortiz.playercollars.block.InvisibleFenceBlock; +import org.jlortiz.playercollars.item.*; +import org.jlortiz.playercollars.leash.LeashImpl; +import org.jlortiz.playercollars.leash.LeashProxyEntity; +import org.jlortiz.playercollars.network.ModPackets; +import org.jlortiz.playercollars.network.PawsConfigScreenHandler; +import org.jlortiz.playercollars.util.LeashedUtil; +import org.jlortiz.playercollars.util.NbtUtil; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotResult; -import java.util.Optional; +import java.util.List; +import java.util.Objects; import java.util.UUID; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; @Mod(PlayerCollarsMod.MOD_ID) public class PlayerCollarsMod { - public static final String MOD_ID = "playercollars"; - private static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID); - public static final RegistryObject COLLAR_ITEM = ITEMS.register("collar", CollarItem::new); - public static final RegistryObject CLICKER_ITEM = ITEMS.register("clicker", ClickerItem::new); - public static final SimpleChannel NETWORK = NetworkRegistry.newSimpleChannel(new ResourceLocation(MOD_ID, "collar_channel"), () -> "", String::isEmpty, String::isEmpty); - private static final DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, MOD_ID); - public static final RegistryObject CLICKER_ON = SOUNDS.register("clicker_on", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MOD_ID, "clicker_on"))); - public static final RegistryObject CLICKER_OFF = SOUNDS.register("clicker_off", () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MOD_ID, "clicker_off"))); - - public PlayerCollarsMod() { - IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); - ITEMS.register(eventBus); - SOUNDS.register(eventBus); - eventBus.register(this); - NETWORK.registerMessage(1, PacketUpdateCollar.class, PacketUpdateCollar::encode, PacketUpdateCollar::new, PacketUpdateCollar::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER)); - NETWORK.registerMessage(2, PacketLookAtLerped.class, PacketLookAtLerped::write, PacketLookAtLerped::new, PacketLookAtLerped::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); - } - - public static ItemStack filterStacksByOwner(IDynamicStackHandler stacks, UUID plr) { - for (int i = 0; i < stacks.getSlots(); i++) { - ItemStack is = stacks.getStackInSlot(i); - if (is.getItem() instanceof CollarItem item) { - Pair owner = item.getOwner(is); - if (owner != null && owner.getFirst().equals(plr)) { - return is; - } - } - } - return null; - } - - @SubscribeEvent - public void buildContents(BuildCreativeModeTabContentsEvent event) { - if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { - event.accept(COLLAR_ITEM); - event.accept(CLICKER_ITEM); - } - } + public static final String MOD_ID = "playercollars"; + + // ---- Deferred Registers ---- + public static final EnchantmentCategory COLLAR_ENCHANTABLE = EnchantmentCategory.create( + "PLAYERCOLLARS_COLLAR", item -> item instanceof org.jlortiz.playercollars.item.CollarItem); + public static final EnchantmentCategory CLICKER_ENCHANTABLE = EnchantmentCategory.create( + "PLAYERCOLLARS_CLICKER", item -> item instanceof org.jlortiz.playercollars.item.ClickerItem); + public static final DeferredRegister ENCHANTMENTS = + DeferredRegister.create(net.minecraftforge.registries.ForgeRegistries.ENCHANTMENTS, MOD_ID); + + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID); + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID); + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, MOD_ID); + public static final DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, MOD_ID); + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, MOD_ID); + public static final DeferredRegister> MENUS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, MOD_ID); + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, MOD_ID); + public static final DeferredRegister CREATIVE_TABS = + DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID); + + // ---- Sounds ---- + public static final RegistryObject CLICKER_ON = SOUNDS.register("clicker_on", + () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MOD_ID, "clicker_on"))); + public static final RegistryObject CLICKER_OFF = SOUNDS.register("clicker_off", + () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(MOD_ID, "clicker_off"))); + + // ---- Attributes ---- + public static final RegistryObject ATTR_CLICKER_DISTANCE = ATTRIBUTES.register("clicker_distance", + () -> new RangedAttribute("attribute.playercollars.clicker_distance", 4, 0, 32).setSyncable(true)); + public static final RegistryObject ATTR_LEASH_DISTANCE = ATTRIBUTES.register("leash_distance", + () -> new RangedAttribute("attribute.playercollars.leash_distance", 4, 2, 16).setSyncable(true)); + + // ---- Items ---- + public static final RegistryObject HEALING_ENCHANTMENT = + ENCHANTMENTS.register("regeneration", HealingEnchantment::new); + public static final RegistryObject TIGHT_LEASH_ENCHANTMENT = + ENCHANTMENTS.register("short_leash", TightLeashEnchantment::new); + public static final RegistryObject SPIKED_ENCHANTMENT = + ENCHANTMENTS.register("thorns", SpikedEnchantment::new); + public static final RegistryObject AUDIBLE_ENCHANTMENT = + ENCHANTMENTS.register("clicker", AudibleEnchantment::new); + + public static final RegistryObject COLLAR_ITEM = ITEMS.register("collar", () -> new CollarItem(false)); + public static final RegistryObject TAGLESS_COLLAR_ITEM = ITEMS.register("tagless_collar", () -> new CollarItem(true)); + public static final RegistryObject CLICKER_ITEM = ITEMS.register("clicker", ClickerItem::new); + public static final RegistryObject DEED_OF_OWNERSHIP = ITEMS.register("deed_of_ownership", DeedItem::new); + public static final RegistryObject DEED_OF_OWNERSHIP_STAMPED = ITEMS.register("stamped_deed_of_ownership", StampedDeedItem::new); + public static final RegistryObject PAW_CONFIGURATION_ITEM = ITEMS.register("paw_configurator", PawSetupItem::new); + public static final RegistryObject COLLAR_LOCKER_ITEM = ITEMS.register("collar_locker", CollarLockerItem::new); + public static final RegistryObject SPATULA_ITEM = ITEMS.register("golden_spatula", SpatulaItem::new); + + // ---- Invisible Fence ---- + public static final RegistryObject INVISIBLE_FENCE_BLOCK = BLOCKS.register("invisible_fence", + () -> new InvisibleFenceBlock(BlockBehaviour.Properties.of() + .instabreak().sound(SoundType.GLASS).noOcclusion().pushReaction(PushReaction.DESTROY))); + public static final RegistryObject INVISIBLE_FENCE_BLOCK_ITEM = ITEMS.register("invisible_fence", + () -> new BlockItem(INVISIBLE_FENCE_BLOCK.get(), new Item.Properties())); + + // ---- Dog Beds / Bowls (16 colors) ---- + @SuppressWarnings("unchecked") + public static final RegistryObject[] DOG_BED_BLOCKS = new RegistryObject[16]; + @SuppressWarnings("unchecked") + public static final RegistryObject[] DOG_BED_ITEMS = new RegistryObject[16]; + @SuppressWarnings("unchecked") + public static final RegistryObject[] DOG_BOWL_BLOCKS = new RegistryObject[16]; + @SuppressWarnings("unchecked") + public static final RegistryObject[] DOG_BOWL_ITEMS = new RegistryObject[16]; + public static final RegistryObject> DOG_BOWL_BLOCK_ENTITY; + + // ---- Paws ---- + public static final net.minecraft.world.item.DyeColor[] PAWS_DYE_COLORS = net.minecraft.world.item.DyeColor.values(); + @SuppressWarnings("unchecked") + public static final RegistryObject[] PAWS_ITEMS = new RegistryObject[PAWS_DYE_COLORS.length]; + @SuppressWarnings("unchecked") + public static final RegistryObject[] FOOT_PAWS_ITEMS = new RegistryObject[PAWS_DYE_COLORS.length]; + + // ---- Tags ---- + public static final TagKey COLLAR_TAG = TagKey.create(Registries.ITEM, new ResourceLocation("c", "collars")); + public static final TagKey PAWS_ALLOW_INTERACT = TagKey.create(Registries.BLOCK, new ResourceLocation(MOD_ID, "paws_allow_interact")); + public static final TagKey PAWS_TAG = TagKey.create(Registries.ITEM, new ResourceLocation(MOD_ID, "paws")); + public static final TagKey FOOT_PAWS_TAG = TagKey.create(Registries.ITEM, new ResourceLocation(MOD_ID, "foot_paws")); + + // ---- Menus ---- + @SuppressWarnings({"unchecked","rawtypes"}) + public static final RegistryObject>> PAWS_BLOCK_CONFIG_MENU = + (RegistryObject) MENUS.register("paws_block_config", + () -> net.minecraftforge.common.extensions.IForgeMenuType.create( + PawsConfigScreenHandler.PawsBlockConfigScreenHandler::new)); + @SuppressWarnings({"unchecked","rawtypes"}) + public static final RegistryObject>> PAWS_ITEM_CONFIG_MENU = + (RegistryObject) MENUS.register("paws_item_config", + () -> net.minecraftforge.common.extensions.IForgeMenuType.create( + PawsConfigScreenHandler.PawsItemConfigScreenHandler::new)); + + // ---- Recipe Serializer ---- + public static final RegistryObject> OWNERSHIP_RECIPE_SERIALIZER = + RECIPE_SERIALIZERS.register("owner_transfer", () -> OwnershipCraftingRecipe.Serializer.INSTANCE); + + public static final RegistryObject CREATIVE_TAB = + CREATIVE_TABS.register("group", () -> net.minecraft.world.item.CreativeModeTab.builder() + .title(Component.translatable("itemGroup.playercollars")) + .icon(() -> COLLAR_ITEM.get().getDefaultInstance()) + .displayItems((params, output) -> { + output.accept(COLLAR_ITEM.get()); + output.accept(TAGLESS_COLLAR_ITEM.get()); + output.accept(CLICKER_ITEM.get()); + output.accept(COLLAR_LOCKER_ITEM.get()); + output.accept(PAW_CONFIGURATION_ITEM.get()); + for (var p : PAWS_ITEMS) output.accept(p.get()); + for (var p : FOOT_PAWS_ITEMS) output.accept(p.get()); + output.accept(DEED_OF_OWNERSHIP.get()); + output.accept(SPATULA_ITEM.get()); + for (var b : DOG_BED_ITEMS) output.accept(b.get()); + for (var b : DOG_BOWL_ITEMS) output.accept(b.get()); + output.accept(INVISIBLE_FENCE_BLOCK_ITEM.get()); + }) + .build()); + + // ---- Codecs ---- + public static final Codec OWNER_COMPONENT_CODEC = RecordCodecBuilder.create(builder -> builder.group( + Codec.STRING.fieldOf("uuid").forGetter(c -> c.uuid().toString()), + Codec.STRING.fieldOf("name").forGetter(OwnerComponent::name), + Codec.STRING.optionalFieldOf("owned").forGetter(c -> c.owned().map(UUID::toString)), + Codec.STRING.optionalFieldOf("owned_name").forGetter(OwnerComponent::ownedName) + ).apply(builder, (uuidStr, name, ownedStr, ownedName) -> + new OwnerComponent(UUID.fromString(uuidStr), name, ownedStr.map(UUID::fromString), ownedName))); + + public static final Codec, ResourceKey>>> CAN_INTERACT_COMPONENT_CODEC = Codec.either( + TagKey.codec(Registries.BLOCK), ResourceKey.codec(Registries.BLOCK)).listOf(); + + public static final Codec, ResourceKey>>> HELD_ITEMS_COMPONENT_CODEC = Codec.either( + TagKey.codec(Registries.ITEM), ResourceKey.codec(Registries.ITEM)).listOf(); + + // ---- Game Rules (populated during RegisterGameRulesEvent) ---- + public static GameRules.Key PLAYER_LEASHES_BREAK_RULE; + public static GameRules.Key LEASHED_PLAYERS_RIDE_ENTITIES; + public static GameRules.Key ALLOW_ATTACK_OWNER; + public static GameRules.Key ALLOW_UNLEASH_OTHER; + + static { + net.minecraft.world.item.DyeColor[] colors = net.minecraft.world.item.DyeColor.values(); + for (net.minecraft.world.item.DyeColor c : colors) { + int idx = c.ordinal(); + String name = c.getName(); + DOG_BOWL_BLOCKS[idx] = BLOCKS.register(name + "_dog_bowl", + () -> new DogBowlBlock(c, BlockBehaviour.Properties.of() + .sound(SoundType.STONE).strength(0.6F).noOcclusion().pushReaction(PushReaction.DESTROY))); + DOG_BOWL_ITEMS[idx] = ITEMS.register(name + "_dog_bowl", + () -> new BlockItem(DOG_BOWL_BLOCKS[c.ordinal()].get(), new Item.Properties())); + DOG_BED_BLOCKS[idx] = BLOCKS.register(name + "_dog_bed", + () -> new DogBedBlock(c, BlockBehaviour.Properties.of() + .sound(SoundType.WOOL).strength(0.2F).noOcclusion().ignitedByLava().pushReaction(PushReaction.DESTROY))); + DOG_BED_ITEMS[idx] = ITEMS.register(name + "_dog_bed", + () -> new BedItem(DOG_BED_BLOCKS[c.ordinal()].get(), new Item.Properties().stacksTo(1))); + } + DOG_BOWL_BLOCK_ENTITY = BLOCK_ENTITIES.register("dog_bowl", () -> { + DogBowlBlock[] bowls = new DogBowlBlock[DOG_BOWL_BLOCKS.length]; + for (int i = 0; i < DOG_BOWL_BLOCKS.length; i++) bowls[i] = DOG_BOWL_BLOCKS[i].get(); + return BlockEntityType.Builder.of(DogBowlBlock.DogBowlBlockEntity::new, bowls).build(null); + }); + for (int i = 0; i < PAWS_DYE_COLORS.length; i++) { + net.minecraft.world.item.DyeColor c = PAWS_DYE_COLORS[i]; + PAWS_ITEMS[i] = ITEMS.register(c.getName() + "_paws", () -> new PawsItem(c.getFireworkColor(), 0xF196CF)); + FOOT_PAWS_ITEMS[i] = ITEMS.register(c.getName() + "_foot_paws", () -> new FootPawsItem(c.getFireworkColor(), 0xF196CF)); + } + } + + public PlayerCollarsMod() { + IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); + ITEMS.register(modBus); + ENCHANTMENTS.register(modBus); + BLOCKS.register(modBus); + BLOCK_ENTITIES.register(modBus); + SOUNDS.register(modBus); + ATTRIBUTES.register(modBus); + MENUS.register(modBus); + RECIPE_SERIALIZERS.register(modBus); + CREATIVE_TABS.register(modBus); + modBus.addListener(this::onCommonSetup); + MinecraftForge.EVENT_BUS.register(this); + } + + private void onCommonSetup(FMLCommonSetupEvent event) { + ModPackets.register(); + + + // Register game rules directly - Forge 47.x has no RegisterGameRulesEvent + PLAYER_LEASHES_BREAK_RULE = GameRules.register("playerLeashesBreak", + GameRules.Category.PLAYER, GameRules.BooleanValue.create(true)); + LEASHED_PLAYERS_RIDE_ENTITIES = GameRules.register("leashedPlayersRideEntities", + GameRules.Category.PLAYER, GameRules.BooleanValue.create(false)); + ALLOW_ATTACK_OWNER = GameRules.register("playerAllowAttackOwner", + GameRules.Category.PLAYER, GameRules.BooleanValue.create(false)); + ALLOW_UNLEASH_OTHER = GameRules.register("allowUnleashUnownedPlayer", + GameRules.Category.PLAYER, GameRules.BooleanValue.create(true)); + } + + + + + @SubscribeEvent + public void onBlockBreak(BlockEvent.BreakEvent event) { + Level world = (Level) event.getLevel(); + if (world.isClientSide) return; + Player player = event.getPlayer(); + if (player.isSpectator()) return; + Entity leashHolder = ((LeashImpl) player).leashplayers$getProxyLeashHolder(); + if (leashHolder instanceof LeashFenceKnotEntity knot && event.getPos().equals(knot.blockPosition())) { + player.displayClientMessage(Component.translatable("message.playercollars.no_break_fence") + .withStyle(ChatFormatting.RED), true); + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onAttackEntity(AttackEntityEvent event) { + Player player = event.getEntity(); + Level world = player.level(); + if (world.isClientSide) return; + if (player.isSpectator()) return; + Entity target = event.getTarget(); + if (world.getGameRules().getBoolean(ALLOW_ATTACK_OWNER) && target instanceof Player) { + final OwnerComponent[] collarMatch = {null}; + CuriosApi.getCuriosInventory(player).ifPresent(h -> + h.findCurios(s -> s.is(COLLAR_TAG)).stream() + .map(sr -> NbtUtil.getDeedOwner(sr.stack())) + .filter(Objects::nonNull) + .filter(c -> c.uuid().equals(target.getUUID()) && + (c.owned().isEmpty() || c.owned().get().equals(player.getUUID()))) + .findFirst().ifPresent(c -> collarMatch[0] = c)); + if (collarMatch[0] != null) { + player.displayClientMessage(Component.translatable("message.playercollars.no_attack_owner") + .withStyle(ChatFormatting.RED), true); + double baseDamage = player.getAttributeValue(Attributes.ATTACK_DAMAGE); + baseDamage = (baseDamage - 1) * 0.75 + 1; + player.hurt(player.damageSources().playerAttack(player), (float) Math.ceil(baseDamage)); + } + } + if (target instanceof LeashFenceKnotEntity ke && blockLeashKnotBreak(world, player, ke)) { + event.setCanceled(true); + } + } + + @SubscribeEvent + public void onEntityInteract(PlayerInteractEvent.EntityInteract event) { + Player player = event.getEntity(); + if (player.level().isClientSide) return; + if (!(player instanceof ServerPlayer serverPlayer)) return; + Entity entity = event.getTarget(); + if (!(entity instanceof LeashImpl impl)) return; + InteractionResult result = impl.leashplayers$interact(serverPlayer, event.getHand()); + if (result != InteractionResult.PASS) { + event.setCancellationResult(result); + event.setCanceled(true); + } + } + + // ---- Static helpers ---- + + public static boolean isAcceptableEnchant(Item item, net.minecraft.world.item.enchantment.Enchantment enchantment) { + return (item instanceof CollarItem && CollarItem.isAcceptableEnchantment(enchantment)) || + (item instanceof ClickerItem && ClickerItem.isAcceptableEnchantment(enchantment)); + } + + public static @Nullable ItemStack filterStacksByOwner( + List stacks, + UUID ownerUuid, UUID entity) { + for (var sr : stacks) { + ItemStack is = sr.stack(); + if (is.getItem() instanceof CollarItem) { + var owner = NbtUtil.getDeedOwner(is); + if (owner != null && owner.uuid().equals(ownerUuid) && + (owner.owned().isEmpty() || owner.owned().get().equals(entity))) { + return is; + } + } + } + return null; + } + + public static InteractionResult pullPlayerTowards(ServerPlayer plr, Vec3 towards, double minDist, + double maxDist, UnaryOperator getFactor) { + Vec3 vecTo = towards.subtract(plr.position()); + double distance = vecTo.length(); + if (distance < minDist) return InteractionResult.PASS; + if (distance > maxDist) return InteractionResult.FAIL; + plr.addDeltaMovement(vecTo.scale(Math.abs(getFactor.apply(distance)))); + plr.connection.send(new ClientboundSetEntityMotionPacket(plr)); + plr.hurtMarked = false; + return InteractionResult.SUCCESS; + } + + public static boolean blockLeashKnotBreak(Level world, Player player, LeashFenceKnotEntity entity) { + if (entity.equals(((LeashImpl) player).leashplayers$getProxyLeashHolder())) { + player.displayClientMessage(Component.translatable("message.playercollars.no_break_fence") + .withStyle(ChatFormatting.RED), true); + return true; + } + if (!world.getGameRules().getBoolean(ALLOW_UNLEASH_OTHER)) { + List list = LeashedUtil.collectLeashablesAround(world, entity.blockPosition(), + e -> entity.equals(e.getLeashHolder())); + for (Mob l : list) { + if (!(l instanceof LeashProxyEntity le)) continue; + LivingEntity leashTarget = le.getLeashTarget(); + var collars = CuriosApi.getCuriosInventory(leashTarget) + .map(h -> h.findCurios(s -> s.is(COLLAR_TAG))) + .stream().flatMap(java.util.Collection::stream) + .map(sr -> NbtUtil.getDeedOwner(sr.stack())) + .filter(Objects::nonNull) + .filter(c -> c.owned().orElseGet(leashTarget::getUUID).equals(leashTarget.getUUID())); + if (!collars.allMatch(c -> player.getUUID().equals(c.uuid()))) { + player.displayClientMessage( + Component.translatable("message.playercollars.no_break_fence_other", + le.getLeashTarget().getName()).withStyle(ChatFormatting.RED), true); + return true; + } + } + } + return false; + } } diff --git a/src/main/java/org/jlortiz/playercollars/block/DogBedBlock.java b/src/main/java/org/jlortiz/playercollars/block/DogBedBlock.java new file mode 100644 index 00000000..d5b3c66d --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/block/DogBedBlock.java @@ -0,0 +1,34 @@ +package org.jlortiz.playercollars.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class DogBedBlock extends BedBlock { + private static final VoxelShape SHAPE = box(0, 0, 0, 16, 6, 16); + + public DogBedBlock(DyeColor color, Properties settings) { + super(color, settings); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return null; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/block/DogBowlBlock.java b/src/main/java/org/jlortiz/playercollars/block/DogBowlBlock.java new file mode 100644 index 00000000..2f8c4b83 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/block/DogBowlBlock.java @@ -0,0 +1,206 @@ +package org.jlortiz.playercollars.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.phys.shapes.Shapes; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.PlayerCollarsMod; + +import java.util.Optional; + +public class DogBowlBlock extends BaseEntityBlock { + public static final IntegerProperty LEVEL = net.minecraft.world.level.block.state.properties.BlockStateProperties.AGE_3; + public static final BooleanProperty MILK = BlockStateProperties.SNOWY; + + private static final VoxelShape SHAPE_BASE = Shapes.or( + box(2, 0, 1, 14, 5, 2), box(2, 0, 14, 14, 5, 15), + box(1, 0, 1, 2, 5, 15), box(14, 0, 1, 15, 5, 15)); + private static final VoxelShape[] SHAPE = { + Shapes.or(SHAPE_BASE, box(2, 0, 2, 14, 1, 14)), + Shapes.or(SHAPE_BASE, box(2, 0, 2, 14, 2, 14)), + Shapes.or(SHAPE_BASE, box(2, 0, 2, 14, 4, 14)), + Shapes.or(SHAPE_BASE, box(2, 0, 2, 14, 6, 14)) + }; + + public final DyeColor color; + + public DogBowlBlock(DyeColor c, Properties settings) { + super(settings); + this.color = c; + registerDefaultState(this.stateDefinition.any().setValue(LEVEL, 0).setValue(MILK, false)); + } + + @Nullable @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new DogBowlBlockEntity(pos, state); + } + + @Override + public RenderShape getRenderShape(BlockState state) { return RenderShape.MODEL; } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, + LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + return direction == Direction.DOWN && !state.canSurvive(world, pos) + ? Blocks.AIR.defaultBlockState() + : super.updateShape(state, direction, neighborState, world, pos, neighborPos); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockPos below = pos.below(); + return canSupportRigidBlock(world, below) || canSupportCenter(world, below, Direction.UP); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext ctx) { + int level = state.getValue(LEVEL); + return (level < 0 || level > 3) ? SHAPE_BASE : SHAPE[level]; + } + + private InteractionResult onUseWithItem(ItemStack stack, BlockState state, Level world, BlockPos pos, + Player player, InteractionHand hand, BlockHitResult hit) { + if (stack.isEmpty()) return InteractionResult.PASS; + if (!(world.getBlockEntity(pos) instanceof DogBowlBlockEntity be)) return InteractionResult.CONSUME; + + if (stack.is(Items.MILK_BUCKET) && be.getCount() == 0) { + be.insert(stack, false); + world.setBlock(pos, state.setValue(MILK, true), 2); + if (!player.isCreative()) player.setItemInHand(hand, new ItemStack(Items.BUCKET)); + world.playSound(null, pos, net.minecraft.sounds.SoundEvents.BUCKET_EMPTY, net.minecraft.sounds.SoundSource.BLOCKS, 1.0F, 1.0F); + return InteractionResult.SUCCESS; + } + if (stack.getItem().getFoodProperties(stack, player) == null) return InteractionResult.PASS; + + int decr = be.insert(stack, player.isCrouching()); + if (decr > 0) { + if (!player.isCreative()) stack.shrink(decr); + world.setBlock(pos, state.setValue(LEVEL, Math.min((be.getCount() + 20) / 21, 3)), 2); + return InteractionResult.SUCCESS; + } + return InteractionResult.CONSUME; + } + + @Override + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { + if (world.getBlockEntity(pos) instanceof DogBowlBlockEntity be) be.drop(); + super.destroy(world, pos, state); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, + InteractionHand hand, BlockHitResult hit) { + var item = player.getItemInHand(hand); + var result = onUseWithItem(item, state, world, pos, player, hand, hit); + if (result != InteractionResult.PASS) return result; + + if (!(world.getBlockEntity(pos) instanceof DogBowlBlockEntity be)) return InteractionResult.PASS; + ItemStack is = be.take(); + if (is.isEmpty()) return InteractionResult.PASS; + + if (is.is(Items.MILK_BUCKET)) { + world.setBlock(pos, state.setValue(MILK, false), 2); + if (!world.isClientSide()) player.removeAllEffects(); + player.playSound(net.minecraft.sounds.SoundEvents.GENERIC_DRINK, 1, 1); + return InteractionResult.SUCCESS; + } + + world.setBlock(pos, state.setValue(LEVEL, Math.min((be.getCount() + 20) / 21, 3)), 2); + FoodProperties food = is.getItem().getFoodProperties(is, player); + if (food != null && player.canEat(food.canAlwaysEat())) { + player.eat(world, is); + return InteractionResult.SUCCESS; + } else if (!player.getInventory().add(is)) { + player.drop(is, true); + } + return InteractionResult.CONSUME; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(LEVEL, MILK); + } + + public static class DogBowlBlockEntity extends BlockEntity { + private ItemStack inBowl = ItemStack.EMPTY; + + public DogBowlBlockEntity(BlockPos pos, BlockState state) { + super(PlayerCollarsMod.DOG_BOWL_BLOCK_ENTITY.get(), pos, state); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + this.inBowl = Optional.of(nbt.getCompound("item")) + .map(ItemStack::of).orElse(ItemStack.EMPTY); + } + + @Override + protected void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + if (!this.inBowl.isEmpty()) nbt.put("item", this.inBowl.save(new CompoundTag())); + } + + protected int getCount() { return this.inBowl.getCount(); } + + protected int insert(ItemStack is, boolean moveAll) { + if (this.inBowl.isEmpty()) { + this.inBowl = is.copy(); + if (!moveAll) this.inBowl.setCount(1); + setChanged(); + return moveAll ? is.getCount() : 1; + } + int remaining = this.inBowl.getMaxStackSize() - this.inBowl.getCount(); + if (is.is(this.inBowl.getItem()) && remaining > 0) { + int amount = moveAll ? Math.min(is.getCount(), remaining) : 1; + this.inBowl.grow(amount); + setChanged(); + return amount; + } + return 0; + } + + protected ItemStack take() { + if (this.inBowl.isEmpty()) return ItemStack.EMPTY; + ItemStack is = this.inBowl.copyWithCount(1); + this.inBowl.shrink(1); + setChanged(); + return is; + } + + protected void drop() { + if (this.inBowl.isEmpty() || this.inBowl.is(Items.MILK_BUCKET) || this.level == null) return; + this.level.addFreshEntity(new ItemEntity(this.level, this.worldPosition.getX(), + this.worldPosition.getY(), this.worldPosition.getZ(), this.inBowl)); + this.inBowl = ItemStack.EMPTY; + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/block/InvisibleFenceBlock.java b/src/main/java/org/jlortiz/playercollars/block/InvisibleFenceBlock.java new file mode 100644 index 00000000..f29b6256 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/block/InvisibleFenceBlock.java @@ -0,0 +1,129 @@ +package org.jlortiz.playercollars.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.EntityCollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.network.chat.Component; +import org.jlortiz.playercollars.PlayerCollarsMod; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.List; + +public class InvisibleFenceBlock extends FenceBlock { + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public InvisibleFenceBlock(BlockBehaviour.Properties settings) { + super(settings); + registerDefaultState(this.stateDefinition.any() + .setValue(POWERED, false) + .setValue(WATERLOGGED, false)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { return RenderShape.INVISIBLE; } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(POWERED); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, + LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + state = super.updateShape(state, direction, neighborState, world, pos, neighborPos); + if (neighborState.is(this) && neighborState.getValue(POWERED) != state.getValue(POWERED)) + state = state.setValue(POWERED, neighborState.getValue(POWERED)); + return state; + } + + @Override + public VoxelShape getVisualShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = super.getStateForPlacement(ctx); + boolean power = false; + for (Direction d : Direction.Plane.HORIZONTAL) { + BlockState n = ctx.getLevel().getBlockState(ctx.getClickedPos().relative(d)); + if (n.is(this) && n.getValue(POWERED)) { power = true; break; } + } + return power ? state.setValue(POWERED, true) : state; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + if (context instanceof EntityCollisionContext eCtx) { + if (state.getValue(POWERED) && eCtx.getEntity() instanceof LivingEntity living) { + return CuriosApi.getCuriosInventory(living) + .map(h -> h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG))) + .filter(list -> !list.isEmpty()) + .map(list -> super.getCollisionShape(state, world, pos, context)) + .orElse(Shapes.empty()); + } + if (eCtx.getEntity() == null) return super.getCollisionShape(state, world, pos, context); + } + return Shapes.empty(); + } + + @Override + public void animateTick(BlockState state, Level world, BlockPos pos, RandomSource random) { + super.animateTick(state, world, pos, random); + if (state.getValue(POWERED) && random.nextFloat() < 0.25f) { + world.addParticle(DustParticleOptions.REDSTONE, + pos.getX() + random.nextFloat(), + pos.getY() + random.nextFloat() * 0.5, + pos.getZ() + random.nextFloat() * 0.5, + 0, 0, 0); + } + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, + Player player, InteractionHand hand, BlockHitResult hit) { + var result = super.use(state, world, pos, player, hand, hit); + if (result != InteractionResult.PASS) return result; + + if (world.isClientSide()) return InteractionResult.SUCCESS; + + boolean hasCollar = CuriosApi.getCuriosInventory(player) + .map(h -> !h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)).isEmpty()) + .orElse(false); + if (hasCollar) { + player.displayClientMessage(Component.translatable("block.playercollars.invisible_fence.toggle_fail") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + + state = state.setValue(POWERED, !state.getValue(POWERED)); + world.setBlock(pos, state, 7); + player.displayClientMessage(Component.translatable( + state.getValue(POWERED) ? "block.playercollars.invisible_fence.toggle_on" + : "block.playercollars.invisible_fence.toggle_off") + .withStyle(net.minecraft.ChatFormatting.GREEN), true); + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/CollarRenderer.java b/src/main/java/org/jlortiz/playercollars/client/CollarRenderer.java index 85ba5569..5866e498 100644 --- a/src/main/java/org/jlortiz/playercollars/client/CollarRenderer.java +++ b/src/main/java/org/jlortiz/playercollars/client/CollarRenderer.java @@ -1,49 +1,44 @@ package org.jlortiz.playercollars.client; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; import org.joml.Quaternionf; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.common.Tags; import top.theillusivec4.curios.api.SlotContext; import top.theillusivec4.curios.api.client.ICurioRenderer; public class CollarRenderer implements ICurioRenderer { - - private final BakedModel model; - private final Ingredient chestplateIngr = Ingredient.of(Tags.Items.ARMORS_CHESTPLATES); - public CollarRenderer(BakedModel m) { - this.model = m; - } - @Override - public > void render(ItemStack itemStack, SlotContext slotContext, PoseStack poseStack, RenderLayerParent renderLayerParent, MultiBufferSource multiBufferSource, int i, float v, float v1, float v2, float v3, float v4, float v5) { - poseStack.pushPose(); + public > void render( + ItemStack stack, SlotContext slotContext, PoseStack matrixStack, + RenderLayerParent renderLayerParent, MultiBufferSource bufferSource, + int light, float limbSwing, float limbSwingAmount, float partialTicks, + float ageInTicks, float netHeadYaw, float headPitch) { + if (!(renderLayerParent.getModel() instanceof HumanoidModel biped)) return; try { - ModelPart body = ((HumanoidModel) renderLayerParent.getModel()).body; - boolean hasChestplate = false; - for (ItemStack is : slotContext.entity().getArmorSlots()) { - if (chestplateIngr.test(is)) { - hasChestplate = true; - break; - } - } - poseStack.translate(body.x * 0.0625f, body.y * 0.0625f, body.z * 0.0625f); - poseStack.mulPose(new Quaternionf().rotateXYZ(body.xRot, body.yRot, body.zRot + (float) Math.PI)); - poseStack.scale((hasChestplate ? 0.7f : 0.85f) * body.xScale, 0.85f * body.yScale, (hasChestplate ? 1.1f : 0.85f) * body.zScale); - poseStack.translate(0, hasChestplate ? 0.475 : 0.4125, -0.005); - Minecraft.getInstance().getItemRenderer().render(itemStack, ItemDisplayContext.HEAD, false, poseStack, multiBufferSource, i, OverlayTexture.NO_OVERLAY, model); + ModelPart body = biped.body; + boolean hasChestplate = slotContext.entity().getItemBySlot(EquipmentSlot.CHEST).getItem() instanceof ArmorItem; + matrixStack.pushPose(); + matrixStack.translate(body.x * 0.0625f, body.y * 0.0625f, body.z * 0.0625f); + matrixStack.mulPose(new Quaternionf().rotateXYZ(body.xRot, body.yRot, body.zRot + (float) Math.PI)); + matrixStack.scale( + (hasChestplate ? 0.7f : 0.85f) * body.xScale, + 0.85f * body.yScale, + (hasChestplate ? 1.1f : 0.85f) * body.zScale); + matrixStack.translate(0, hasChestplate ? 0.475 : 0.4125, -0.005); + net.minecraft.client.Minecraft.getInstance().getItemRenderer() + .renderStatic(stack, net.minecraft.world.item.ItemDisplayContext.HEAD, light, + OverlayTexture.NO_OVERLAY, matrixStack, bufferSource, + slotContext.entity().level(), 0); + matrixStack.popPose(); } catch (ClassCastException ignored) {} - poseStack.popPose(); } } diff --git a/src/main/java/org/jlortiz/playercollars/client/FootPawRenderer.java b/src/main/java/org/jlortiz/playercollars/client/FootPawRenderer.java new file mode 100644 index 00000000..d8c72010 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/FootPawRenderer.java @@ -0,0 +1,44 @@ +package org.jlortiz.playercollars.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.MultiBufferSource; + +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.joml.Quaternionf; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; + +public class FootPawRenderer implements ICurioRenderer { + + private static void renderForLeg(ItemStack stack, PoseStack matrices, + PlayerModel model, + Level world, MultiBufferSource buffers, int light, boolean left) { + matrices.pushPose(); + (left ? model.leftLeg : model.rightLeg).translateAndRotate(matrices); + matrices.mulPose(new Quaternionf().rotateXYZ((float) Math.PI / 2, 0, 0)); + matrices.translate(0, 0, -0.675); + matrices.scale(0.75f / 2, 0.75f / 2, 0.75f / 2); + Minecraft.getInstance().getItemRenderer() + .renderStatic(stack, net.minecraft.world.item.ItemDisplayContext.FIXED, light, + OverlayTexture.NO_OVERLAY, matrices, buffers, world, 0); + matrices.popPose(); + } + + @Override + public > void render( + ItemStack stack, SlotContext slotContext, PoseStack matrices, + RenderLayerParent renderLayerParent, MultiBufferSource buffers, + int light, float limbSwing, float limbSwingAmount, float partialTicks, + float ageInTicks, float netHeadYaw, float headPitch) { + if (!(renderLayerParent.getModel() instanceof PlayerModel model)) return; + renderForLeg(stack, matrices, model, slotContext.entity().level(), buffers, light, false); + renderForLeg(stack, matrices, model, slotContext.entity().level(), buffers, light, true); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/PawRenderer.java b/src/main/java/org/jlortiz/playercollars/client/PawRenderer.java new file mode 100644 index 00000000..5cf6094f --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/PawRenderer.java @@ -0,0 +1,71 @@ +package org.jlortiz.playercollars.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.MultiBufferSource; + +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.joml.Quaternionf; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; + +public class PawRenderer implements ICurioRenderer { + + private static void renderForArm(ItemStack stack, PoseStack matrices, + PlayerModel model, + Level world, MultiBufferSource buffers, int light, boolean left) { + matrices.pushPose(); + (left ? model.leftArm : model.rightArm).translateAndRotate(matrices); + matrices.mulPose(new Quaternionf().rotateXYZ(0, (float)(left ? Math.PI : -Math.PI) / 2, 0)); + matrices.translate(0, 0.5625, -0.015625); + boolean slim = isSlimModel(model); + matrices.scale(0.75f / 2, 0.625f / 2, (slim ? 0.9375f : 1.125f) / 2); + Minecraft.getInstance().getItemRenderer() + .renderStatic(stack, net.minecraft.world.item.ItemDisplayContext.FIXED, light, + OverlayTexture.NO_OVERLAY, matrices, buffers, world, 0); + matrices.popPose(); + } + + public static void renderOnFirstPerson(ItemStack stack, PoseStack matrices, + PlayerModel model, + Level world, MultiBufferSource buffers, int light, boolean left) { + matrices.pushPose(); + (left ? model.leftArm : model.rightArm).translateAndRotate(matrices); + boolean slim = isSlimModel(model); + matrices.translate(left ? 0.0625f : -0.046875f, 0.5625, -0.0625f); + if (slim) matrices.translate(0.03125f * (left ? -1 : 1), 0, 0); + matrices.scale((slim ? 0.59375f : 0.75f) / 2, 0.75f / 2, 1.03125f / 2); + Minecraft.getInstance().getItemRenderer() + .renderStatic(stack, net.minecraft.world.item.ItemDisplayContext.FIXED, light, + OverlayTexture.NO_OVERLAY, matrices, buffers, world, 0); + matrices.popPose(); + } + + + private static boolean isSlimModel(net.minecraft.client.model.PlayerModel model) { + try { + java.lang.reflect.Field f = net.minecraft.client.model.PlayerModel.class.getDeclaredField("slim"); + f.setAccessible(true); + return (boolean) f.get(model); + } catch (Exception e) { + return false; + } + } + + @Override + public > void render( + ItemStack stack, SlotContext slotContext, PoseStack matrices, + RenderLayerParent renderLayerParent, MultiBufferSource buffers, + int light, float limbSwing, float limbSwingAmount, float partialTicks, + float ageInTicks, float netHeadYaw, float headPitch) { + if (!(renderLayerParent.getModel() instanceof PlayerModel model)) return; + renderForArm(stack, matrices, model, slotContext.entity().level(), buffers, light, false); + renderForArm(stack, matrices, model, slotContext.entity().level(), buffers, light, true); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/RegisterClient.java b/src/main/java/org/jlortiz/playercollars/client/RegisterClient.java index 9fda312a..91a2f1c4 100644 --- a/src/main/java/org/jlortiz/playercollars/client/RegisterClient.java +++ b/src/main/java/org/jlortiz/playercollars/client/RegisterClient.java @@ -1,47 +1,96 @@ package org.jlortiz.playercollars.client; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BedItem; +import net.minecraft.world.level.block.BedBlock; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.RegisterColorHandlersEvent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import org.jlortiz.playercollars.PlayerCollarsMod; -import org.jlortiz.playercollars.item.ClickerItem; +import org.jlortiz.playercollars.client.screen.PawsConfigScreen; import org.jlortiz.playercollars.item.CollarItem; +import org.jlortiz.playercollars.item.FootPawsItem; import top.theillusivec4.curios.api.client.CuriosRendererRegistry; -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, value = {Dist.CLIENT}) +@Mod.EventBusSubscriber(modid = PlayerCollarsMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class RegisterClient { + @SubscribeEvent - public static void onModelBakeEvent(ModelEvent.BakingCompleted event) { - final ModelResourceLocation loc = new ModelResourceLocation(new ResourceLocation(PlayerCollarsMod.MOD_ID, "collar"), "inventory"); - final CollarRenderer cr = new CollarRenderer(event.getModels().get(loc)); + public static void onClientSetup(FMLClientSetupEvent event) { + // Register Curios renderers + CollarRenderer cr = new CollarRenderer(); CuriosRendererRegistry.register(PlayerCollarsMod.COLLAR_ITEM.get(), () -> cr); - } + CuriosRendererRegistry.register(PlayerCollarsMod.TAGLESS_COLLAR_ITEM.get(), () -> cr); - @SubscribeEvent - public static void propertyOverrideRegistry(FMLClientSetupEvent event) { - event.enqueueWork(() -> ItemProperties.register(PlayerCollarsMod.CLICKER_ITEM.get(), new ResourceLocation("cast"), - (p_174650_, p_174651_, p_174652_, p_174653_) -> p_174652_ != null && p_174652_.getUseItem() == p_174650_ ? p_174652_.getTicksUsingItem() : 0)); - MinecraftForge.EVENT_BUS.register(new RotationLerpHandler()); + PawRenderer pr = new PawRenderer(); + for (var pawItem : PlayerCollarsMod.PAWS_ITEMS) + CuriosRendererRegistry.register(pawItem.get(), () -> pr); + + FootPawRenderer fpr = new FootPawRenderer(); + for (var footItem : PlayerCollarsMod.FOOT_PAWS_ITEMS) + CuriosRendererRegistry.register(footItem.get(), () -> fpr); + + // Register menu screens + event.enqueueWork(() -> { + MenuScreens.register(PlayerCollarsMod.PAWS_BLOCK_CONFIG_MENU.get(), PawsConfigScreen.BlockScreen::new); + MenuScreens.register(PlayerCollarsMod.PAWS_ITEM_CONFIG_MENU.get(), PawsConfigScreen.ItemScreen::new); + }); + + // Item model predicates + event.enqueueWork(() -> { + ItemProperties.register(PlayerCollarsMod.CLICKER_ITEM.get(), + new ResourceLocation("cast"), + (stack, world, entity, seed) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1f : 0f); + }); } @SubscribeEvent - public static void registerItemColors(RegisterColorHandlersEvent.Item event) { - final CollarItem item = PlayerCollarsMod.COLLAR_ITEM.get(); - event.register(((itemStack, i) -> switch (i) { - case 0 -> item.getColor(itemStack); - case 1 -> item.getPawColor(itemStack); + public static void onRegisterItemColors(RegisterColorHandlersEvent.Item event) { + // Collar (2 tint layers: body color + tag color) + event.register((stack, tintIndex) -> switch (tintIndex) { + case 0 -> ((net.minecraft.world.item.DyeableLeatherItem) stack.getItem()).getColor(stack) | 0xFF000000; + case 1 -> ((CollarItem) stack.getItem()).getTagColor(stack) | 0xFF000000; default -> -1; + }, PlayerCollarsMod.COLLAR_ITEM.get()); + + // Tagless collar + event.register((stack, tintIndex) -> + tintIndex == 0 ? ((net.minecraft.world.item.DyeableLeatherItem) stack.getItem()).getColor(stack) | 0xFF000000 : -1, + PlayerCollarsMod.TAGLESS_COLLAR_ITEM.get()); + + // Clicker + event.register((stack, tintIndex) -> + tintIndex == 0 ? ((net.minecraft.world.item.DyeableLeatherItem) stack.getItem()).getColor(stack) | 0xFF000000 : -1, + PlayerCollarsMod.CLICKER_ITEM.get()); + + // Dog beds + for (var bedItemRO : PlayerCollarsMod.DOG_BED_ITEMS) { + event.register((stack, tintIndex) -> { + BedItem item = (BedItem) stack.getItem(); + BedBlock block = (BedBlock) item.getBlock(); + return tintIndex == 0 ? block.getColor().getFireworkColor() | 0xFF000000 : -1; + }, bedItemRO.get()); } - ), item); - final ClickerItem item2 = PlayerCollarsMod.CLICKER_ITEM.get(); - event.register((itemStack, i) -> i == 0 ? item2.getColor(itemStack) : -1, item2); + // Paws + foot paws + for (var p : PlayerCollarsMod.PAWS_ITEMS) { + event.register((stack, tintIndex) -> switch (tintIndex) { + case 0 -> ((FootPawsItem) stack.getItem()).getColor(); + case 1 -> ((FootPawsItem) stack.getItem()).getPawColor(); + default -> -1; + }, p.get()); + } + for (var p : PlayerCollarsMod.FOOT_PAWS_ITEMS) { + event.register((stack, tintIndex) -> switch (tintIndex) { + case 0 -> ((FootPawsItem) stack.getItem()).getColor(); + case 1 -> ((FootPawsItem) stack.getItem()).getPawColor(); + default -> -1; + }, p.get()); + } } } diff --git a/src/main/java/org/jlortiz/playercollars/client/RotationLerpHandler.java b/src/main/java/org/jlortiz/playercollars/client/RotationLerpHandler.java index 091361ab..444ae849 100644 --- a/src/main/java/org/jlortiz/playercollars/client/RotationLerpHandler.java +++ b/src/main/java/org/jlortiz/playercollars/client/RotationLerpHandler.java @@ -1,46 +1,48 @@ package org.jlortiz.playercollars.client; -import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.util.Mth; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.jlortiz.playercollars.PlayerCollarsMod; +import java.util.Objects; + +@Mod.EventBusSubscriber(modid = PlayerCollarsMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) public class RotationLerpHandler { - private static final float timeToTurn = 0.25f; - private static float turnTimer = timeToTurn + 1; - private static float rotX; - private static float rotY; - private static long millis; + private static final float TIME_TO_TURN = 0.25f; + private static float turnTimer = TIME_TO_TURN + 1; + private static float rotX = 0; + private static float rotY = 0; + private static long millis = 0; @SubscribeEvent - public void turnTowardsClick(ViewportEvent.ComputeCameraAngles evt) { - if (turnTimer < timeToTurn) { - LocalPlayer p = Minecraft.getInstance().player; - if (p == null) { - turnTimer = timeToTurn + 1; - return; - } - // FIXME: there has to be a real timer for this - long mils = Util.getMillis(); - float delta = (mils - millis) / 1000f; - p.turn(rotY * delta, rotX * delta); - turnTimer += delta; - millis = mils; - } + public static void onRenderLevelLast(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_LEVEL) return; + if (turnTimer >= TIME_TO_TURN) return; + + LocalPlayer p = Minecraft.getInstance().player; + if (p == null) { turnTimer = TIME_TO_TURN + 1; return; } + + long mils = net.minecraft.Util.getMillis(); + float delta = (mils - millis) / 1000.0f; + p.turn(rotY * delta, rotX * delta); + turnTimer += delta; + millis = mils; } public static void beginClickTurn(Vec3 towards) { - Player p = Minecraft.getInstance().player; + LocalPlayer player = Objects.requireNonNull(Minecraft.getInstance().player); turnTimer = 0; - Vec3 pos = EntityAnchorArgument.Anchor.EYES.apply(p).subtract(towards); + Vec3 pos = EntityAnchorArgument.Anchor.EYES.apply(player).subtract(towards); double d3 = Math.sqrt(pos.x * pos.x + pos.z * pos.z); - rotX = Mth.wrapDegrees((float)((Mth.atan2(pos.y, d3) * Mth.RAD_TO_DEG) - p.getXRot())) / timeToTurn / 0.15f; - rotY = Mth.wrapDegrees((float)(-Mth.atan2(-pos.z, pos.x) * Mth.RAD_TO_DEG) + 90.0F - p.getYRot()) / timeToTurn / 0.15f; - millis = Util.getMillis(); + rotX = Mth.wrapDegrees((float)((Mth.atan2(pos.y, d3) * Mth.RAD_TO_DEG) - player.getXRot())) / TIME_TO_TURN / 0.15f; + rotY = Mth.wrapDegrees((float)(-Mth.atan2(-pos.z, pos.x) * Mth.RAD_TO_DEG) + 90.0F - player.getYRot()) / TIME_TO_TURN / 0.15f; + millis = net.minecraft.Util.getMillis(); } } diff --git a/src/main/java/org/jlortiz/playercollars/client/screen/CollarDyeScreen.java b/src/main/java/org/jlortiz/playercollars/client/screen/CollarDyeScreen.java new file mode 100644 index 00000000..6b0027a6 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/screen/CollarDyeScreen.java @@ -0,0 +1,115 @@ +package org.jlortiz.playercollars.client.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.DyeableLeatherItem; +import net.minecraft.world.item.ItemStack; +import org.jlortiz.playercollars.item.CollarItem; +import org.jlortiz.playercollars.network.ModPackets; +import org.jlortiz.playercollars.network.PacketUpdateCollar; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.UUID; + +public class CollarDyeScreen extends Screen { + private final ItemStack is; + private final boolean shouldPaw; + private final int initColor, initPaw; + private final UUID ownUUID; + private final String ownerName; + private UUID ownerUUID; + + public CollarDyeScreen(ItemStack is, UUID player) { + super(is.getHoverName()); + this.is = is; + this.ownUUID = player; + this.initColor = ((DyeableLeatherItem) is.getItem()).getColor(is); + this.initPaw = ((CollarItem) is.getItem()).getTagColor(is); + this.shouldPaw = is.getItem() instanceof CollarItem ci && !ci.tagless; + var owner = NbtUtil.getDeedOwner(is); + this.ownerUUID = owner == null ? null : owner.uuid(); + this.ownerName = owner == null ? null : owner.name(); + } + + @Override + protected void init() { + int x = this.width / 2; + int y = this.height / 2 - 30; + + EditBox dyeField = new EditBox(this.font, x - 30, this.shouldPaw ? y : y + 25, 100, 20, Component.empty()); + dyeField.setMaxLength(6); + dyeField.setResponder(s -> updateTextField(false, s)); + dyeField.setFilter(s -> { try { Integer.parseInt(s, 16); } catch (NumberFormatException e) { return s.isEmpty(); } return true; }); + dyeField.setValue(Integer.toHexString(this.initColor)); + this.addRenderableWidget(dyeField); + + if (this.shouldPaw) { + EditBox pawField = new EditBox(this.font, x - 30, y + 25, 100, 20, Component.empty()); + pawField.setMaxLength(6); + pawField.setResponder(s -> updateTextField(true, s)); + pawField.setFilter(s -> { try { Integer.parseInt(s, 16); } catch (NumberFormatException e) { return s.isEmpty(); } return true; }); + pawField.setValue(Integer.toHexString(this.initPaw)); + this.addRenderableWidget(pawField); + } + + this.addRenderableWidget(Button.builder(Component.translatable("gui.done"), btn -> { + PacketUpdateCollar.OwnerState os = this.ownerUUID == null + ? PacketUpdateCollar.OwnerState.DEL + : (this.ownerUUID.equals(this.ownUUID) ? PacketUpdateCollar.OwnerState.ADD : PacketUpdateCollar.OwnerState.NOP); + ModPackets.CHANNEL.sendToServer(new PacketUpdateCollar(this.is, os)); + onClose(); + }).bounds(x + 5, y + 50, 75, 20).build()); + + this.addRenderableWidget(Button.builder(Component.translatable("gui.cancel"), btn -> { + NbtUtil.setColor(this.is, this.initColor); + NbtUtil.setTagColor(this.is, this.initPaw); + onClose(); + }).bounds(x - 80, y + 50, 75, 20).build()); + + Button ownerButton = Button.builder(Component.empty(), this::updateOwner) + .bounds(x - 80, y + 72, 160, 20).build(); + if (this.ownerUUID == null) { + ownerButton.setMessage(Component.translatable("item.playercollars.collar.become_owner")); + } else if (this.ownerUUID.equals(this.ownUUID)) { + ownerButton.setMessage(Component.translatable("item.playercollars.collar.remove_owner")); + } else { + ownerButton.setMessage(Component.translatable("item.playercollars.collar.owner", this.ownerName)); + ownerButton.active = false; + } + this.addRenderableWidget(ownerButton); + } + + private void updateOwner(Button btn) { + if (this.ownerUUID == null) { + this.ownerUUID = this.ownUUID; + btn.setMessage(Component.translatable("item.playercollars.collar.remove_owner")); + } else { + this.ownerUUID = null; + btn.setMessage(Component.translatable("item.playercollars.collar.become_owner")); + } + } + + private void updateTextField(boolean paw, String s) { + int col; + try { col = Integer.parseInt(s, 16); } catch (NumberFormatException e) { return; } + if (paw) NbtUtil.setTagColor(this.is, col); + else NbtUtil.setColor(this.is, col); + } + + @Override + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + renderBackground(context); + super.render(context, mouseX, mouseY, delta); + context.drawString(this.font, Component.translatable("item.playercollars.collar"), + this.width / 2 - 75, this.height / 2 + (this.shouldPaw ? -25 : 1), -1, true); + if (this.shouldPaw) + context.drawString(this.font, Component.translatable("item.playercollars.collar.paw"), + this.width / 2 - 75, this.height / 2 + 1, -1, true); + } + + @Override + public boolean isPauseScreen() { return false; } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/screen/DeedItemScreen.java b/src/main/java/org/jlortiz/playercollars/client/screen/DeedItemScreen.java new file mode 100644 index 00000000..8796183f --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/screen/DeedItemScreen.java @@ -0,0 +1,57 @@ +package org.jlortiz.playercollars.client.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.network.ModPackets; +import org.jlortiz.playercollars.network.PacketStampDeed; +import org.jlortiz.playercollars.util.NbtUtil; + +public class DeedItemScreen extends Screen { + private final OwnerComponent owner; + private final Component name; + + public DeedItemScreen(ItemStack is, Entity plr) { + super(is.getHoverName()); + this.owner = NbtUtil.getDeedOwner(is); + this.name = plr.getName(); + } + + @Override + protected void init() { + this.addRenderableWidget(Button.builder( + Component.translatable("item.playercollars.deed_of_ownership.stamp"), this::stampDeed) + .bounds(this.width / 2 - 80, this.height / 2 + 72, 160, 20).build()); + this.addRenderableWidget(Button.builder( + Component.translatable("gui.cancel"), x -> onClose()) + .bounds(this.width / 2 - 80, this.height / 2 + 95, 160, 20).build()); + } + + @Override + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + renderBackground(context); + super.render(context, mouseX, mouseY, delta); + int cx = this.width / 2; + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership"), cx, this.height / 2 - 88, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line1", this.name, this.owner.name()), cx, this.height / 2 - 55, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line2"), cx, this.height / 2 - 38, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line3"), cx, this.height / 2 - 26, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line4"), cx, this.height / 2 - 14, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line5"), cx, this.height / 2 - 2, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line6"), cx, this.height / 2 + 10, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line7"), cx, this.height / 2 + 23, -1); + context.drawCenteredString(this.font, Component.translatable("item.playercollars.deed_of_ownership.line8"), cx, this.height / 2 + 40, -1); + } + + @Override + public boolean isPauseScreen() { return false; } + + private void stampDeed(Button btn) { + ModPackets.CHANNEL.sendToServer(PacketStampDeed.INSTANCE); + onClose(); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/screen/PawsConfigScreen.java b/src/main/java/org/jlortiz/playercollars/client/screen/PawsConfigScreen.java new file mode 100644 index 00000000..a971cbf9 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/screen/PawsConfigScreen.java @@ -0,0 +1,88 @@ +package org.jlortiz.playercollars.client.screen; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Item; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.network.PawsConfigScreenHandler; + +public abstract class PawsConfigScreen + extends AbstractContainerScreen> { + + private static final ResourceLocation TEXTURE = + new ResourceLocation(PlayerCollarsMod.MOD_ID, "textures/gui/paw_controller.png"); + private static final ResourceLocation WIDGETS_TEXTURE = + new ResourceLocation(PlayerCollarsMod.MOD_ID, "textures/gui/paw_controller_widgets.png"); + + private TagLikeListWidget listWidget; + private ItemStack stack; + + protected PawsConfigScreen(PawsConfigScreenHandler handler, Inventory inv, Component title) { + super(handler, inv, title); + this.stack = ItemStack.EMPTY; + } + + @Override + protected void init() { + this.imageWidth = 174; + this.imageHeight = 222; + this.inventoryLabelY = this.imageHeight - 94; + super.init(); + this.listWidget = addRenderableWidget(new TagLikeListWidget<>( + 160, 106, + this.topPos + 18, this.topPos + 124, + this.font.lineHeight, + this.leftPos + 7, + this.menu.getRegistryKey(), + this::handleButtonClick)); + this.listWidget.setList(this.menu.listToDisplay); + } + + private void handleButtonClick(int id) { + this.menu.clickMenuButton(this.minecraft.player, id); + assert this.minecraft.gameMode != null; + this.minecraft.gameMode.handleInventoryButtonClick(this.menu.containerId, id); + this.menu.getSlot(0).set(ItemStack.EMPTY); + if (this.stack.isEmpty()) this.listWidget.setList(this.menu.listToDisplay); + } + + @Override + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + if (!ItemStack.matches(this.menu.getSlot(0).getItem(), this.stack)) { + this.stack = this.menu.getSlot(0).getItem(); + this.listWidget.setList(this.menu.listToDisplay); + } + super.render(context, mouseX, mouseY, delta); + renderTooltip(context, mouseX, mouseY); + } + + @Override + protected void renderBg(GuiGraphics context, float delta, int mouseX, int mouseY) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1, 1, 1, 1); + int x = (this.width - this.imageWidth - 50) / 2; + int y = (this.height - this.imageHeight) / 2; + context.blit(TEXTURE, x, y, 0, 0, this.imageWidth + 50, this.imageHeight); + context.blit(WIDGETS_TEXTURE, x + 7, y + 108, this.stack.isEmpty() ? 16 : 0, 0, 16, 16, 32, 16); + } + + public static class BlockScreen extends PawsConfigScreen { + public BlockScreen(PawsConfigScreenHandler handler, Inventory inv, Component title) { + super(handler, inv, title); + } + } + + public static class ItemScreen extends PawsConfigScreen { + public ItemScreen(PawsConfigScreenHandler handler, Inventory inv, Component title) { + super(handler, inv, title); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/screen/PawsSelectScreen.java b/src/main/java/org/jlortiz/playercollars/client/screen/PawsSelectScreen.java new file mode 100644 index 00000000..252b6d33 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/screen/PawsSelectScreen.java @@ -0,0 +1,45 @@ +package org.jlortiz.playercollars.client.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import org.jlortiz.playercollars.network.ModPackets; +import org.jlortiz.playercollars.network.PacketOpenPawsConfig; + +import java.util.UUID; + +public class PawsSelectScreen extends Screen { + private final UUID plr; + + public PawsSelectScreen(Entity plr) { + super(Component.translatable("gui.playercollars.paw_configurator.title", plr.getName())); + this.plr = plr.getUUID(); + } + + @Override + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + super.render(context, mouseX, mouseY, delta); + context.drawCenteredString(this.font, this.title, this.width / 2, this.height / 2 - 20, -1); + } + + @Override + protected void init() { + int x = this.width / 2; + int y = this.height / 2; + this.addRenderableWidget(Button.builder( + Component.translatable("gui.playercollars.paw_configurator.block.open"), btn -> { + ModPackets.CHANNEL.sendToServer(new PacketOpenPawsConfig(this.plr, false)); + onClose(); + }).bounds(x - 80, y, 160, 20).build()); + this.addRenderableWidget(Button.builder( + Component.translatable("gui.playercollars.paw_configurator.item.open"), btn -> { + ModPackets.CHANNEL.sendToServer(new PacketOpenPawsConfig(this.plr, true)); + onClose(); + }).bounds(x - 80, y + 22, 160, 20).build()); + } + + @Override + public boolean isPauseScreen() { return false; } +} diff --git a/src/main/java/org/jlortiz/playercollars/client/screen/TagLikeListWidget.java b/src/main/java/org/jlortiz/playercollars/client/screen/TagLikeListWidget.java new file mode 100644 index 00000000..19a3526d --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/client/screen/TagLikeListWidget.java @@ -0,0 +1,133 @@ +package org.jlortiz.playercollars.client.screen; + +import com.mojang.datafixers.util.Either; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.ObjectSelectionList; +import net.minecraft.core.Registry; +import net.minecraft.world.item.Item; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; + +import org.jlortiz.playercollars.util.TagKeyUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class TagLikeListWidget + extends ObjectSelectionList> { + + private final ResourceKey> registryKey; + private final Consumer handleClick; + private final int leftPos; + + public TagLikeListWidget(int width, int height, int top, int bottom, int itemHeight, + int leftPos, ResourceKey> registryKey, + Consumer handleClick) { + super(Minecraft.getInstance(), width, height, top, bottom, itemHeight); + this.registryKey = registryKey; + this.handleClick = handleClick; + this.leftPos = leftPos; + setRenderBackground(false); + setRenderTopAndBottom(false); + } + + @Override + public int getRowWidth() { return this.width - 5; } + + @Override + protected int getScrollbarPosition() { return this.leftPos + getRowWidth(); } + + @Override + public int getRowLeft() { return this.leftPos + 2; } + + public void setList(List, ResourceKey>> list) { + List> entries = new ArrayList<>(list.size()); + for (int i = 0; i < list.size(); i++) + entries.add(new TagEntry<>(this, i, list.get(i))); + replaceEntries(entries); + setScrollAmount(0); + } + + @Override + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + context.setColor(0.25F, 0.25F, 0.25F, 1.0F); + context.blit(net.minecraft.client.gui.screens.Screen.BACKGROUND_LOCATION, + this.leftPos, this.y0, 0.0F, 0.0F, this.width, this.height, 32, 32); + context.setColor(1.0F, 1.0F, 1.0F, 1.0F); + context.fillGradient(this.leftPos, this.y0, this.leftPos + this.width, this.y0 + 4, 0xFF000000, 0, 0); + context.fillGradient(this.leftPos, this.y1 - 4, this.leftPos + this.width, this.y1, 0, 0xFF000000, 0); + super.render(context, mouseX, mouseY, delta); + } + + private static final class TransparentButton extends Button { + private TransparentButton(TagLikeListWidget parent) { + super(0, 0, parent.getRowWidth(), parent.itemHeight, Component.empty(), x -> {}, DEFAULT_NARRATION); + } + + @Override + public void renderWidget(GuiGraphics context, int mouseX, int mouseY, float delta) { + if (this.isHovered()) + context.fill(getX(), getY(), getX() + getWidth(), getY() + this.height, 0x80999999); + } + } + + public static final class TagEntry + extends ObjectSelectionList.Entry> { + private final TagLikeListWidget parent; + private final Component label; + private final TransparentButton button; + private final int index; + + private TagEntry(TagLikeListWidget parent, int index, Either, ResourceKey> key) { + this.parent = parent; + this.index = index; + assert Minecraft.getInstance().level != null; + this.label = key.map( + TagKeyUtil::getName, + x -> { + assert Minecraft.getInstance().level != null; + return Minecraft.getInstance().level + .registryAccess() + .registry(parent.registryKey) + .flatMap(r -> r.getHolder(x)) + .map(h -> { + // Works for both Block and Item via their registry name + var rKey = h.unwrapKey(); + return rKey.map(k -> Component.literal(k.location().getPath())) + .orElse(Component.literal("error!")); + }) + .orElse(Component.literal("error!")); + }); + this.button = new TransparentButton<>(parent); + } + + @Override + public void render(GuiGraphics context, int idx, int y, int x, int entryWidth, int entryHeight, + int mouseX, int mouseY, boolean hovered, float tickDelta) { + this.button.setPosition(x, y - 2); + this.button.render(context, mouseX, mouseY, tickDelta); + context.drawString(this.parent.minecraft.font, this.label, x, y - 1, 0xFFFFFF, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (this.button.mouseClicked(mouseX, mouseY, button)) { + this.parent.handleClick.accept(this.index); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + return this.button.mouseReleased(mouseX, mouseY, button); + } + + @Override + public Component getNarration() { return this.label; } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/enchantment/AudibleEnchantment.java b/src/main/java/org/jlortiz/playercollars/enchantment/AudibleEnchantment.java new file mode 100644 index 00000000..60aab5a4 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/enchantment/AudibleEnchantment.java @@ -0,0 +1,28 @@ +package org.jlortiz.playercollars.enchantment; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.ClickerItem; + +public class AudibleEnchantment extends Enchantment { + public AudibleEnchantment() { + super(Rarity.UNCOMMON, PlayerCollarsMod.CLICKER_ENCHANTABLE, new EquipmentSlot[]{}); + } + + @Override public int getMinCost(int level) { return level == 1 ? 2 : level == 2 ? 26 : 48; } + @Override public int getMaxCost(int level) { return level == 1 ? 24 : level == 2 ? 47 : 72; } + @Override public int getMaxLevel() { return 3; } + + + @Override + public boolean canApplyAtEnchantingTable(net.minecraft.world.item.ItemStack stack) { + return stack.getItem() instanceof org.jlortiz.playercollars.item.ClickerItem; + } + + @Override + public boolean isAllowedOnBooks() { + return true; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/enchantment/HealingEnchantment.java b/src/main/java/org/jlortiz/playercollars/enchantment/HealingEnchantment.java new file mode 100644 index 00000000..3daa5358 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/enchantment/HealingEnchantment.java @@ -0,0 +1,45 @@ +package org.jlortiz.playercollars.enchantment; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.CollarItem; +import org.jlortiz.playercollars.util.NbtUtil; + +public class HealingEnchantment extends Enchantment { + public HealingEnchantment() { + super(Rarity.RARE, PlayerCollarsMod.COLLAR_ENCHANTABLE, new EquipmentSlot[]{}); + } + + @Override public int getMinCost(int level) { return 46; } + @Override public int getMaxCost(int level) { return 70; } + @Override public int getMaxLevel() { return 1; } + + + // Called every tick from CollarItem.buildCurio's curioTick + public static void tick(LivingEntity entity, net.minecraft.world.item.ItemStack collarStack, int level) { + if (entity.level().isClientSide) return; + var owner = NbtUtil.getDeedOwner(collarStack); + if (owner == null) return; + Player own = entity.level().getPlayerByUUID(owner.uuid()); + if (own != null && own.distanceToSqr(entity) < 256) { // 16 blocks + entity.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 40, level - 1, false, false, false)); + } + } + + @Override + public boolean canApplyAtEnchantingTable(net.minecraft.world.item.ItemStack stack) { + return stack.getItem() instanceof org.jlortiz.playercollars.item.CollarItem; + } + + @Override + public boolean isAllowedOnBooks() { + return true; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/enchantment/SpikedEnchantment.java b/src/main/java/org/jlortiz/playercollars/enchantment/SpikedEnchantment.java new file mode 100644 index 00000000..9b655dd5 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/enchantment/SpikedEnchantment.java @@ -0,0 +1,44 @@ +package org.jlortiz.playercollars.enchantment; + +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.CollarItem; + +public class SpikedEnchantment extends Enchantment { + public SpikedEnchantment() { + super(Rarity.VERY_RARE, PlayerCollarsMod.COLLAR_ENCHANTABLE, new EquipmentSlot[]{}); + } + + @Override public int getMinCost(int level) { return level == 1 ? 2 : level == 2 ? 24 : 44; } + @Override public int getMaxCost(int level) { return level == 1 ? 22 : level == 2 ? 43 : 68; } + @Override public int getMaxLevel() { return 3; } + + + // Called from MixinEnchantmentHelper when collar wearer is hurt + @Override + public void doPostHurt(LivingEntity user, Entity attacker, int level) { + // 15% chance per level, same as vanilla Thorns, but NO durability damage + if (user.level().isClientSide) return; + if (user.getRandom().nextFloat() < 0.15f * level) { + if (attacker instanceof LivingEntity living) { + DamageSource src = user.damageSources().thorns(user); + living.hurt(src, 1.0f + user.getRandom().nextInt(4)); + } + } + } + + @Override + public boolean canApplyAtEnchantingTable(net.minecraft.world.item.ItemStack stack) { + return stack.getItem() instanceof org.jlortiz.playercollars.item.CollarItem; + } + + @Override + public boolean isAllowedOnBooks() { + return true; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/enchantment/TightLeashEnchantment.java b/src/main/java/org/jlortiz/playercollars/enchantment/TightLeashEnchantment.java new file mode 100644 index 00000000..0dc8182b --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/enchantment/TightLeashEnchantment.java @@ -0,0 +1,28 @@ +package org.jlortiz.playercollars.enchantment; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.CollarItem; + +public class TightLeashEnchantment extends Enchantment { + public TightLeashEnchantment() { + super(Rarity.COMMON, PlayerCollarsMod.COLLAR_ENCHANTABLE, new EquipmentSlot[]{}); + } + + @Override public int getMinCost(int level) { return level == 1 ? 2 : 30; } + @Override public int getMaxCost(int level) { return level == 1 ? 28 : 55; } + @Override public int getMaxLevel() { return 2; } + + + @Override + public boolean canApplyAtEnchantingTable(net.minecraft.world.item.ItemStack stack) { + return stack.getItem() instanceof org.jlortiz.playercollars.item.CollarItem; + } + + @Override + public boolean isAllowedOnBooks() { + return true; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/ClickerItem.java b/src/main/java/org/jlortiz/playercollars/item/ClickerItem.java index efc5d603..8806e432 100644 --- a/src/main/java/org/jlortiz/playercollars/item/ClickerItem.java +++ b/src/main/java/org/jlortiz/playercollars/item/ClickerItem.java @@ -1,91 +1,117 @@ package org.jlortiz.playercollars.item; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.nbt.CompoundTag; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.DyeableLeatherItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.Enchantments; +import org.jlortiz.playercollars.enchantment.AudibleEnchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.FishingSpeedEnchantment; import net.minecraft.world.level.Level; -import net.minecraftforge.network.PacketDistributor; -import org.jlortiz.playercollars.PacketLookAtLerped; +import org.jetbrains.annotations.Nullable; import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.network.ModPackets; +import org.jlortiz.playercollars.network.PacketLookAtLerped; +import org.jlortiz.playercollars.util.NbtUtil; import top.theillusivec4.curios.api.CuriosApi; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; +import java.util.UUID; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class ClickerItem extends Item implements DyeableLeatherItem { + private static final UUID LURE_CLICKER_DISTANCE_ATTRIBUTE = UUID.fromString("c60e705d-bd9b-40bd-af81-28c7ad15d8d3"); + public ClickerItem() { super(new Item.Properties().stacksTo(1)); } - @Override - public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { - return enchantment == Enchantments.FISHING_SPEED; + public static boolean isAcceptableEnchantment(Enchantment enchantment) { + return enchantment instanceof AudibleEnchantment; } - @Override - public boolean isEnchantable(ItemStack p_41456_) { - return true; + public boolean getForceTurning(ItemStack stack) { + return stack.hasTag() && stack.getTag().getBoolean("force_turning"); } - @Override - public int getEnchantmentValue(ItemStack stack) { - return 40; + public void setForceTurning(ItemStack stack, boolean val) { + stack.getOrCreateTag().putBoolean("force_turning", val); } @Override - public InteractionResultHolder use(Level p_41432_, Player p_41433_, InteractionHand p_41434_) { - p_41433_.startUsingItem(p_41434_); - if (!p_41432_.isClientSide) { - int level = p_41433_.getItemInHand(p_41434_).getEnchantmentLevel(Enchantments.FISHING_SPEED); - if (level > 0) { - final int trueLevel = 4 << level; - List plrs = ((ServerLevel) p_41432_).getPlayers((p) -> !p.is(p_41433_) && p.closerThan(p_41433_, trueLevel)); - for (ServerPlayer p : plrs) { - CuriosApi.getCuriosInventory(p).ifPresent((handler) -> handler.getStacksHandler("necklace").ifPresent((slot) -> { - ItemStack is = PlayerCollarsMod.filterStacksByOwner(slot.getStacks(), p_41433_.getUUID()); - if (is == null) { - is = PlayerCollarsMod.filterStacksByOwner(slot.getCosmeticStacks(), p_41433_.getUUID()); - } - if (is != null) { - PacketLookAtLerped packet = new PacketLookAtLerped(p_41433_); - PlayerCollarsMod.NETWORK.send(PacketDistributor.PLAYER.with(() -> p), packet); + public int getColor(ItemStack stack) { return NbtUtil.getColor(stack, 0xFFFFFF); } + + @Override + public void setColor(ItemStack stack, int color) { NbtUtil.setColor(stack, color); } + + @Override + public boolean isEnchantable(ItemStack stack) { return true; } + + @Override + public int getEnchantmentValue() { return 40; } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + player.startUsingItem(hand); + if (!world.isClientSide) { + ItemStack stack = player.getItemInHand(hand); + boolean forceTurning = getForceTurning(stack); + if (player.isCrouching()) { + setForceTurning(stack, !forceTurning); + player.displayClientMessage(Component.translatable( + forceTurning ? "item.playercollars.clicker.turn_disable" : "item.playercollars.clicker.turn_enable"), true); + return InteractionResultHolder.consume(stack); + } + world.playSound(null, player, PlayerCollarsMod.CLICKER_ON.get(), net.minecraft.sounds.SoundSource.PLAYERS, 1, 1); + if (forceTurning) { + double clickerDistance = player.getAttributeValue(PlayerCollarsMod.ATTR_CLICKER_DISTANCE.get()); + var targets = ((ServerLevel) world).getPlayers(p -> !p.is(player) && p.distanceTo(player) <= clickerDistance); + PacketLookAtLerped packet = new PacketLookAtLerped(player); + for (ServerPlayer target : targets) { + CuriosApi.getCuriosInventory(target).ifPresent(h -> { + var collars = h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)); + if (PlayerCollarsMod.filterStacksByOwner(collars, player.getUUID(), target.getUUID()) != null) { + ModPackets.CHANNEL.sendTo(packet, target.connection.connection, + net.minecraftforge.network.NetworkDirection.PLAY_TO_CLIENT); } - })); + }); } } - p_41432_.playSound(null, p_41433_, PlayerCollarsMod.CLICKER_ON.get(), SoundSource.PLAYERS, 1, 1); } - return InteractionResultHolder.fail(p_41433_.getItemInHand(p_41434_)); + return InteractionResultHolder.fail(player.getItemInHand(hand)); } @Override - public int getUseDuration(ItemStack p_41454_) { - return Integer.MAX_VALUE; + public int getUseDuration(ItemStack stack) { return Integer.MAX_VALUE; } + + @Override + public void releaseUsing(ItemStack stack, Level world, LivingEntity user, int remainingTicks) { + if (!world.isClientSide) + world.playSound(null, user, PlayerCollarsMod.CLICKER_OFF.get(), net.minecraft.sounds.SoundSource.PLAYERS, 1, 1); } @Override - public void releaseUsing(ItemStack p_41412_, Level p_41413_, LivingEntity p_41414_, int p_41415_) { - if (!p_41413_.isClientSide) { - p_41413_.playSound(null, p_41414_, PlayerCollarsMod.CLICKER_OFF.get(), SoundSource.PLAYERS, 1, 1); - } + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + super.appendHoverText(stack, world, tooltip, context); + if (getForceTurning(stack)) + tooltip.add(Component.translatable("item.playercollars.clicker.turn")); } @Override - public int getColor(ItemStack itemStack) { - CompoundTag $$1 = itemStack.getTagElement("display"); - return $$1 != null && $$1.contains("color", 99) ? $$1.getInt("color") : 0xFFFFFF; + public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { + if (slot != EquipmentSlot.MAINHAND) return ImmutableMultimap.of(); + int lure = EnchantmentHelper.getItemEnchantmentLevel(org.jlortiz.playercollars.PlayerCollarsMod.AUDIBLE_ENCHANTMENT.get(), stack); + if (lure == 0) return ImmutableMultimap.of(); + return ImmutableMultimap.of(PlayerCollarsMod.ATTR_CLICKER_DISTANCE.get(), + new AttributeModifier(LURE_CLICKER_DISTANCE_ATTRIBUTE, getDescriptionId(), lure * 4, AttributeModifier.Operation.ADDITION)); } } diff --git a/src/main/java/org/jlortiz/playercollars/item/CollarItem.java b/src/main/java/org/jlortiz/playercollars/item/CollarItem.java index 6628f1a9..9981723e 100644 --- a/src/main/java/org/jlortiz/playercollars/item/CollarItem.java +++ b/src/main/java/org/jlortiz/playercollars/item/CollarItem.java @@ -1,158 +1,145 @@ package org.jlortiz.playercollars.item; -import com.mojang.datafixers.util.Pair; -import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; +import com.google.common.collect.Multimap; import net.minecraft.client.Minecraft; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.DyeableLeatherItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.Level; -import net.minecraft.world.level.material.MapColor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jlortiz.playercollars.client.CollarDyeScreen; -import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.CuriosCapability; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.client.screen.CollarDyeScreen; +import org.jlortiz.playercollars.util.NbtUtil; +import org.jlortiz.playercollars.enchantment.HealingEnchantment; +import org.jlortiz.playercollars.enchantment.SpikedEnchantment; +import org.jlortiz.playercollars.enchantment.TightLeashEnchantment; import top.theillusivec4.curios.api.SlotContext; import top.theillusivec4.curios.api.type.capability.ICurio; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.*; +import java.util.List; +import java.util.UUID; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class CollarItem extends Item implements DyeableLeatherItem, ICurio, ICapabilityProvider { +public class CollarItem extends Item implements DyeableLeatherItem { + private static final int DEFAULT_COLOR = 0xA00000; + private static final int DEFAULT_PAW_COLOR = 0x0000A0; + public final boolean tagless; - private static final Set ALLOWED_ENCHANTMENTS = new HashSet<>(); - static { - ALLOWED_ENCHANTMENTS.add(Enchantments.LOYALTY); - ALLOWED_ENCHANTMENTS.add(Enchantments.BINDING_CURSE); - ALLOWED_ENCHANTMENTS.add(Enchantments.THORNS); - ALLOWED_ENCHANTMENTS.add(Enchantments.MENDING); - } - public CollarItem() { + public CollarItem(boolean tagless) { super(new Item.Properties().stacksTo(1)); - } + this.tagless = tagless; + } + + public static boolean isAcceptableEnchantment(Enchantment enchantment) { + return enchantment instanceof BindingCurseEnchantment || + enchantment instanceof HealingEnchantment || + enchantment instanceof TightLeashEnchantment || + enchantment instanceof SpikedEnchantment || + enchantment instanceof MendingEnchantment; + } + + /** Build an ICurio capability for a given stack of this item. */ + public ICurio buildCurio(ItemStack stack) { + return new ICurio() { + @Override + public ItemStack getStack() { return stack; } + + @Override + public void curioTick(SlotContext slotContext) { + LivingEntity entity = slotContext.entity(); + if (entity.level().isClientSide) return; + int healingLevel = EnchantmentHelper.getItemEnchantmentLevel( + PlayerCollarsMod.HEALING_ENCHANTMENT.get(), stack); + if (healingLevel > 0) { + HealingEnchantment.tick(entity, stack, healingLevel); + } + } - @Override - public int getEnchantmentValue(ItemStack stack) { - return 40; - } + @Override + public Multimap getAttributeModifiers(SlotContext slotContext, UUID uuid) { + var modifiers = ICurio.super.getAttributeModifiers(slotContext, uuid); + int loyalty = EnchantmentHelper.getItemEnchantmentLevel( + PlayerCollarsMod.TIGHT_LEASH_ENCHANTMENT.get(), stack); + modifiers.put(PlayerCollarsMod.ATTR_LEASH_DISTANCE.get(), + new AttributeModifier(uuid, CollarItem.this.getDescriptionId(), -loyalty, + AttributeModifier.Operation.ADDITION)); + return modifiers; + } - @Override - public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { - return ALLOWED_ENCHANTMENTS.contains(enchantment); - } + @Override + public ICurio.DropRule getDropRule(SlotContext slotContext, + net.minecraft.world.damagesource.DamageSource source, int lootingLevel, boolean recentlyHit) { + return ICurio.DropRule.ALWAYS_KEEP; + } - @Override - public @Nullable ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { - return this; + @Override + public boolean canEquipFromUse(SlotContext slotContext) { + // Let use() handle shift+right-click for the dye screen + return !slotContext.entity().isCrouching(); + } + }; } @Override - public ItemStack getStack() { - return new ItemStack(this); - } + public boolean isEnchantable(net.minecraft.world.item.ItemStack stack) { return true; } @Override - public void curioTick(SlotContext slotContext) { - LivingEntity ent = slotContext.entity(); - if (ent.level().isClientSide) return; - CuriosApi.getCuriosInventory(ent).ifPresent((handler) -> handler.findCurio(slotContext.identifier(), slotContext.index()).ifPresent((sr) -> { - if (this.getEnchantmentLevel(sr.stack(), Enchantments.MENDING) == 0) return; - Pair owner = this.getOwner(sr.stack()); - if (owner == null || owner.getFirst().equals(ent.getUUID())) return; - Player own = ent.level().getPlayerByUUID(owner.getFirst()); - if (own != null && own.distanceTo(ent) < 16) { - ent.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 40, 0, false, false, false)); - } - })); - } - + public int getEnchantmentValue() { return 60; } @Override - public LazyOptional getCapability(Capability capability, @Nullable Direction direction) { - if (capability == CuriosCapability.ITEM) { - return LazyOptional.of(() -> (T) this); - } - return LazyOptional.empty(); - } + public boolean isFoil(ItemStack stack) { return false; } @Override - public int getColor(ItemStack itemStack) { - CompoundTag $$1 = itemStack.getTagElement("display"); - return $$1 != null && $$1.contains("color", 99) ? $$1.getInt("color") : MapColor.COLOR_RED.col; - } + public int getColor(ItemStack stack) { return NbtUtil.getColor(stack, DEFAULT_COLOR); } - public int getPawColor(ItemStack itemStack) { - CompoundTag $$1 = itemStack.getTagElement("display"); - return $$1 != null && $$1.contains("paw", 99) ? $$1.getInt("paw") : MapColor.COLOR_BLUE.col; - } - - public void setPawColor(ItemStack itemStack, int col) { - CompoundTag $$1 = itemStack.getOrCreateTagElement("display"); - $$1.putInt("paw", col); - } + @Override + public void setColor(ItemStack stack, int color) { NbtUtil.setColor(stack, color); } - public @Nullable Pair getOwner(ItemStack is) { - CompoundTag $$1 = is.getTagElement("owner"); - if ($$1 == null || !$$1.contains("uuid") || !$$1.contains("name")) return null; - return new Pair<>($$1.getUUID("uuid"), $$1.getString("name")); - } + public int getTagColor(ItemStack stack) { return NbtUtil.getTagColor(stack, DEFAULT_PAW_COLOR); } - public void setOwner(ItemStack is, @Nullable UUID uuid, @Nullable String name) { - if (uuid == null || name == null) { - is.removeTagKey("owner"); - return; + @Override + @OnlyIn(Dist.CLIENT) + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + if (player.isCrouching() && world.isClientSide) { + Minecraft.getInstance().setScreen(new CollarDyeScreen(stack, player.getUUID())); + return InteractionResultHolder.success(stack); } - CompoundTag $$1 = is.getOrCreateTagElement("owner"); - $$1.putUUID("uuid", uuid); - $$1.putString("name", name); + return super.use(world, player, hand); } @Override - @OnlyIn(Dist.CLIENT) - public InteractionResultHolder use(Level p_41432_, Player p_41433_, InteractionHand p_41434_) { - InteractionResultHolder ir = super.use(p_41432_, p_41433_, p_41434_); - if (ir.getResult() == InteractionResult.PASS && p_41433_.isCrouching() && p_41432_.isClientSide) { - Minecraft.getInstance().setScreen(new CollarDyeScreen(ir.getObject(), p_41433_.getUUID())); - return new InteractionResultHolder<>(InteractionResult.SUCCESS, ir.getObject()); - } - return ir; + public Component getName(ItemStack stack) { + var owner = NbtUtil.getDeedOwner(stack); + if (owner != null && owner.ownedName().isPresent()) + return Component.translatable("item.playercollars.collar.named", owner.ownedName().get()); + return super.getName(stack); } @Override - public void appendHoverText(ItemStack p_41421_, @Nullable Level p_41422_, List p_41423_, @NotNull TooltipFlag p_41424_) { - super.appendHoverText(p_41421_, p_41422_, p_41423_, p_41424_); - if (p_41424_.isAdvanced()) { - p_41423_.add(Component.translatable("item.playercollars.collar.paw_color", Integer.toHexString(getPawColor(p_41421_))).withStyle(ChatFormatting.GRAY)); - } - Pair owner = getOwner(p_41421_); - if (owner != null) { - p_41423_.add(Component.translatable("item.playercollars.collar.owner", owner.getSecond()).withStyle(ChatFormatting.GRAY)); - } + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + super.appendHoverText(stack, world, tooltip, context); + if (context.isAdvanced() && !this.tagless) + tooltip.add(Component.translatable("item.playercollars.collar.paw_color", + Integer.toHexString(getTagColor(stack))).setStyle(Style.EMPTY.withColor(0x808080))); + var owner = NbtUtil.getDeedOwner(stack); + if (owner != null) + tooltip.add(Component.translatable("item.playercollars.collar.owner", owner.name()) + .setStyle(Style.EMPTY.withColor(0x808080))); } @Override - public boolean isEnchantable(ItemStack p_41456_) { - return true; + public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities( + net.minecraft.world.item.ItemStack stack, @org.jetbrains.annotations.Nullable net.minecraft.nbt.CompoundTag nbt) { + return top.theillusivec4.curios.api.CuriosApi.createCurioProvider(buildCurio(stack)); } -} +} \ No newline at end of file diff --git a/src/main/java/org/jlortiz/playercollars/item/CollarLockerItem.java b/src/main/java/org/jlortiz/playercollars/item/CollarLockerItem.java new file mode 100644 index 00000000..5880d111 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/CollarLockerItem.java @@ -0,0 +1,62 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; +import top.theillusivec4.curios.api.CuriosApi; + +public class CollarLockerItem extends Item { + public CollarLockerItem() { + super(new Properties().stacksTo(1)); + } + + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player user, LivingEntity targetEntity, InteractionHand hand) { + if (!(targetEntity instanceof Player targetPlayer) || user.level().isClientSide) + return InteractionResult.PASS; + + var curiosOpt = CuriosApi.getCuriosInventory(targetPlayer); + if (!curiosOpt.isPresent()) return InteractionResult.PASS; + + var collarResults = curiosOpt.resolve().orElseThrow().findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)); + ItemStack collarStack = PlayerCollarsMod.filterStacksByOwner(collarResults, user.getUUID(), targetPlayer.getUUID()); + if (collarStack == null) { + user.displayClientMessage(Component.translatable("item.playercollars.collar_locker.no_set_non_owner") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + var deedOwner = NbtUtil.getDeedOwner(collarStack); + if (deedOwner == null || deedOwner.owned().isEmpty()) { + user.displayClientMessage(Component.translatable("item.playercollars.collar_locker.no_set_non_deed") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + + boolean shouldLock = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BINDING_CURSE, collarStack) == 0; + var allEquipped = curiosOpt.resolve().orElseThrow().findCurios(s -> + s.is(PlayerCollarsMod.COLLAR_TAG) || s.is(PlayerCollarsMod.PAWS_TAG) || s.is(PlayerCollarsMod.FOOT_PAWS_TAG)); + + for (var sr : allEquipped) { + ItemStack is = sr.stack(); + var enchants = EnchantmentHelper.getEnchantments(is); + if (shouldLock) enchants.put(Enchantments.BINDING_CURSE, 1); + else enchants.remove(Enchantments.BINDING_CURSE); + EnchantmentHelper.setEnchantments(enchants, is); + } + var text = Component.translatable(shouldLock ? "item.playercollars.collar_locker.locked" : "item.playercollars.collar_locker.unlocked"); + targetPlayer.displayClientMessage(text, true); + user.displayClientMessage(text, true); + targetPlayer.level().playSound(null, targetEntity.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS); + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/DeedItem.java b/src/main/java/org/jlortiz/playercollars/item/DeedItem.java new file mode 100644 index 00000000..7c0b22f5 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/DeedItem.java @@ -0,0 +1,64 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.client.screen.DeedItemScreen; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.List; + +public class DeedItem extends Item { + public DeedItem() { super(new Item.Properties().stacksTo(1)); } + + @OnlyIn(Dist.CLIENT) + private static void openTheScreen(ItemStack is, Player plr) { + Minecraft.getInstance().setScreen(new DeedItemScreen(is, plr)); + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + ItemStack is = player.getItemInHand(hand); + if (world.isClientSide) { + OwnerComponent owner = NbtUtil.getDeedOwner(is); + if (owner != null && owner.owned().isEmpty()) { + if (owner.uuid().equals(player.getUUID())) { + player.displayClientMessage(Component.translatable("item.playercollars.deed_of_ownership.no_self_own"), true); + return InteractionResultHolder.pass(is); + } + openTheScreen(is, player); + return InteractionResultHolder.success(is); + } + } else if (NbtUtil.getDeedOwner(is) == null) { + NbtUtil.setDeedOwner(is, new OwnerComponent(player.getUUID(), player.getName().getString())); + player.displayClientMessage(Component.translatable("item.playercollars.deed_of_ownership.filled_out"), true); + return InteractionResultHolder.consume(is); + } + return InteractionResultHolder.pass(is); + } + + @Override + public Component getName(ItemStack stack) { + OwnerComponent owner = NbtUtil.getDeedOwner(stack); + return owner != null ? Component.translatable(getDescriptionId(stack) + ".filled") : super.getName(stack); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + super.appendHoverText(stack, world, tooltip, context); + OwnerComponent owner = NbtUtil.getDeedOwner(stack); + if (owner != null) + tooltip.add(Component.translatable("item.playercollars.collar.owner", owner.name()) + .withStyle(net.minecraft.ChatFormatting.GRAY)); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/DummyBoneItem.java b/src/main/java/org/jlortiz/playercollars/item/DummyBoneItem.java new file mode 100644 index 00000000..bd990816 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/DummyBoneItem.java @@ -0,0 +1,15 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.extensions.IForgeItem; + +public class DummyBoneItem extends Item { + public DummyBoneItem(Properties settings) { super(settings); } + + @Override + public EquipmentSlot getEquipmentSlot(ItemStack stack) { + return EquipmentSlot.HEAD; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/FootPawsItem.java b/src/main/java/org/jlortiz/playercollars/item/FootPawsItem.java new file mode 100644 index 00000000..a346547c --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/FootPawsItem.java @@ -0,0 +1,52 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jlortiz.playercollars.PlayerCollarsMod; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.type.capability.ICurio; + +public class FootPawsItem extends Item { + private final int color; + private final int pawColor; + + public FootPawsItem(int color, int pawColor) { + super(new Item.Properties().stacksTo(1)); + this.color = color; + this.pawColor = pawColor; + } + + @Override public boolean isFoil(ItemStack stack) { return false; } + + /** Build an ICurio capability for a given stack of this item. */ + public ICurio buildCurio(ItemStack stack) { + return new ICurio() { + @Override + public ItemStack getStack() { return stack; } + + @Override + public void curioTick(SlotContext slotContext) {} + + @Override + public ICurio.DropRule getDropRule(SlotContext slotContext, + net.minecraft.world.damagesource.DamageSource source, int lootingLevel, boolean recentlyHit) { + return ICurio.DropRule.ALWAYS_KEEP; + } + }; + } + + public static ResourceLocation getIdentifier(DyeColor c) { + return new ResourceLocation(PlayerCollarsMod.MOD_ID, c.getName() + "_foot_paws"); + } + + public int getColor() { return this.color; } + public int getPawColor() { return this.pawColor; } + + @Override + public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities( + net.minecraft.world.item.ItemStack stack, @org.jetbrains.annotations.Nullable net.minecraft.nbt.CompoundTag nbt) { + return top.theillusivec4.curios.api.CuriosApi.createCurioProvider(buildCurio(stack)); + } +} \ No newline at end of file diff --git a/src/main/java/org/jlortiz/playercollars/item/OwnershipCraftingRecipe.java b/src/main/java/org/jlortiz/playercollars/item/OwnershipCraftingRecipe.java new file mode 100644 index 00000000..4e6c917b --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/OwnershipCraftingRecipe.java @@ -0,0 +1,103 @@ +package org.jlortiz.playercollars.item; + +import com.google.gson.JsonObject; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; + +public class OwnershipCraftingRecipe extends CustomRecipe { + private final Ingredient base; + + public OwnershipCraftingRecipe(ResourceLocation id, CraftingBookCategory category, Ingredient base) { + super(id, category); + this.base = base; + } + + @Override + public boolean matches(CraftingContainer inventory, Level world) { + boolean seenDeed = false; + boolean seenBase = false; + for (int i = 0; i < inventory.getContainerSize(); i++) { + ItemStack is = inventory.getItem(i); + if (is.isEmpty()) continue; + if (is.is(PlayerCollarsMod.DEED_OF_OWNERSHIP_STAMPED.get())) { + if (seenDeed) return false; + seenDeed = true; + } else if (this.base.test(is)) { + if (seenBase) return false; + seenBase = true; + } else return false; + } + return seenDeed && seenBase; + } + + @Override + public ItemStack assemble(CraftingContainer inventory, RegistryAccess registryAccess) { + ItemStack output = ItemStack.EMPTY; + OwnerComponent owner = null; + for (int j = 0; j < inventory.getContainerSize(); j++) { + ItemStack is = inventory.getItem(j); + if (!is.isEmpty()) { + if (is.is(PlayerCollarsMod.DEED_OF_OWNERSHIP_STAMPED.get())) { + owner = NbtUtil.getDeedOwner(is); + } else if (this.base.test(is)) { + output = is.copy(); + } + } + } + if (owner == null || output.isEmpty()) return ItemStack.EMPTY; + NbtUtil.setDeedOwner(output, owner); + return output; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { return width * height > 2; } + + @Override + public RecipeSerializer getSerializer() { return Serializer.INSTANCE; } + + @FunctionalInterface + public interface RecipeFactory { + OwnershipCraftingRecipe create(ResourceLocation id, CraftingBookCategory category, Ingredient base); + } + + public static class Serializer implements RecipeSerializer { + public static final Serializer INSTANCE = new Serializer(OwnershipCraftingRecipe::new); + private final RecipeFactory factory; + + public Serializer(RecipeFactory factory) { this.factory = factory; } + + @Override + public OwnershipCraftingRecipe fromJson(ResourceLocation id, JsonObject json) { + CraftingBookCategory category = CraftingBookCategory.CODEC + .byName(GsonHelper.getAsString(json, "category", null), CraftingBookCategory.MISC); + Ingredient ingredient = Ingredient.fromJson(json.get("ingredient"), false); + return this.factory.create(id, category, ingredient); + } + + @Override + public OwnershipCraftingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buf) { + CraftingBookCategory category = buf.readEnum(CraftingBookCategory.class); + Ingredient ingredient = Ingredient.fromNetwork(buf); + return this.factory.create(id, category, ingredient); + } + + @Override + public void toNetwork(FriendlyByteBuf buf, OwnershipCraftingRecipe recipe) { + buf.writeEnum(recipe.category()); + recipe.base.toNetwork(buf); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/PawSetupItem.java b/src/main/java/org/jlortiz/playercollars/item/PawSetupItem.java new file mode 100644 index 00000000..3c5c9eb5 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/PawSetupItem.java @@ -0,0 +1,54 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.client.screen.PawsSelectScreen; +import top.theillusivec4.curios.api.CuriosApi; + +public class PawSetupItem extends Item { + public PawSetupItem() { super(new Properties().stacksTo(1)); } + + @Override + public ItemStack getCraftingRemainingItem(ItemStack stack) { return stack; } + @Override + public boolean hasCraftingRemainingItem(ItemStack stack) { return true; } + + @Override + @OnlyIn(Dist.CLIENT) + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + ItemStack is = user.getItemInHand(hand); + if (!user.isCrouching() || !world.isClientSide) return InteractionResultHolder.pass(is); + return switch (interactLivingEntity(is, user, user, hand)) { + case SUCCESS -> InteractionResultHolder.success(is); + case CONSUME, CONSUME_PARTIAL -> InteractionResultHolder.consume(is); + case PASS -> InteractionResultHolder.pass(is); + case FAIL -> InteractionResultHolder.fail(is); + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public InteractionResult interactLivingEntity(ItemStack stack, Player user, LivingEntity entity, InteractionHand hand) { + if (!(entity instanceof Player player) || !user.level().isClientSide) return InteractionResult.PASS; + var collarResults = CuriosApi.getCuriosInventory(player) + .map(h -> h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG))).orElse(java.util.List.of()); + if (PlayerCollarsMod.filterStacksByOwner(collarResults, user.getUUID(), player.getUUID()) == null) { + user.displayClientMessage(Component.translatable("item.playercollars.paw_configurator.no_set_non_owner") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + Minecraft.getInstance().setScreen(new PawsSelectScreen(player)); + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/PawsItem.java b/src/main/java/org/jlortiz/playercollars/item/PawsItem.java new file mode 100644 index 00000000..24d89966 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/PawsItem.java @@ -0,0 +1,69 @@ +package org.jlortiz.playercollars.item; + +import com.mojang.datafixers.util.Either; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.List; +import java.util.Optional; + +public class PawsItem extends FootPawsItem { + public PawsItem(int color, int pawColor) { + super(color, pawColor); + } + + public static boolean shouldPreventBlockInteraction(ItemStack stack, @NotNull BlockState block) { + if (block.is(PlayerCollarsMod.PAWS_ALLOW_INTERACT)) return false; + + List, ResourceKey>> allowed = NbtUtil.getCanInteract(stack); + Optional> key = block.getBlockHolder().unwrapKey(); + + if (allowed == null || allowed.isEmpty() || key.isEmpty()) return false; + + for (Either, ResourceKey> entry : allowed) { + if (entry.map(block::is, y -> y.equals(key.get()))) return false; + } + return true; + } + + public static boolean shouldDrop(ItemStack pawsStack, ItemStack thing) { + if (thing.isEmpty()) return false; + + List, ResourceKey>> slippery = NbtUtil.getHeldItems(pawsStack); + Optional> key = thing.getItemHolder().unwrapKey(); + + if (slippery == null || slippery.isEmpty() || key.isEmpty()) return false; + + for (Either, ResourceKey> entry : slippery) { + if (entry.map(thing::is, y -> y.equals(key.get()))) return false; + } + return true; + } + + public static ResourceLocation getIdentifier(DyeColor c) { + return new ResourceLocation(PlayerCollarsMod.MOD_ID, c.getName() + "_paws"); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, @NotNull TooltipFlag context) { + super.appendHoverText(stack, world, tooltip, context); + if (!NbtUtil.getHeldItems(stack).isEmpty()) + tooltip.add(Component.translatable("item.playercollars.paws.slippery")); + if (!NbtUtil.getCanInteract(stack).isEmpty()) + tooltip.add(Component.translatable("item.playercollars.paws.interaction")); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/SpatulaItem.java b/src/main/java/org/jlortiz/playercollars/item/SpatulaItem.java new file mode 100644 index 00000000..611d1297 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/SpatulaItem.java @@ -0,0 +1,59 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotResult; + +public class SpatulaItem extends Item { + public SpatulaItem() { + super(new Item.Properties().stacksTo(1).durability(8)); + } + + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (user.isCrouching()) { + if (interactLivingEntity(user.getItemInHand(hand), user, user, hand).consumesAction()) + return InteractionResultHolder.success(user.getItemInHand(hand)); + } + return super.use(world, user, hand); + } + + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player user, LivingEntity entity, InteractionHand hand) { + int count = 0; + for (EquipmentSlot slot : EquipmentSlot.values()) { + if (!slot.isArmor()) continue; + ItemStack is = entity.getItemBySlot(slot); + if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BINDING_CURSE, is) > 0) { + count++; + entity.spawnAtLocation(is); + entity.setItemSlot(slot, ItemStack.EMPTY); + } + } + + final int[] extraCount = {0}; + CuriosApi.getCuriosInventory(entity).ifPresent(h -> { + for (SlotResult sr : h.findCurios(s -> EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BINDING_CURSE, s) > 0)) { + extraCount[0]++; + entity.spawnAtLocation(sr.stack()); + // Clear the slot via the slot context + h.setEquippedCurio(sr.slotContext().identifier(), sr.slotContext().index(), ItemStack.EMPTY); + } + }); + count += extraCount[0]; + + if (count == 0) return InteractionResult.PASS; + stack.hurtAndBreak(count, user, p -> p.broadcastBreakEvent(hand)); + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/org/jlortiz/playercollars/item/StampedDeedItem.java b/src/main/java/org/jlortiz/playercollars/item/StampedDeedItem.java new file mode 100644 index 00000000..8a975758 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/item/StampedDeedItem.java @@ -0,0 +1,38 @@ +package org.jlortiz.playercollars.item; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.List; + +public class StampedDeedItem extends Item { + public StampedDeedItem() { super(new Properties().stacksTo(1)); } + + @Override + public Component getName(ItemStack stack) { + OwnerComponent owner = NbtUtil.getDeedOwner(stack); + if (owner == null || owner.owned().isEmpty()) + return Component.translatable("item.playercollars.deed_of_ownership"); + return Component.translatable("item.playercollars.stamped_deed_of_ownership", owner.ownedName().get()); + } + + @Override + public ItemStack getCraftingRemainingItem(ItemStack stack) { return stack.copy(); } + @Override + public boolean hasCraftingRemainingItem(ItemStack stack) { return true; } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + super.appendHoverText(stack, world, tooltip, context); + OwnerComponent owner = NbtUtil.getDeedOwner(stack); + if (owner != null) + tooltip.add(Component.translatable("item.playercollars.collar.owner", owner.name()) + .withStyle(net.minecraft.ChatFormatting.GRAY)); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/LeashImpl.java b/src/main/java/org/jlortiz/playercollars/leash/LeashImpl.java index bbd7d569..f86b9c00 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/LeashImpl.java +++ b/src/main/java/org/jlortiz/playercollars/leash/LeashImpl.java @@ -2,8 +2,10 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; public interface LeashImpl { InteractionResult leashplayers$interact(Player plr, InteractionHand hand); + Entity leashplayers$getProxyLeashHolder(); } diff --git a/src/main/java/org/jlortiz/playercollars/leash/LeashProxyEntity.java b/src/main/java/org/jlortiz/playercollars/leash/LeashProxyEntity.java index 09c61341..d58d8a31 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/LeashProxyEntity.java +++ b/src/main/java/org/jlortiz/playercollars/leash/LeashProxyEntity.java @@ -1,120 +1,98 @@ package org.jlortiz.playercollars.leash; +import net.minecraft.nbt.CompoundTag; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerScoreboard; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.animal.Turtle; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Team; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Math; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Objects; -@ParametersAreNonnullByDefault public final class LeashProxyEntity extends Turtle { - private final LivingEntity target; - - private boolean proxyUpdate() { - if (proxyIsRemoved()) return false; - - if (target == null) return true; - if (target.level() != level() || !target.isAlive()) return true; - - Vec3 posActual = this.position(); - Vec3 posTarget = target.position().add(0.0D, 1.3D, -0.15D); - - if (!Objects.equals(posActual, posTarget)) { - setRot(0.0F, 0.0F); - setPos(posTarget.x(), posTarget.y(), posTarget.z()); - setBoundingBox(getDimensions(Pose.DYING).makeBoundingBox(posTarget)); - } - - tickLeash(); - - return false; - } - - @Override - public void tick() { - if (this.level().isClientSide) return; - if (proxyUpdate() && !proxyIsRemoved()) { - proxyRemove(); - } - } - - public boolean proxyIsRemoved() { - return this.isRemoved(); - } - - public void proxyRemove() { - super.remove(RemovalReason.DISCARDED); - } - - @Override - public void remove(RemovalReason reason) { - } - public static final String TEAM_NAME = "leashplayersimpl"; + private static final EntityDimensions DIMENSIONS = EntityDimensions.fixed(1e-6f, 1e-6f); + private final LivingEntity target; - public LeashProxyEntity(LivingEntity target) { + public LeashProxyEntity(@NotNull LivingEntity target) { super(EntityType.TURTLE, target.level()); - this.target = target; setHealth(1.0F); setInvulnerable(true); - setBaby(true); setInvisible(true); - noPhysics = true; + this.noPhysics = true; MinecraftServer server = getServer(); if (server != null) { ServerScoreboard scoreboard = server.getScoreboard(); - PlayerTeam team = scoreboard.getPlayerTeam(TEAM_NAME); - if (team == null) { - team = scoreboard.addPlayerTeam(TEAM_NAME); - } - if (team.getCollisionRule() != PlayerTeam.CollisionRule.NEVER) { - team.setCollisionRule(PlayerTeam.CollisionRule.NEVER); - } - + if (team == null) team = scoreboard.addPlayerTeam(TEAM_NAME); + if (team.getCollisionRule() != Team.CollisionRule.NEVER) + team.setCollisionRule(Team.CollisionRule.NEVER); scoreboard.addPlayerToTeam(getScoreboardName(), team); } + proxyUpdate(); } - @Override - public float getHealth() { - return 1.0F; - } - - @Override - public void dropLeash(boolean sendPacket, boolean dropItem) { - } - - @Override - public boolean canBeLeashed(Player player) { + private boolean proxyUpdate() { + if (proxyIsRemoved()) return false; + if (this.target == null) return true; + if (this.target.level() != level() || !this.target.isAlive()) return true; + + Vec3 posTarget = switch (this.target.getPose()) { + case CROUCHING -> new Vec3(0, 1.1, -0.15); + case SWIMMING -> Vec3.directionFromRotation(0, this.target.yBodyRot).scale(0.35).add(0, 0.2, -0.1); + case FALL_FLYING -> new Vec3(0, 1.3, -0.15) + .xRot(-(float) Math.toRadians(90 + this.target.getXRot())) + .yRot(-(float) Math.toRadians(this.target.yBodyRot)); + case SLEEPING -> this.target.getSleepingPos().map(sp -> + new Vec3(this.target.getDirection().step()).scale(-0.2).add(0, 0.1, -0.15)) + .orElse(new Vec3(0, 1.3, -0.15)); + default -> new Vec3(0, 1.3, -0.15); + }; + posTarget = posTarget.add(this.target.position()); + + if (!Objects.equals(position(), posTarget)) { + setYRot(0); setXRot(0); + setPos(posTarget.x, posTarget.y, posTarget.z); + setBoundingBox(DIMENSIONS.makeBoundingBox(this.target.position())); + } + // updateLeash() intentionally omitted - proxy handles its own leash state return false; } - @Override - protected void registerGoals() { - } + @NotNull + public LivingEntity getLeashTarget() { return this.target; } @Override - protected void doPush(Entity entity) { + public void tick() { + if (this.level().isClientSide) return; + if (proxyUpdate() && !proxyIsRemoved()) proxyRemove(); } - @Override - public void push(Entity entity) { - } + public boolean proxyIsRemoved() { return this.isRemoved(); } + public void proxyRemove() { super.remove(RemovalReason.DISCARDED); } + + @Override public void remove(RemovalReason reason) {} + @Override public float getHealth() { return 1.0F; } + @Override public void dropLeash(boolean sendPacket, boolean dropItem) {} + @Override protected void registerGoals() {} + @Override protected void doPush(Entity entity) {} + @Override public void push(Entity entity) {} @Override - public void playerTouch(Player player) { + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); + nbt.putString("Team", TEAM_NAME); } -} \ No newline at end of file +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinFireworkRocketItem.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinFireworkRocketItem.java new file mode 100644 index 00000000..635eb863 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinFireworkRocketItem.java @@ -0,0 +1,28 @@ +package org.jlortiz.playercollars.leash.mixin; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.FireworkRocketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jlortiz.playercollars.leash.LeashImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(FireworkRocketItem.class) +public class MixinFireworkRocketItem { + @Inject( + method = "use(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/InteractionResultHolder;", + at = @At("HEAD"), + cancellable = true + ) + private void onUse(Level world, Player user, InteractionHand hand, + CallbackInfoReturnable> cir) { + if (user instanceof LeashImpl leash && leash.leashplayers$getProxyLeashHolder() != null) { + cir.setReturnValue(InteractionResultHolder.fail(user.getItemInHand(hand))); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinLeashKnotEntity.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinLeashKnotEntity.java new file mode 100644 index 00000000..e7c40a92 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinLeashKnotEntity.java @@ -0,0 +1,35 @@ +package org.jlortiz.playercollars.leash.mixin; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LeashFenceKnotEntity.class) +public abstract class MixinLeashKnotEntity extends HangingEntity { + protected MixinLeashKnotEntity(EntityType entityType, Level world) { + super(entityType, world); + } + + @Inject( + method = "interact(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/InteractionResult;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/decoration/LeashFenceKnotEntity;discard()V"), + cancellable = true + ) + private void preventBreakKnot(Player player, InteractionHand hand, CallbackInfoReturnable cir) { + Level world = level(); + // noinspection ConstantValue + if (!world.isClientSide() && PlayerCollarsMod.blockLeashKnotBreak(world, player, + (LeashFenceKnotEntity) (Object) this)) { + cir.setReturnValue(InteractionResult.PASS); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinPlayerEntity.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinPlayerEntity.java index ee4770b8..d9ee68fe 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinPlayerEntity.java +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinPlayerEntity.java @@ -1,21 +1,36 @@ package org.jlortiz.playercollars.leash.mixin; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; +import org.jlortiz.playercollars.PlayerCollarsMod; import org.jlortiz.playercollars.leash.LeashImpl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(Player.class) +@Mixin(value = Player.class, priority = 500) public abstract class MixinPlayerEntity { - @Inject(method = "interactOn", at = @At("RETURN"), cancellable = true) - private void leashplayers$onInteract(Entity entity, InteractionHand hand, CallbackInfoReturnable info) { + @Inject(method = "createAttributes", at = @At("RETURN")) + private static void playercollars$addAttributes(CallbackInfoReturnable cir) { + cir.getReturnValue().add(PlayerCollarsMod.ATTR_LEASH_DISTANCE.get()); + } + + // In Mojmap 1.20.1, Yarn's Player.interact() = Player.interactOn() + @Inject( + method = "interactOn(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/InteractionResult;", + at = @At("RETURN"), + cancellable = true, + require = 0 + ) + private void leashplayers$onInteract(Entity entity, InteractionHand hand, + CallbackInfoReturnable info) { if (info.getReturnValue() != InteractionResult.PASS) return; + // noinspection ConstantValue if (((Object) this) instanceof ServerPlayer player && entity instanceof LeashImpl impl) { info.setReturnValue(impl.leashplayers$interact(player, hand)); info.cancel(); diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerPlayerEntity.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerPlayerEntity.java index 1d5dc8e5..15d90bfe 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerPlayerEntity.java +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerPlayerEntity.java @@ -1,203 +1,171 @@ package org.jlortiz.playercollars.leash.mixin; -import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.Mth; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; import org.jlortiz.playercollars.PlayerCollarsMod; -import org.jlortiz.playercollars.item.CollarItem; import org.jlortiz.playercollars.leash.LeashImpl; import org.jlortiz.playercollars.leash.LeashProxyEntity; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.SlotResult; +import java.util.Objects; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @Mixin(ServerPlayer.class) -public abstract class MixinServerPlayerEntity implements LeashImpl { - @Unique - private final ServerPlayer leashplayers$self = (ServerPlayer) (Object) this; - - @Unique - private LeashProxyEntity leashplayers$proxy; - @Unique - private Entity leashplayers$holder; - - @Unique - private int leashplayers$lastage; - - @Unique - private int leashplayer$loyalty; +public abstract class MixinServerPlayerEntity extends Player implements LeashImpl { + @Unique private static final double FIREWORK_SEARCH_RADIUS = 128.0; + @Shadow public ServerGamePacketListenerImpl connection; + @Unique private @Nullable LeashProxyEntity leashplayers$proxy; + @Unique private @Nullable Entity leashplayers$holder; + @Unique private int leashplayers$lastage; + @Unique private double leashplayer$loyalty; + + protected MixinServerPlayerEntity(Level world, BlockPos pos, float yaw, GameProfile gameProfile) { + super(world, pos, yaw, gameProfile); + } + @Shadow public abstract boolean hasDisconnected(); + @Shadow public abstract ServerLevel serverLevel(); @Unique private void leashplayers$update() { - if ( - leashplayers$holder != null && ( - !leashplayers$holder.isAlive() - || !leashplayers$self.isAlive() - || leashplayers$self.hasDisconnected() - || leashplayers$self.isVehicle() - ) - ) { + if (this.leashplayers$holder != null && (!this.leashplayers$holder.isAlive() || !isAlive() || hasDisconnected())) { leashplayers$detach(); leashplayers$drop(); } - - if (leashplayers$proxy != null) { - if (leashplayers$proxy.proxyIsRemoved()) { - leashplayers$proxy = null; - } - else { - Entity holderActual = leashplayers$holder; - Entity holderTarget = leashplayers$proxy.getLeashHolder(); - + if (this.leashplayers$proxy != null) { + if (this.leashplayers$proxy.proxyIsRemoved()) { + this.leashplayers$proxy = null; + } else { + Entity holderActual = this.leashplayers$holder; + Entity holderTarget = this.leashplayers$proxy.getLeashHolder(); if (holderTarget == null && holderActual != null) { - leashplayers$detach(); - leashplayers$drop(); - } - else if (holderTarget != holderActual) { + leashplayers$detach(); leashplayers$drop(); + } else if (holderTarget != holderActual) { leashplayers$attach(holderTarget); } } } - leashplayers$apply(); } @Unique private void leashplayers$apply() { - ServerPlayer player = leashplayers$self; - Entity holder = leashplayers$holder; + Entity holder = this.leashplayers$holder; if (holder == null) return; - if (holder.level() != player.level()) return; - - float distance = player.distanceTo(holder); - if (distance < 4 - leashplayer$loyalty) { - return; + if (holder.level() != level()) { leashplayers$detach(); leashplayers$drop(); return; } + + InteractionResult result; + if (Math.abs(getY() - holder.getY()) > 6 + this.leashplayer$loyalty) { + result = InteractionResult.FAIL; + } else { + Vec3 pos = new Vec3(holder.getX(), getY(), holder.getZ()); + result = PlayerCollarsMod.pullPlayerTowards((ServerPlayer)(Object)this, pos, + this.leashplayer$loyalty, this.leashplayer$loyalty + 6, + x -> Math.min(0.15 * (x - this.leashplayer$loyalty), 0.375) / x); } - if (distance > 10f - leashplayer$loyalty) { - leashplayers$detach(); - leashplayers$drop(); - return; - } - - double dx = (holder.getX() - player.getX()) / (double) distance; - double dy = (holder.getY() - player.getY()) / (double) distance; - double dz = (holder.getZ() - player.getZ()) / (double) distance; - final double factor = 0.4d + 0.1d * leashplayer$loyalty; - - player.push( - Math.copySign(dx * dx * factor, dx), - Math.copySign(dy * dy * factor, dy), - Math.copySign(dz * dz * factor, dz) - ); - player.connection.send(new ClientboundSetEntityMotionPacket(player)); - player.hasImpulse = false; + // noinspection ConstantValue + if (result == InteractionResult.FAIL) { + if (serverLevel().getGameRules().getBoolean(PlayerCollarsMod.PLAYER_LEASHES_BREAK_RULE)) { + leashplayers$detach(); leashplayers$drop(); + } else { + this.setDeltaMovement(Vec3.ZERO); + Objects.requireNonNull(this.leashplayers$proxy) + .moveTo(holder.blockPosition(), this.leashplayers$proxy.getYRot(), + this.leashplayers$proxy.getXRot()); + this.connection.teleport(holder.getX(), holder.getY(), holder.getZ(), getYRot(), getXRot()); + } + } } @Unique private void leashplayers$attach(Entity entity) { - leashplayers$holder = entity; - - if (leashplayers$proxy == null) { - leashplayers$proxy = new LeashProxyEntity(leashplayers$self); - leashplayers$proxy.setPos(leashplayers$self.getX(), leashplayers$self.getY(), leashplayers$self.getZ()); - leashplayers$self.level().addFreshEntity(leashplayers$proxy); - } - leashplayers$proxy.setLeashedTo(leashplayers$holder, true); - - if (leashplayers$self.isVehicle()) { - leashplayers$self.stopRiding(); + this.leashplayers$holder = entity; + if (this.leashplayers$proxy == null) { + this.leashplayers$proxy = new LeashProxyEntity(this); + level().addFreshEntity(this.leashplayers$proxy); } - - leashplayers$lastage = leashplayers$self.tickCount; + this.leashplayers$proxy.setLeashedTo(this.leashplayers$holder, true); + if (isPassenger() && serverLevel().getGameRules().getBoolean(PlayerCollarsMod.PLAYER_LEASHES_BREAK_RULE)) + stopRiding(); + this.leashplayers$lastage = this.tickCount; } @Unique private void leashplayers$detach() { - leashplayers$holder = null; - - if (leashplayers$proxy != null) { - if (leashplayers$proxy.isAlive() || !leashplayers$proxy.proxyIsRemoved()) { - leashplayers$proxy.proxyRemove(); - } - leashplayers$proxy = null; + this.leashplayers$holder = null; + if (this.leashplayers$proxy != null) { + if (this.leashplayers$proxy.isAlive() || !this.leashplayers$proxy.proxyIsRemoved()) + this.leashplayers$proxy.proxyRemove(); + this.leashplayers$proxy = null; } } @Unique - private void leashplayers$drop() { - leashplayers$self.drop(new ItemStack(Items.LEAD), false, true); - } + private void leashplayers$drop() { drop(new ItemStack(Items.LEAD), false); } @Inject(method = "tick()V", at = @At("TAIL")) - private void leashplayers$tick(CallbackInfo info) { - leashplayers$update(); + private void leashplayers$tick(CallbackInfo info) { leashplayers$update(); } + + @Inject(method = "startRiding(Lnet/minecraft/world/entity/Entity;Z)Z", at = @At("HEAD"), cancellable = true) + private void leashplayers$startRiding(Entity entity, boolean force, CallbackInfoReturnable cir) { + boolean isLeashed = leashplayers$getProxyLeashHolder() != null; + boolean disallowMount = !serverLevel().getGameRules().getBoolean(PlayerCollarsMod.LEASHED_PLAYERS_RIDE_ENTITIES); + if (isLeashed && disallowMount) { + sendSystemMessage(Component.translatable("message.playercollars.no_ride_entity")); + cir.cancel(); + } + } + + @Override + public Entity leashplayers$getProxyLeashHolder() { + return this.leashplayers$proxy == null ? null : this.leashplayers$proxy.getLeashHolder(); } @Override public InteractionResult leashplayers$interact(Player player, InteractionHand hand) { ItemStack stack = player.getItemInHand(hand); - if (stack.getItem() == Items.LEAD && leashplayers$holder == null) { + if (stack.is(Items.LEAD) && this.leashplayers$holder == null) { AtomicBoolean found = new AtomicBoolean(false); - CuriosApi.getCuriosInventory((Player) (Object) this).ifPresent((handler) -> handler.getStacksHandler("necklace").ifPresent((slot) -> { - ItemStack is = PlayerCollarsMod.filterStacksByOwner(slot.getStacks(), player.getUUID()); - if (is == null) { - is = PlayerCollarsMod.filterStacksByOwner(slot.getCosmeticStacks(), player.getUUID()); - } - if (is != null) { + CuriosApi.getCuriosInventory(this).ifPresent(h -> { + var collars = h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)); + if (PlayerCollarsMod.filterStacksByOwner(collars, player.getUUID(), getUUID()) != null) { found.set(true); - leashplayer$loyalty = Mth.clamp(PlayerCollarsMod.COLLAR_ITEM.get().getEnchantmentLevel(is, Enchantments.LOYALTY), 0, 2); + this.leashplayer$loyalty = getAttributeValue(PlayerCollarsMod.ATTR_LEASH_DISTANCE.get()); } - })); + }); if (!found.get()) return InteractionResult.PASS; - if (!player.isCreative()) { - stack.shrink(1); - } + if (!player.isCreative()) stack.shrink(1); leashplayers$attach(player); return InteractionResult.SUCCESS; } - - if (leashplayers$holder == player && leashplayers$lastage + 20 < leashplayers$self.tickCount) { - if (!player.isCreative()) { - leashplayers$drop(); - } + if (this.leashplayers$holder == player && this.leashplayers$lastage + 20 < this.tickCount) { + if (!player.isCreative()) leashplayers$drop(); leashplayers$detach(); return InteractionResult.SUCCESS; } - return InteractionResult.PASS; } - - @Inject(at=@At("TAIL"), method="hurt") - private void checkCollarThorns(DamageSource p_9037_, float p_9038_, CallbackInfoReturnable cir) { - if (p_9037_.getEntity() != null) { - LivingEntity self = ((LivingEntity) (Object) this); - CollarItem item = PlayerCollarsMod.COLLAR_ITEM.get(); - CuriosApi.getCuriosInventory(self).ifPresent((handler) -> { - for (SlotResult sr : handler.findCurios("necklace")) { - int l = item.getEnchantmentLevel(sr.stack(), Enchantments.THORNS); - if (l > 0) { - Enchantments.THORNS.doPostHurt(self, p_9037_.getEntity(), l); - } - } - }); - } - } -} \ No newline at end of file +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerWorld.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerWorld.java index 8dcbc9c9..7f51455b 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerWorld.java +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinServerWorld.java @@ -10,11 +10,11 @@ @Mixin(ServerLevel.class) public abstract class MixinServerWorld { - @Inject(method = "shouldDiscardEntity", at = @At("HEAD"), cancellable = true, require = 0) - private void leashplayers$onShouldCancelSpawn(Entity entity, CallbackInfoReturnable info) { + @Inject(method = "addEntity", at = @At("HEAD"), cancellable = true, require = 0) + private void leashplayers$onAddEntity(Entity entity, CallbackInfoReturnable info) { + // ServerLevel.addEntity returns boolean; just ensure proxy always gets added if (entity instanceof LeashProxyEntity) { - info.setReturnValue(false); - info.cancel(); + // Don't cancel — we *want* the proxy to spawn } } -} \ No newline at end of file +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTridentItem.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTridentItem.java new file mode 100644 index 00000000..5e936836 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTridentItem.java @@ -0,0 +1,24 @@ +package org.jlortiz.playercollars.leash.mixin; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TridentItem; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import org.jlortiz.playercollars.leash.LeashImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TridentItem.class) +public class MixinTridentItem { + @Inject(method = "releaseUsing", at = @At("HEAD"), cancellable = true) + private void onStoppedUsing(ItemStack stack, Level world, LivingEntity user, int remainingUseTicks, CallbackInfo ci) { + if (!(user instanceof Player player)) return; + if (player instanceof LeashImpl leash && leash.leashplayers$getProxyLeashHolder() != null) { + if (EnchantmentHelper.getRiptide(stack) > 0) ci.cancel(); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTurtleEntity.java b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTurtleEntity.java index 9ef9b368..634ae7a5 100644 --- a/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTurtleEntity.java +++ b/src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTurtleEntity.java @@ -1,8 +1,12 @@ package org.jlortiz.playercollars.leash.mixin; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.Turtle; -import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.level.Level; +import net.minecraft.world.scores.Team; +import net.minecraft.nbt.CompoundTag; import org.jlortiz.playercollars.leash.LeashProxyEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -12,18 +16,20 @@ import java.util.Objects; @Mixin(Turtle.class) -public abstract class MixinTurtleEntity { - @Inject(method = "readAdditionalSaveData", at = @At("RETURN")) - private void leashplayers$onReadCustomDataFromNbt(CallbackInfo info) { - Turtle self = (Turtle) (Object) this; +public abstract class MixinTurtleEntity extends Animal { + protected MixinTurtleEntity(EntityType entityType, Level world) { + super(entityType, world); + } - MinecraftServer server = self.getServer(); + @Inject(method = "readAdditionalSaveData", at = @At("RETURN")) + private void leashplayers$onReadCustomData(CompoundTag nbt, CallbackInfo info) { + MinecraftServer server = getServer(); if (server == null) return; - - PlayerTeam team = server.getScoreboard().getPlayerTeam(self.getScoreboardName()); + Team team = server.getScoreboard().getPlayerTeam(getScoreboardName()); if (team != null && Objects.equals(team.getName(), LeashProxyEntity.TEAM_NAME)) { - self.setInvulnerable(false); - self.setHealth(0.0F); + dropLeash(true, true); + setInvulnerable(false); + kill(); } } -} \ No newline at end of file +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/BoneItemMixin.java b/src/main/java/org/jlortiz/playercollars/mixin/BoneItemMixin.java new file mode 100644 index 00000000..96bb516b --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/BoneItemMixin.java @@ -0,0 +1,24 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import org.jlortiz.playercollars.item.DummyBoneItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; + +@Mixin(Items.class) +public class BoneItemMixin { + @Redirect( + method = "", + at = @At(value = "NEW", target = "net/minecraft/world/item/Item"), + slice = @Slice( + from = @At(value = "CONSTANT", args = "stringValue=bone"), + to = @At(value = "CONSTANT", args = "stringValue=sugar") + ) + ) + private static Item makeEquippableBone(Item.Properties settings) { + return new DummyBoneItem(settings); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/org/jlortiz/playercollars/mixin/ClientPlayerInteractionManagerMixin.java new file mode 100644 index 00000000..d4fbb8e9 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/ClientPlayerInteractionManagerMixin.java @@ -0,0 +1,53 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.PawsItem; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import top.theillusivec4.curios.api.CuriosApi; + +@Mixin(MultiPlayerGameMode.class) +public class ClientPlayerInteractionManagerMixin { + @Shadow @Final private Minecraft minecraft; + + @Unique + private static boolean shouldPawsBlock(LivingEntity player, BlockState block) { + return CuriosApi.getCuriosInventory(player) + .map(h -> h.findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG))) + .map(ls -> ls.stream().anyMatch(sr -> PawsItem.shouldPreventBlockInteraction(sr.stack(), block))) + .orElse(false); + } + + @Inject(method = "useItemOn", at = @At("HEAD"), cancellable = true) + private void playercollars$cancelPawInteractions(LocalPlayer player, InteractionHand hand, + BlockHitResult hitResult, + CallbackInfoReturnable cir) { + if (player.isSpectator()) return; + assert this.minecraft.level != null; + BlockState block = this.minecraft.level.getBlockState(hitResult.getBlockPos()); + if (shouldPawsBlock(player, block)) cir.setReturnValue(InteractionResult.PASS); + } + + @Inject(method = "destroyBlock", at = @At("HEAD"), cancellable = true) + private void playercollars$cancelPawBreak(BlockPos pos, CallbackInfoReturnable cir) { + assert this.minecraft.level != null; + BlockState block = this.minecraft.level.getBlockState(pos); + if (shouldPawsBlock(this.minecraft.player, block)) cir.setReturnValue(false); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/LivingEntityMixin.java b/src/main/java/org/jlortiz/playercollars/mixin/LivingEntityMixin.java new file mode 100644 index 00000000..ee28653a --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/LivingEntityMixin.java @@ -0,0 +1,34 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import org.jlortiz.playercollars.block.DogBedBlock; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LivingEntity.class) +public abstract class LivingEntityMixin extends Entity { + protected LivingEntityMixin(EntityType type, Level world) { + super(type, world); + } + + @Inject(method = "setPosToBed", at = @At("HEAD"), cancellable = true, require = 0) + private void correctDogBedHeight(BlockPos pos, CallbackInfo ci) { + BlockState state = level().getBlockState(pos); + if (state.getBlock() instanceof DogBedBlock) { + Vec3 vec = Vec3.atCenterOf(pos); + Vector3f off = state.getValue(net.minecraft.world.level.block.BedBlock.FACING) + .step().div(10); + setPos(vec.x + off.x, vec.y - 0.15, vec.z + off.z); + ci.cancel(); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/MixinBindingCurseEnchantment.java b/src/main/java/org/jlortiz/playercollars/mixin/MixinBindingCurseEnchantment.java new file mode 100644 index 00000000..58c5c932 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/MixinBindingCurseEnchantment.java @@ -0,0 +1,20 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.BindingCurseEnchantment; +import net.minecraft.world.item.enchantment.Enchantment; +import org.jlortiz.playercollars.item.CollarItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BindingCurseEnchantment.class) +public class MixinBindingCurseEnchantment { + @Inject(method = "canEnchant", at = @At("RETURN"), cancellable = true) + private void canEnchant(ItemStack stack, CallbackInfoReturnable cir) { + if (!cir.getReturnValueZ()) { + cir.setReturnValue(stack.getItem() instanceof CollarItem); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantment.java b/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantment.java new file mode 100644 index 00000000..8db7eae7 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantment.java @@ -0,0 +1,19 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Enchantment.class) +public class MixinEnchantment { + @Inject(method = "canEnchant", at = @At("RETURN"), cancellable = true) + private void canEnchant(ItemStack stack, CallbackInfoReturnable cir) { + if (!cir.getReturnValueZ()) { + cir.setReturnValue(PlayerCollarsMod.isAcceptableEnchant(stack.getItem(), (Enchantment)(Object)this)); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantmentHelper.java b/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantmentHelper.java new file mode 100644 index 00000000..d2f0ff0e --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantmentHelper.java @@ -0,0 +1,40 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.List; +import java.util.Map; + +@Mixin(EnchantmentHelper.class) +public class MixinEnchantmentHelper { + + // Apply collar enchantment effects (e.g. Thorns) when the wearer is hurt. + // Injecting AFTER the normal armor iteration so collars get the same treatment. + @Inject( + method = "doPostHurtEffects", + at = @At("TAIL"), + require = 0 + ) + private static void applyCollarEnchantments(LivingEntity user, Entity attacker, CallbackInfo ci) { + CuriosApi.getCuriosInventory(user).ifPresent(h -> { + List stacks = h.findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)) + .stream().map(sr -> sr.stack()).toList(); + for (ItemStack stack : stacks) { + Map enchants = EnchantmentHelper.getEnchantments(stack); + for (Map.Entry entry : enchants.entrySet()) { + entry.getKey().doPostHurt(user, attacker, entry.getValue()); + } + } + }); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/PlayerEntityMixin.java b/src/main/java/org/jlortiz/playercollars/mixin/PlayerEntityMixin.java new file mode 100644 index 00000000..4d37bf7c --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/PlayerEntityMixin.java @@ -0,0 +1,128 @@ +package org.jlortiz.playercollars.mixin; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TieredItem; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.TierSortingRegistry; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.item.PawsItem; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import top.theillusivec4.curios.api.CuriosApi; + +@Mixin(Player.class) +public abstract class PlayerEntityMixin extends LivingEntity { + @Shadow @Final public Inventory inventory; + + protected PlayerEntityMixin(EntityType entityType, Level world) { + super(entityType, world); + } + + @Inject(method = "createAttributes", at = @At("RETURN")) + private static void playercollars$addAttributes(CallbackInfoReturnable cir) { + cir.getReturnValue() + .add(PlayerCollarsMod.ATTR_LEASH_DISTANCE.get()) + .add(PlayerCollarsMod.ATTR_CLICKER_DISTANCE.get()); + } + + @Shadow public abstract @Nullable ItemEntity drop(ItemStack stack, boolean retainOwnership); + + // Redirect block-breaking speed through paws check + @Redirect( + method = "getDestroySpeed", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Inventory;getDestroySpeed(Lnet/minecraft/world/level/block/state/BlockState;)F"), + require = 0 + ) + private float getDestroySpeed(Inventory instance, BlockState block) { + var hasPaws = CuriosApi.getCuriosInventory(this) + .map(h -> !h.findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG)).isEmpty()) + .orElse(false); + + if (hasPaws) { + if (block.is(net.minecraft.tags.BlockTags.MINEABLE_WITH_SHOVEL)) + return Tiers.IRON.getSpeed(); + + float originalSpeed = instance.getDestroySpeed(block); + // noinspection FloatingPointEquality + if (originalSpeed == 1.0f) return 1.0f; + return (originalSpeed - 1) * 0.125f + 1; + } + return instance.getDestroySpeed(block); + } + + // Reduce attack damage while wearing paws + @Redirect( + method = "attack", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Player;getAttributeValue(Lnet/minecraft/world/entity/ai/attributes/Attribute;)D", + ordinal = 0), + require = 0 + ) + private double getAttackDamage(Player instance, + net.minecraft.world.entity.ai.attributes.Attribute attribute) { + double ret = instance.getAttributeValue(attribute); + return CuriosApi.getCuriosInventory(this) + .map(h -> !h.findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG)).isEmpty()) + .filter(b -> b) + .map(b -> (ret - 1) * 0.75 + 1) + .orElse(ret); + } + + // Drop slippery items from paws each tick + @Inject(method = "aiStep", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Inventory;tick()V", + shift = At.Shift.AFTER)) + private void playercollars$dropPawItems(CallbackInfo ci) { + CuriosApi.getCuriosInventory(this).ifPresent(h -> { + for (var sr : h.findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG))) { + ItemStack pawsStack = sr.stack(); + if (PawsItem.shouldDrop(pawsStack, this.inventory.getSelected())) { + ItemStack stack = this.inventory.removeItem(this.inventory.selected, 1); + if (!stack.isEmpty()) drop(stack, true); + } + ItemStack offhand = this.inventory.getItem(40); + if (PawsItem.shouldDrop(pawsStack, offhand)) { + ItemStack stack = this.inventory.removeItem(40, offhand.getCount()); + if (!stack.isEmpty()) drop(stack, true); + } + } + }); + } + + // Force crawl pose when wearing foot paws + @Redirect( + method = "updatePlayerPose", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Player;setPose(Lnet/minecraft/world/entity/Pose;)V") + ) + private void playercollars$forceCrawl(Player instance, Pose pose) { + Pose updated = pose; + if (!instance.getAbilities().flying && (pose == Pose.CROUCHING || pose == Pose.STANDING)) { + boolean hasFootPaws = CuriosApi.getCuriosInventory(this) + .map(h -> !h.findCurios(s -> s.is(PlayerCollarsMod.FOOT_PAWS_TAG)).isEmpty()) + .orElse(false); + if (hasFootPaws) updated = Pose.SWIMMING; + } + instance.setPose(updated); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/mixin/PlayerRendererMixin.java b/src/main/java/org/jlortiz/playercollars/mixin/PlayerRendererMixin.java new file mode 100644 index 00000000..786953f8 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/mixin/PlayerRendererMixin.java @@ -0,0 +1,51 @@ +package org.jlortiz.playercollars.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.client.PawRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import top.theillusivec4.curios.api.CuriosApi; + +@Mixin(PlayerRenderer.class) +public class PlayerRendererMixin { + + @Inject( + method = "renderRightHand(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/player/AbstractClientPlayer;)V", + at = @At("TAIL"), + require = 0 + ) + private void playercollars$renderRightGlove(PoseStack matrices, MultiBufferSource buffers, + int light, AbstractClientPlayer player, + CallbackInfo ci) { + renderPawForArm((PlayerRenderer)(Object)this, matrices, buffers, light, player, false); + } + + @Inject( + method = "renderLeftHand(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/player/AbstractClientPlayer;)V", + at = @At("TAIL"), + require = 0 + ) + private void playercollars$renderLeftGlove(PoseStack matrices, MultiBufferSource buffers, + int light, AbstractClientPlayer player, + CallbackInfo ci) { + renderPawForArm((PlayerRenderer)(Object)this, matrices, buffers, light, player, true); + } + + @SuppressWarnings("unchecked") + private static void renderPawForArm(PlayerRenderer renderer, PoseStack matrices, + MultiBufferSource buffers, int light, + AbstractClientPlayer player, boolean left) { + PlayerModel model = (PlayerModel) renderer.getModel(); + CuriosApi.getCuriosInventory(player).ifPresent(h -> + h.findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG)).forEach(sr -> + PawRenderer.renderOnFirstPerson(sr.stack(), matrices, model, + player.level(), buffers, light, left))); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/ModPackets.java b/src/main/java/org/jlortiz/playercollars/network/ModPackets.java new file mode 100644 index 00000000..d2704edf --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/ModPackets.java @@ -0,0 +1,37 @@ +package org.jlortiz.playercollars.network; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; +import org.jlortiz.playercollars.PlayerCollarsMod; + +public class ModPackets { + private static final String PROTOCOL = "1"; + public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( + new ResourceLocation(PlayerCollarsMod.MOD_ID, "main"), + () -> PROTOCOL, + PROTOCOL::equals, + PROTOCOL::equals + ); + + public static void register() { + int id = 0; + CHANNEL.registerMessage(id++, PacketUpdateCollar.class, + PacketUpdateCollar::encode, PacketUpdateCollar::decode, + PacketUpdateCollar::handle, + java.util.Optional.of(NetworkDirection.PLAY_TO_SERVER)); + CHANNEL.registerMessage(id++, PacketStampDeed.class, + PacketStampDeed::encode, PacketStampDeed::decode, + PacketStampDeed::handle, + java.util.Optional.of(NetworkDirection.PLAY_TO_SERVER)); + CHANNEL.registerMessage(id++, PacketOpenPawsConfig.class, + PacketOpenPawsConfig::encode, PacketOpenPawsConfig::decode, + PacketOpenPawsConfig::handle, + java.util.Optional.of(NetworkDirection.PLAY_TO_SERVER)); + CHANNEL.registerMessage(id++, PacketLookAtLerped.class, + PacketLookAtLerped::encode, PacketLookAtLerped::decode, + PacketLookAtLerped::handle, + java.util.Optional.of(NetworkDirection.PLAY_TO_CLIENT)); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/PacketLookAtLerped.java b/src/main/java/org/jlortiz/playercollars/network/PacketLookAtLerped.java new file mode 100644 index 00000000..0a1372b2 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/PacketLookAtLerped.java @@ -0,0 +1,33 @@ +package org.jlortiz.playercollars.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.NetworkEvent; +import org.jlortiz.playercollars.client.RotationLerpHandler; + +import java.util.function.Supplier; + +public record PacketLookAtLerped(double x, double y, double z) { + + public PacketLookAtLerped(Entity entity) { + this(entity.getX(), entity.getEyeY(), entity.getZ()); + } + + public static PacketLookAtLerped decode(FriendlyByteBuf buf) { + return new PacketLookAtLerped(buf.readDouble(), buf.readDouble(), buf.readDouble()); + } + + public static void encode(PacketLookAtLerped packet, FriendlyByteBuf buf) { + buf.writeDouble(packet.x).writeDouble(packet.y).writeDouble(packet.z); + } + + public static void handle(PacketLookAtLerped packet, Supplier ctx) { + ctx.get().enqueueWork(() -> RotationLerpHandler.beginClickTurn(packet.vec())); + ctx.get().setPacketHandled(true); + } + + public Vec3 vec() { + return new Vec3(this.x, this.y, this.z); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/PacketOpenPawsConfig.java b/src/main/java/org/jlortiz/playercollars/network/PacketOpenPawsConfig.java new file mode 100644 index 00000000..675b8443 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/PacketOpenPawsConfig.java @@ -0,0 +1,83 @@ +package org.jlortiz.playercollars.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkHooks; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; +import top.theillusivec4.curios.api.CuriosApi; + +import java.util.UUID; +import java.util.function.Supplier; + +public record PacketOpenPawsConfig(UUID pawHolder, boolean heldItems) { + + public static PacketOpenPawsConfig decode(FriendlyByteBuf buf) { + return new PacketOpenPawsConfig(buf.readUUID(), buf.readBoolean()); + } + + public static void encode(PacketOpenPawsConfig packet, FriendlyByteBuf buf) { + buf.writeUUID(packet.pawHolder); + buf.writeBoolean(packet.heldItems); + } + + public static void handle(PacketOpenPawsConfig packet, Supplier ctx) { + ctx.get().enqueueWork(() -> { + ServerPlayer player = ctx.get().getSender(); + if (player == null) return; + Player pet = player.serverLevel().getPlayerByUUID(packet.pawHolder); + if (pet == null) return; + + var curiosOpt = CuriosApi.getCuriosInventory(pet); + if (!curiosOpt.isPresent()) return; + + var collarResults = curiosOpt.resolve().orElseThrow().findCurios(s -> s.is(PlayerCollarsMod.COLLAR_TAG)); + ItemStack collarStack = PlayerCollarsMod.filterStacksByOwner(collarResults, player.getUUID(), packet.pawHolder); + if (collarStack == null) { + player.displayClientMessage(Component.translatable("item.playercollars.paw_configurator.no_set_non_owner") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return; + } + + var pawsResults = curiosOpt.resolve().orElseThrow().findCurios(s -> s.is(PlayerCollarsMod.PAWS_TAG)); + if (pawsResults.isEmpty()) { + player.displayClientMessage(Component.translatable("item.playercollars.paw_configurator.no_paws") + .withStyle(net.minecraft.ChatFormatting.RED), true); + return; + } + + ItemStack[] pawsStacks = pawsResults.stream().map(sr -> sr.stack()).toArray(ItemStack[]::new); + + NetworkHooks.openScreen(player, new MenuProvider() { + @Override + public Component getDisplayName() { + return Component.translatable(packet.heldItems + ? "gui.playercollars.paw_configurator.item.title" + : "gui.playercollars.paw_configurator.block.title", pet.getName()); + } + + @Override + public AbstractContainerMenu createMenu(int syncId, Inventory inv, Player p) { + var sc = packet.heldItems + ? new PawsConfigScreenHandler.PawsItemConfigScreenHandler(syncId, inv, NbtUtil.getHeldItems(pawsStacks[0])) + : new PawsConfigScreenHandler.PawsBlockConfigScreenHandler(syncId, inv, NbtUtil.getCanInteract(pawsStacks[0])); + sc.setPawsStack(pawsStacks); + return sc; + } + }, extraBuf -> { + if (packet.heldItems) + NbtUtil.writeHeldItems(extraBuf, NbtUtil.getHeldItems(pawsStacks[0])); + else + NbtUtil.writeCanInteract(extraBuf, NbtUtil.getCanInteract(pawsStacks[0])); + }); + }); + ctx.get().setPacketHandled(true); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/PacketStampDeed.java b/src/main/java/org/jlortiz/playercollars/network/PacketStampDeed.java new file mode 100644 index 00000000..7145e401 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/PacketStampDeed.java @@ -0,0 +1,37 @@ +package org.jlortiz.playercollars.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.Optional; +import java.util.function.Supplier; + +public final class PacketStampDeed { + public static final PacketStampDeed INSTANCE = new PacketStampDeed(); + + public static PacketStampDeed decode(FriendlyByteBuf buf) { return INSTANCE; } + public static void encode(PacketStampDeed packet, FriendlyByteBuf buf) {} + + public static void handle(PacketStampDeed packet, Supplier ctx) { + ctx.get().enqueueWork(() -> { + var player = ctx.get().getSender(); + if (player == null) return; + ItemStack is = player.getMainHandItem(); + if (!is.isEmpty() && is.is(PlayerCollarsMod.DEED_OF_OWNERSHIP.get())) { + var owner = NbtUtil.getDeedOwner(is); + if (owner == null) return; + owner = new OwnerComponent(owner.uuid(), owner.name(), + Optional.of(player.getUUID()), Optional.of(player.getName().getString())); + is = PlayerCollarsMod.DEED_OF_OWNERSHIP_STAMPED.get().getDefaultInstance(); + NbtUtil.setDeedOwner(is, owner); + player.setItemSlot(EquipmentSlot.MAINHAND, is); + } + }); + ctx.get().setPacketHandled(true); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/PacketUpdateCollar.java b/src/main/java/org/jlortiz/playercollars/network/PacketUpdateCollar.java new file mode 100644 index 00000000..94f52e7a --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/PacketUpdateCollar.java @@ -0,0 +1,48 @@ +package org.jlortiz.playercollars.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.item.CollarItem; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.function.Supplier; + +public record PacketUpdateCollar(OwnerState os, int color, int tagColor) { + + public PacketUpdateCollar(ItemStack is, OwnerState os) { + this(os, NbtUtil.getColor(is, 0xFFFFFF), + is.getItem() instanceof CollarItem ci ? ci.getTagColor(is) : 0); + } + + public static PacketUpdateCollar decode(FriendlyByteBuf buf) { + return new PacketUpdateCollar(buf.readEnum(OwnerState.class), buf.readInt(), buf.readInt()); + } + + public static void encode(PacketUpdateCollar packet, FriendlyByteBuf buf) { + buf.writeEnum(packet.os); + buf.writeInt(packet.color); + buf.writeInt(packet.tagColor); + } + + public static void handle(PacketUpdateCollar packet, Supplier ctx) { + ctx.get().enqueueWork(() -> { + var player = ctx.get().getSender(); + if (player == null) return; + ItemStack is = player.getMainHandItem(); + if (!is.isEmpty() && is.getItem() instanceof CollarItem) { + NbtUtil.setColor(is, packet.color); + NbtUtil.setTagColor(is, packet.tagColor); + if (packet.os == OwnerState.DEL) { + NbtUtil.setDeedOwner(is, null); + } else if (packet.os == OwnerState.ADD) { + NbtUtil.setDeedOwner(is, new OwnerComponent(player.getUUID(), player.getName().getString())); + } + } + }); + ctx.get().setPacketHandled(true); + } + + public enum OwnerState { NOP, DEL, ADD } +} diff --git a/src/main/java/org/jlortiz/playercollars/network/PawsConfigScreenHandler.java b/src/main/java/org/jlortiz/playercollars/network/PawsConfigScreenHandler.java new file mode 100644 index 00000000..28b7475d --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/network/PawsConfigScreenHandler.java @@ -0,0 +1,190 @@ +package org.jlortiz.playercollars.network; + +import com.mojang.datafixers.util.Either; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.jlortiz.playercollars.util.NbtUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +public abstract class PawsConfigScreenHandler extends AbstractContainerMenu { + private final Container inventory; + public final List, ResourceKey>> data; + protected final Level world; + public List, ResourceKey>> listToDisplay; + protected ItemStack[] pawsStacks; + + protected PawsConfigScreenHandler(MenuType> type, int syncId, + Inventory playerInventory, List, ResourceKey>> data) { + super(type, syncId); + this.inventory = new SimpleContainer(1) { + @Override + public void setChanged() { + super.setChanged(); + slotsChanged(this); + } + }; + this.data = (data == null) ? new ArrayList<>() : new ArrayList<>(data); + this.listToDisplay = this.data; + this.world = playerInventory.player.level(); + this.inventory.startOpen(playerInventory.player); + + this.addSlot(new Slot(this.inventory, 0, 175, 108) { + @Override + public boolean mayPickup(Player player) { return false; } + + @Override + public ItemStack remove(int amount) { + getSlot(0).set(ItemStack.EMPTY); + return ItemStack.EMPTY; + } + + @Override + public void set(ItemStack stack) { + inventory.setItem(0, stack.copyWithCount(1)); + setChanged(); + } + }); + + for (int j = 0; j < 3; j++) + for (int k = 0; k < 9; k++) + this.addSlot(new Slot(playerInventory, k + j * 9 + 9, 7 + k * 18, 140 + j * 18)); + + for (int j = 0; j < 9; j++) + this.addSlot(new Slot(playerInventory, j, 7 + j * 18, 198)); + } + + @Override + public ItemStack quickMoveStack(Player player, int slot) { + this.inventory.setItem(0, getSlot(slot).getItem().copyWithCount(1)); + return ItemStack.EMPTY; + } + + @Override + public void clicked(int slotIndex, int button, ClickType actionType, Player player) { + if (slotIndex == 0) { + ItemStack is = getCarried(); + if (is == null) is = ItemStack.EMPTY; + this.inventory.setItem(0, is.copyWithCount(1)); + return; + } + super.clicked(slotIndex, button, actionType, player); + } + + @Override + public boolean clickMenuButton(Player player, int id) { + if (id < 0) return false; + if (this.inventory.getItem(0).isEmpty()) { + if (id >= this.data.size()) return false; + this.data.remove(id); + } else { + if (id >= this.listToDisplay.size()) return false; + this.data.add(this.listToDisplay.get(id)); + } + return true; + } + + public void setPawsStack(ItemStack[] is) { + if (this.pawsStacks == null) this.pawsStacks = is; + } + + @Override + public boolean stillValid(Player player) { return true; } + + @Override + public void slotsChanged(Container container) { + super.slotsChanged(container); + ItemStack is = container.getItem(0); + this.listToDisplay = is.isEmpty() ? this.data : genForItem(is.getItem()); + } + + protected abstract List, ResourceKey>> genForItem(Item item); + + public abstract net.minecraft.resources.ResourceKey> getRegistryKey(); + + public static class PawsBlockConfigScreenHandler extends PawsConfigScreenHandler { + public PawsBlockConfigScreenHandler(int syncId, Inventory inv, List, ResourceKey>> data) { + super(PlayerCollarsMod.PAWS_BLOCK_CONFIG_MENU.get(), syncId, inv, data); + } + + public PawsBlockConfigScreenHandler(int syncId, Inventory inv, FriendlyByteBuf buf) { + this(syncId, inv, NbtUtil.readCanInteract(buf)); + } + + @Override + protected List, ResourceKey>> genForItem(Item item) { + if (!(item instanceof BlockItem bi)) return List.of(); + var entry = this.world.registryAccess().registryOrThrow(Registries.BLOCK).getHolderOrThrow( + ResourceKey.create(Registries.BLOCK, ForgeRegistries.BLOCKS.getKey(bi.getBlock()))); + Stream, ResourceKey>> tags = entry.tags().map(Either::left); + if (entry.unwrapKey().isPresent()) + tags = Stream.concat(Stream.of(Either.right(entry.unwrapKey().get())), tags); + return tags.toList(); + } + + @Override + public net.minecraft.resources.ResourceKey> getRegistryKey() { + return Registries.BLOCK; + } + + @Override + public void removed(Player player) { + super.removed(player); + if (this.pawsStacks != null) + for (ItemStack ps : this.pawsStacks) NbtUtil.setCanInteract(ps, this.data); + } + } + + public static class PawsItemConfigScreenHandler extends PawsConfigScreenHandler { + public PawsItemConfigScreenHandler(int syncId, Inventory inv, List, ResourceKey>> data) { + super(PlayerCollarsMod.PAWS_ITEM_CONFIG_MENU.get(), syncId, inv, data); + } + + public PawsItemConfigScreenHandler(int syncId, Inventory inv, FriendlyByteBuf buf) { + this(syncId, inv, NbtUtil.readHeldItems(buf)); + } + + @Override + protected List, ResourceKey>> genForItem(Item item) { + var entry = this.world.registryAccess().registryOrThrow(Registries.ITEM).getHolderOrThrow( + ResourceKey.create(Registries.ITEM, ForgeRegistries.ITEMS.getKey(item))); + Stream, ResourceKey>> tags = entry.tags().map(Either::left); + if (entry.unwrapKey().isPresent()) + tags = Stream.concat(Stream.of(Either.right(entry.unwrapKey().get())), tags); + return tags.toList(); + } + + @Override + public net.minecraft.resources.ResourceKey> getRegistryKey() { + return Registries.ITEM; + } + + @Override + public void removed(Player player) { + super.removed(player); + if (this.pawsStacks != null) + for (ItemStack ps : this.pawsStacks) NbtUtil.setHeldItems(ps, this.data); + } + } +} diff --git a/src/main/java/org/jlortiz/playercollars/util/LeashedUtil.java b/src/main/java/org/jlortiz/playercollars/util/LeashedUtil.java new file mode 100644 index 00000000..5a104913 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/util/LeashedUtil.java @@ -0,0 +1,18 @@ +package org.jlortiz.playercollars.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +import java.util.List; +import java.util.function.Predicate; + +public final class LeashedUtil { + private LeashedUtil() {} + + public static List collectLeashablesAround(Level world, BlockPos pos, Predicate predicate) { + AABB box = new AABB(pos).inflate(7.0); + return world.getEntitiesOfClass(Mob.class, box, predicate); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/util/NbtUtil.java b/src/main/java/org/jlortiz/playercollars/util/NbtUtil.java new file mode 100644 index 00000000..6ba0b676 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/util/NbtUtil.java @@ -0,0 +1,118 @@ +package org.jlortiz.playercollars.util; + +import com.mojang.datafixers.util.Either; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.Nullable; +import org.jlortiz.playercollars.OwnerComponent; +import org.jlortiz.playercollars.PlayerCollarsMod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public final class NbtUtil { + private static final Logger logger = LoggerFactory.getLogger(NbtUtil.class); + + private NbtUtil() {} + + public static @Nullable OwnerComponent getDeedOwner(ItemStack is) { + if (!is.hasTag()) return null; + CompoundTag ownerCompound = is.getTagElement("owner"); + if (ownerCompound == null) return null; + return PlayerCollarsMod.OWNER_COMPONENT_CODEC.parse(NbtOps.INSTANCE, ownerCompound) + .resultOrPartial(logger::error).orElse(null); + } + + public static void setDeedOwner(ItemStack is, OwnerComponent ownerComponent) { + if (ownerComponent == null) { + if (is.hasTag()) is.removeTagKey("owner"); + return; + } + var ownerCompound = PlayerCollarsMod.OWNER_COMPONENT_CODEC.encodeStart(NbtOps.INSTANCE, ownerComponent) + .resultOrPartial(logger::error).orElse(null); + if (ownerCompound != null) is.addTagElement("owner", ownerCompound); + } + + public static int getColor(ItemStack stack, int defaultColor) { + CompoundTag display = stack.getTagElement("display"); + return display != null && display.contains("color", Tag.TAG_INT) ? display.getInt("color") : defaultColor; + } + + public static void setColor(ItemStack stack, int color) { + stack.getOrCreateTagElement("display").putInt("color", color); + } + + public static int getTagColor(ItemStack stack, int defaultColor) { + CompoundTag display = stack.getTagElement("display"); + return display != null && display.contains("tag", Tag.TAG_INT) ? display.getInt("tag") : defaultColor; + } + + public static void setTagColor(ItemStack stack, int color) { + stack.getOrCreateTagElement("display").putInt("tag", color); + } + + public static List, ResourceKey>> getHeldItems(ItemStack stack) { + if (!stack.hasTag() || !stack.getTag().contains("held_items", Tag.TAG_LIST)) return List.of(); + var nbt = stack.getTag().get("held_items"); + return PlayerCollarsMod.HELD_ITEMS_COMPONENT_CODEC.parse(NbtOps.INSTANCE, nbt) + .result().orElseGet(List::of); + } + + public static void setHeldItems(ItemStack stack, List, ResourceKey>> items) { + var nbt = PlayerCollarsMod.HELD_ITEMS_COMPONENT_CODEC.encodeStart(NbtOps.INSTANCE, items) + .resultOrPartial(logger::error).orElseGet(ListTag::new); + stack.getOrCreateTag().put("held_items", nbt); + } + + public static void writeHeldItems(FriendlyByteBuf buf, List, ResourceKey>> items) { + var sub = PlayerCollarsMod.HELD_ITEMS_COMPONENT_CODEC.encodeStart(NbtOps.INSTANCE, items) + .result().orElseGet(ListTag::new); + CompoundTag wrapper = new CompoundTag(); + wrapper.put("held_items", sub); + buf.writeNbt(wrapper); + } + + public static List, ResourceKey>> readHeldItems(FriendlyByteBuf buf) { + CompoundTag wrapper = buf.readNbt(); + if (wrapper == null || !wrapper.contains("held_items")) return List.of(); + return PlayerCollarsMod.HELD_ITEMS_COMPONENT_CODEC.parse(NbtOps.INSTANCE, wrapper.get("held_items")) + .result().orElseGet(List::of); + } + + public static List, ResourceKey>> getCanInteract(ItemStack stack) { + if (!stack.hasTag() || !stack.getTag().contains("can_interact", Tag.TAG_LIST)) return List.of(); + var nbt = stack.getTag().get("can_interact"); + return PlayerCollarsMod.CAN_INTERACT_COMPONENT_CODEC.parse(NbtOps.INSTANCE, nbt) + .result().orElseGet(List::of); + } + + public static void setCanInteract(ItemStack stack, List, ResourceKey>> items) { + var nbt = PlayerCollarsMod.CAN_INTERACT_COMPONENT_CODEC.encodeStart(NbtOps.INSTANCE, items) + .resultOrPartial(logger::error).orElseGet(ListTag::new); + stack.getOrCreateTag().put("can_interact", nbt); + } + + public static void writeCanInteract(FriendlyByteBuf buf, List, ResourceKey>> items) { + var sub = PlayerCollarsMod.CAN_INTERACT_COMPONENT_CODEC.encodeStart(NbtOps.INSTANCE, items) + .result().orElseGet(ListTag::new); + CompoundTag wrapper = new CompoundTag(); + wrapper.put("can_interact", sub); + buf.writeNbt(wrapper); + } + + public static List, ResourceKey>> readCanInteract(FriendlyByteBuf buf) { + CompoundTag wrapper = buf.readNbt(); + if (wrapper == null || !wrapper.contains("can_interact")) return List.of(); + return PlayerCollarsMod.CAN_INTERACT_COMPONENT_CODEC.parse(NbtOps.INSTANCE, wrapper.get("can_interact")) + .result().orElseGet(List::of); + } +} diff --git a/src/main/java/org/jlortiz/playercollars/util/TagKeyUtil.java b/src/main/java/org/jlortiz/playercollars/util/TagKeyUtil.java new file mode 100644 index 00000000..28b410f4 --- /dev/null +++ b/src/main/java/org/jlortiz/playercollars/util/TagKeyUtil.java @@ -0,0 +1,28 @@ +package org.jlortiz.playercollars.util; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; + +public final class TagKeyUtil { + private TagKeyUtil() {} + + public static String getTranslationKey(TagKey tagKey) { + StringBuilder sb = new StringBuilder("tag."); + ResourceLocation registryId = tagKey.registry().location(); + ResourceLocation tagId = tagKey.location(); + + if (!registryId.getNamespace().equals("minecraft")) { + sb.append(registryId.getNamespace()).append("."); + } + sb.append(registryId.getPath().replace("/", ".")) + .append(".").append(tagId.getNamespace()) + .append(".").append(tagId.getPath().replace("/", ".").replace(":", ".")); + return sb.toString(); + } + + public static Component getName(TagKey tagKey) { + return Component.translatableWithFallback(getTranslationKey(tagKey), "#" + tagKey.location()); + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..85a8a20e --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,7 @@ +# Player Collars Access Transformer +# slim field accessed via reflection in PawRenderer instead + +# EnchantmentHelper internal methods +public net.minecraft.world.item.enchantment.EnchantmentHelper m_44852_(Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentVisitor;Ljava/lang/Iterable;)V +public net.minecraft.world.item.enchantment.EnchantmentHelper m_44847_(Lnet/minecraft/world/item/enchantment/EnchantmentHelper$EnchantmentVisitor;Lnet/minecraft/world/item/ItemStack;)V +public net.minecraft.world.item.enchantment.EnchantmentHelper$Consumer diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 645eb946..c6e36293 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,48 +1,34 @@ -# 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="[40,)" #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. +modLoader="javafml" +loaderVersion="[47,)" license="MIT" -# A URL to refer people to when problems occur with this mod -# issueTrackerURL="https://github.com/UltrusBot/AltoriginGui/issues" #optional -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory -# The modid of the mod -modId="playercollars" #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="1.2.4" #mandatory -# A display name for the mod -displayName="Player Collars" #mandatory -# A URL to query for updates for this mod. See the JSON update specification https://mcforge.readthedocs.io/en/latest/gettingstarted/autoupdate/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional -# A URL for the "homepage" for this mod, displayed in the mod UI -# displayURL="" #optional -# A file name (in the root of the mod JAR) containing a logo for display -logoFile="icon.png" #optional -# A text field displayed in the mod UI -credits="raide, nightly" #optional -# A text field displayed in the mod UI -authors="jlortiz" #optional -# The description text for the mod (multi line!) (#mandatory) -description="Lets players wear pet collars.\nLeashable players code from https://modrinth.com/mod/leashable-players\nCollar model derived from https://www.curseforge.com/minecraft/mc-mods/player-collars" [[dependencies.playercollars]] -modId="curios" -mandatory=true -ordering="AFTER" -versionRange = "[1.20.1-4.4.7,)" + modId="forge" + mandatory=true + versionRange="[47.3,)" + ordering="NONE" + side="BOTH" [[dependencies.playercollars]] -modId="kawaiidishes" -mandatory=false -ordering="AFTER" -versionRange = "[1.10,)" \ No newline at end of file + modId="minecraft" + mandatory=true + versionRange="[1.20.1,1.21)" + ordering="NONE" + side="BOTH" + +[[dependencies.playercollars]] + modId="curios" + mandatory=true + versionRange="[5.9,)" + ordering="AFTER" + side="BOTH" + +[[mods]] +modId="playercollars" +version="${version}" +displayName="Player Collars" +description=''' +Lets players wear pet collars. +Leashable players code from https://modrinth.com/mod/leashable-players +Collar model derived from https://www.curseforge.com/minecraft/mc-mods/player-collars +''' diff --git a/src/main/resources/assets/playercollars/icon.png b/src/main/resources/assets/playercollars/icon.png new file mode 100644 index 00000000..4b4f59d0 Binary files /dev/null and b/src/main/resources/assets/playercollars/icon.png differ diff --git a/src/main/resources/assets/playercollars/item/paw_configurator.json b/src/main/resources/assets/playercollars/item/paw_configurator.json new file mode 100644 index 00000000..f6c9128a --- /dev/null +++ b/src/main/resources/assets/playercollars/item/paw_configurator.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "playercollars:item/paw_configurator" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/item/paws.json b/src/main/resources/assets/playercollars/item/paws.json new file mode 100644 index 00000000..03cdf487 --- /dev/null +++ b/src/main/resources/assets/playercollars/item/paws.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "playercollars:item/white_paws", + "tints": [ + { + "type": "minecraft:dye", + "default": 4294967295 + }, + { + "type": "minecraft:map_color", + "default": 15832783 + } + ] + } +} diff --git a/src/main/resources/assets/playercollars/lang/en_us.existing.json b/src/main/resources/assets/playercollars/lang/en_us.existing.json new file mode 100644 index 00000000..1d8ce276 --- /dev/null +++ b/src/main/resources/assets/playercollars/lang/en_us.existing.json @@ -0,0 +1,75 @@ +{ + "item.playercollars.collar": "Collar", + "item.playercollars.collar.paw_color": "Paw: #%s", + "item.playercollars.collar.paw": "Paw", + "item.playercollars.collar.owner": "Owner: %s", + "item.playercollars.collar.named": "%s's Collar", + "item.playercollars.collar.become_owner": "Become Owner", + "item.playercollars.collar.remove_owner": "Remove Owner", + "item.playercollars.tagless_collar": "Tagless Collar", + "item.playercollars.clicker": "Clicker", + "item.playercollars.clicker.turn_enable": "Force turning enabled", + "item.playercollars.clicker.turn_disable": "Force turning disabled", + "item.playercollars.clicker.turn": "Pets will turn towards this sound", + "item.playercollars.paws": "Paws", + "item.playercollars.paws.slippery": "Slippery - cannot hold items", + "item.playercollars.paws.interaction": "Cumbersome - cannot interact with blocks", + "item.playercollars.paw_configurator": "Paw Patroller", + "item.playercollars.paw_configurator.no_remove": "%s does not require hands to use", + "item.playercollars.paw_configurator.no_set_non_owner": "Must be owner to configure", + "item.playercollars.paw_configurator.no_paws": "Paws not equipped", + "item.playercollars.collar_locker": "Collar Lock-inator", + "item.playercollars.collar_locker.no_set_non_owner": "Must be owner to lock", + "item.playercollars.collar_locker.no_set_non_deed": "Collar must be crafted with a Deed of Ownership to lock", + "item.playercollars.collar_locker.locked": "Collar locked on", + "item.playercollars.collar_locker.unlocked": "Collar unlocked", + "item.playercollars.invisible_fence": "Invisible Fence", + "block.playercollars.invisible_fence": "Invisible Fence", + "block.playercollars.invisible_fence.toggle_fail": "Pets can't toggle fencing", + "block.playercollars.invisible_fence.toggle_on": "Fences enabled", + "block.playercollars.invisible_fence.toggle_off": "Fences disabled", + "item.playercollars.deed_of_ownership": "Blank Deed of Ownership", + "item.playercollars.deed_of_ownership.line1": "By stamping this contact, I, %s, accept %s as my OWNER.", + "item.playercollars.deed_of_ownership.line2": "I attest that a discussion about consent has occurred,", + "item.playercollars.deed_of_ownership.line3": "and we have agreed on boundaries to both of our satisfactions.", + "item.playercollars.deed_of_ownership.line4": "I understand that -- barring use of Curse of Binding -- ", + "item.playercollars.deed_of_ownership.line5": "I can revoke this at any time by removing my collar.", + "item.playercollars.deed_of_ownership.line6": "I acknowledge that, when wearing my collar, I will", + "item.playercollars.deed_of_ownership.line7": "bear the consequences should I attack my owner.", + "item.playercollars.deed_of_ownership.line8": "WITNESS my paw and official seal (on reverse).", + "item.playercollars.deed_of_ownership.stamp": "Stamp Deed", + "item.playercollars.deed_of_ownership.no_self_own": "Can't sign a contract with yourself!", + "item.playercollars.deed_of_ownership.filled_out": "Give the deed to your pet to sign", + "item.playercollars.deed_of_ownership.filled": "Unsigned Deed of Ownership", + "item.playercollars.stamped_deed_of_ownership": "%s's Deed of Ownership", + "item.playercollars.golden_spatula": "Golden Spatula", + "itemGroup.playercollars": "Leashable Collars", + "gui.playercollars.paw_configurator.title": "%s's Paws", + "gui.playercollars.paw_configurator.block.title": "%s's Paws - Blocks", + "gui.playercollars.paw_configurator.block.open": "Interactable Blocks", + "gui.playercollars.paw_configurator.item.title": "%s's Paws - Items", + "gui.playercollars.paw_configurator.item.open": "Holdable Items", + "enchantment.playercollars.short_leash": "Tight Leash", + "enchantment.playercollars.regeneration": "Healing", + "enchantment.playercollars.thorns": "Spiked", + "enchantment.playercollars.clicker": "Audible", + "enchantment.playercollars.clicker_walk": "Beckon", + "attribute.playercollars.clicker_distance": "Clicker Distance", + "attribute.playercollars.leash_distance": "Leash Distance", + "tag.item.trinkets.chest.necklace": "Necklace", + "tag.item.trinkets.hand.glove": "Glove", + "message.playercollars.no_break_fence": "Can't unleash yourself!", + "message.playercollars.no_break_fence_other": "Can't unleash %s!", + "message.playercollars.no_ride_entity": "Can't ride this entity!", + "message.playercollars.no_attack_owner": "Don't attack your owner!", + "tag.block.playercollars.paws_allow_interact": "Usable with Paws", + "gamerule.playerLeashesBreak": "Player collar leashes break if stretched too far", + "gamerule.leashedPlayersRideEntities": "Leashed players can ride entities", + "gamerule.playerAllowAttackOwner": "Players can attack owners", + "gamerule.allowUnleashUnownedPlayer": "Allow unleashing players you don't own", + "sound.playercollars.clicker_on": "Clicker clicks on", + "sound.playercollars.clicker_off": "Clicker clicks off", + "curios.identifier.feet": "Feet", + "curios.identifier.hands": "Hands", + "curios.identifier.necklace": "Necklace" +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/red_dog_bowl_0.json b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_0.json new file mode 100644 index 00000000..89c6cf5b --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_0.json @@ -0,0 +1,64 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "textures": { + "particle": "minecraft:block/red_terracotta" + }, + "elements": [ + { + "from": [2, 1, 14], + "to": [14, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 13]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 12, 1], "texture": "#particle"} + } + }, + { + "from": [14, 1, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 1, 0]}, + "faces": { + "north": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "east": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 14], "texture": "#particle"} + } + }, + { + "from": [1, 1, 2], + "to": [2, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, + "faces": { + "east": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [1, 1, 1], + "to": [14, 5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, + "faces": { + "north": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 13, 1], "texture": "#particle"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 1, 15], + "faces": { + "north": {"uv": [1, 0, 15, 1], "texture": "#particle"}, + "east": {"uv": [15, 1, 16, 15], "rotation": 90, "texture": "#particle"}, + "south": {"uv": [1, 15, 15, 16], "texture": "#particle"}, + "west": {"uv": [0, 1, 1, 15], "rotation": 270, "texture": "#particle"}, + "up": {"uv": [0, 0, 14, 14], "texture": "#particle"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/red_dog_bowl_1.json b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_1.json new file mode 100644 index 00000000..3fdcd6dc --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_1.json @@ -0,0 +1,73 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/composter_compost", + "particle": "minecraft:block/red_terracotta" + }, + "elements": [ + { + "from": [2, 1, 14], + "to": [14, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 13]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 12, 1], "texture": "#particle"} + } + }, + { + "from": [14, 1, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 1, 0]}, + "faces": { + "north": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "east": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 14], "texture": "#particle"} + } + }, + { + "from": [1, 1, 2], + "to": [2, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, + "faces": { + "east": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [1, 1, 1], + "to": [14, 5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, + "faces": { + "north": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 13, 1], "texture": "#particle"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 1, 15], + "faces": { + "north": {"uv": [1, 0, 15, 1], "texture": "#particle"}, + "east": {"uv": [15, 1, 16, 15], "rotation": 90, "texture": "#particle"}, + "south": {"uv": [1, 15, 15, 16], "texture": "#particle"}, + "west": {"uv": [0, 1, 1, 15], "rotation": 270, "texture": "#particle"}, + "up": {"uv": [0, 0, 14, 14], "texture": "#particle"} + } + }, + { + "from": [2, -3, 2], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -3, 1]}, + "faces": { + "up": {"uv": [3, 3, 13, 13], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/red_dog_bowl_2.json b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_2.json new file mode 100644 index 00000000..1df140c6 --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_2.json @@ -0,0 +1,73 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/composter_compost", + "particle": "minecraft:block/red_terracotta" + }, + "elements": [ + { + "from": [2, 1, 14], + "to": [14, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 13]}, + "faces": { + "north": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 12, 1], "texture": "#particle"} + } + }, + { + "from": [14, 1, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 1, 0]}, + "faces": { + "north": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "east": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 14], "texture": "#particle"} + } + }, + { + "from": [1, 1, 2], + "to": [2, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, + "faces": { + "east": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [1, 1, 1], + "to": [14, 5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, + "faces": { + "north": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 13, 1], "texture": "#particle"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 1, 15], + "faces": { + "north": {"uv": [1, 0, 15, 1], "texture": "#particle"}, + "east": {"uv": [15, 1, 16, 15], "rotation": 90, "texture": "#particle"}, + "south": {"uv": [1, 15, 15, 16], "texture": "#particle"}, + "west": {"uv": [0, 1, 1, 15], "rotation": 270, "texture": "#particle"}, + "up": {"uv": [0, 0, 14, 14], "texture": "#particle"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1, 1]}, + "faces": { + "up": {"uv": [3, 3, 13, 13], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/red_dog_bowl_3.json b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_3.json new file mode 100644 index 00000000..21a7ffdb --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_3.json @@ -0,0 +1,111 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "textures": { + "0": "minecraft:block/composter_compost", + "particle": "minecraft:block/red_terracotta" + }, + "elements": [ + { + "from": [2, 1, 14], + "to": [14, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 13]}, + "faces": { + "south": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 12, 1], "texture": "#particle"} + } + }, + { + "from": [14, 1, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 1, 0]}, + "faces": { + "north": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "east": {"uv": [0, 0, 14, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 14], "texture": "#particle"} + } + }, + { + "from": [1, 1, 2], + "to": [2, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, + "faces": { + "south": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [1, 1, 1], + "to": [14, 5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, + "faces": { + "north": {"uv": [0, 0, 13, 4], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 13, 1], "texture": "#particle"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 1, 15], + "faces": { + "north": {"uv": [1, 0, 15, 1], "texture": "#particle"}, + "east": {"uv": [15, 1, 16, 15], "rotation": 90, "texture": "#particle"}, + "south": {"uv": [1, 15, 15, 16], "texture": "#particle"}, + "west": {"uv": [0, 1, 1, 15], "rotation": 270, "texture": "#particle"} + } + }, + { + "from": [2, 1, 2], + "to": [14, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 1, 1]}, + "faces": { + "north": {"uv": [3, 2, 13, 3], "texture": "#0"}, + "east": {"uv": [13, 3, 14, 13], "rotation": 90, "texture": "#0"}, + "south": {"uv": [3, 13, 13, 14], "texture": "#0"}, + "west": {"uv": [3, 3, 2, 13], "rotation": 270, "texture": "#0"}, + "up": {"uv": [3, 3, 13, 13], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [65, 0, 0], + "translation": [0, 1.5, 0.5], + "scale": [0.35, 0.35, 0.35] + }, + "thirdperson_lefthand": { + "rotation": [65, 0, 0], + "translation": [0, 1.5, 0.5], + "scale": [0.35, 0.35, 0.35] + }, + "firstperson_righthand": { + "rotation": [20, 0, 0], + "translation": [3, 3, -1.5], + "scale": [0.75, 0.75, 0.75] + }, + "firstperson_lefthand": { + "rotation": [20, 0, 0], + "translation": [3, 3, -1.5], + "scale": [0.75, 0.75, 0.75] + }, + "ground": { + "translation": [0, 1.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [25, 12, 0], + "translation": [-0.125, 2.5, 0], + "scale": [0.85, 0.85, 0.85] + }, + "head": { + "rotation": [180, 0, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -7] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/red_dog_bowl_milk.json b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_milk.json new file mode 100644 index 00000000..4fb8141d --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/red_dog_bowl_milk.json @@ -0,0 +1,6 @@ +{ + "parent": "playercollars:block/red_dog_bowl_2", + "textures": { + "0": "minecraft:block/white_concrete" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/block/white_dog_bed.json b/src/main/resources/assets/playercollars/models/block/white_dog_bed.json new file mode 100644 index 00000000..5569b83f --- /dev/null +++ b/src/main/resources/assets/playercollars/models/block/white_dog_bed.json @@ -0,0 +1,147 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "particle": "minecraft:block/white_wool" + }, + "elements": [ + { + "name": "bottom", + "from": [1, 0, 3], + "to": [15, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [0, 0, 14, 3], "texture": "#particle"}, + "east": {"uv": [0, 0, 13, 3], "texture": "#particle"}, + "south": {"uv": [0, 0, 14, 3], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 3], "texture": "#particle"}, + "up": {"uv": [0, 0, 14, 13], "texture": "#particle"}, + "down": {"uv": [0, 0, 14, 13], "texture": "#particle"} + } + }, + { + "from": [2, 0, 2], + "to": [14, 4, 3], + "faces": { + "north": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "south": {"uv": [0, 0, 12, 4], "texture": "#particle"}, + "up": {"uv": [0, 0, 12, 1], "texture": "#particle"} + } + }, + { + "from": [4, 0, 1], + "to": [12, 5, 2], + "faces": { + "north": {"uv": [0, 0, 8, 5], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 5], "texture": "#particle"}, + "south": {"uv": [0, 0, 8, 5], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 5], "texture": "#particle"}, + "up": {"uv": [0, 0, 8, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 8, 1], "texture": "#particle"} + } + }, + { + "name": "edge", + "from": [3, 0, 0], + "to": [13, 6, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 0, -1]}, + "faces": { + "north": {"uv": [0, 0, 10, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 10, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 10, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 10, 1], "texture": "#particle"} + } + }, + { + "from": [2, 0, 1], + "to": [4, 6, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 1]}, + "faces": { + "north": {"uv": [0, 0, 2, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 2, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 2, 1], "texture": "#particle"} + } + }, + { + "from": [12, 0, 1], + "to": [14, 6, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 1]}, + "faces": { + "north": {"uv": [0, 0, 2, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 2, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 2, 1], "texture": "#particle"} + } + }, + { + "from": [0, 0, 3], + "to": [1, 6, 16], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 13, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"}, + "down": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [15, 0, 3], + "to": [16, 6, 16], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 13, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 13, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 13], "texture": "#particle"}, + "down": {"uv": [0, 0, 1, 13], "texture": "#particle"} + } + }, + { + "from": [1, 0, 2], + "to": [2, 6, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 1]}, + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#particle"} + } + }, + { + "from": [14, 0, 2], + "to": [15, 6, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 1]}, + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#particle"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#particle"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#particle"} + } + } + ], + "groups": [ + { + "name": "floor", + "origin": [8, 0, 8], + "color": 0, + "children": [0, 1, 2] + }, + { + "name": "walls", + "origin": [10, 0, 0], + "color": 0, + "children": [3, 4, 5, 6, 7, 8, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/item/paw_configurator.json b/src/main/resources/assets/playercollars/models/item/paw_configurator.json new file mode 100644 index 00000000..4fd05a94 --- /dev/null +++ b/src/main/resources/assets/playercollars/models/item/paw_configurator.json @@ -0,0 +1,19 @@ +{ + "credit": "Made with Blockbench", + "parent": "item/generated", + "textures": { + "layer0": "playercollars:item/paw_configurator" + }, + "display": { + "firstperson_righthand": { + "rotation": [0, -20, 0], + "scale": [0.5, 0.5, 0.5], + "translation": [0, 3.25, 0] + }, + "firstperson_lefthand": { + "rotation": [0, -20, 0], + "scale": [0.5, 0.5, 0.5], + "translation": [0, 3.25, 0] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/item/tagless_collar.json b/src/main/resources/assets/playercollars/models/item/tagless_collar.json new file mode 100644 index 00000000..991637d0 --- /dev/null +++ b/src/main/resources/assets/playercollars/models/item/tagless_collar.json @@ -0,0 +1,128 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "playercollars:item/collar" + }, + "elements": [ + { + "from": [3, -6, 2], + "to": [4, 0, 3], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [1, 1, 0, 0], "texture": "#0", "tintindex": 0}, + "down": {"uv": [1, 0, 0, 1], "texture": "#0", "tintindex": 0} + } + }, + { + "from": [5, -1, 3], + "to": [11, 0, 4], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "down": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0} + } + }, + { + "from": [12, -6, 2], + "to": [13, 0, 3], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [1, 1, 0, 0], "texture": "#0", "tintindex": 0}, + "down": {"uv": [1, 0, 0, 1], "texture": "#0", "tintindex": 0} + } + }, + { + "from": [4, -6, 2], + "to": [12, -5, 3], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [1, 1, 0, 0], "texture": "#0", "tintindex": 0}, + "down": {"uv": [1, 0, 0, 1], "texture": "#0", "tintindex": 0} + } + }, + { + "from": [4, -1, 2], + "to": [5, 0, 4], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [1, 1, 0, 0], "texture": "#0", "tintindex": 0}, + "down": {"uv": [1, 0, 0, 1], "texture": "#0", "tintindex": 0} + } + }, + { + "from": [11, -1, 2], + "to": [12, 0, 4], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0", "tintindex": 0}, + "up": {"uv": [1, 1, 0, 0], "texture": "#0", "tintindex": 0}, + "down": {"uv": [1, 0, 0, 1], "texture": "#0", "tintindex": 0} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [-2, 180, 0], + "translation": [0, 4.25, -2.5], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [-2, 180, 0], + "translation": [0, 4.25, -2.5], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [-100, 180, -156], + "translation": [0, 1, 6], + "scale": [0.75, 0.75, 0.75] + }, + "firstperson_lefthand": { + "rotation": [-100, 180, -156], + "translation": [0, 1, 6], + "scale": [0.75, 0.75, 0.75] + }, + "ground": { + "rotation": [53, 0, 0], + "translation": [0, 1, 8], + "scale": [0.75, 0.75, 0.75] + }, + "gui": { + "rotation": [-93, 173, -180], + "translation": [0.75, -3.25, 1.25], + "scale": [1.25, 1.25, 1.25] + }, + "head": { + "rotation": [90, 0, 180], + "translation": [0, -12.25, -10.75] + }, + "fixed": { + "rotation": [-90, -180, 0], + "translation": [0, -2.5, -12.5], + "scale": [1.5, 1.5, 1.5] + } + }, + "groups": [ + { + "name": "Neck", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/playercollars/models/item/white_foot_paws.json b/src/main/resources/assets/playercollars/models/item/white_foot_paws.json new file mode 100644 index 00000000..0d12417e --- /dev/null +++ b/src/main/resources/assets/playercollars/models/item/white_foot_paws.json @@ -0,0 +1,298 @@ +{ + "format_version": "1.21.6", + "credit": "Made with Blockbench", + "textures": { + "layer0": "block/white_wool", + "layer1": "block/pink_concrete", + "particle": "block/white_wool" + }, + "elements": [ + { + "from": [6.25, 4.25, 8], + "to": [9.75, 7.75, 8.25], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, 6]}, + "faces": { + "north": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" } + } + }, + { + "from": [9.75, 4.25, 8], + "to": [10, 7.75, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 1, 7]}, + "faces": { + "north": { "uv": [ 0, 1, 1, 15 ], "texture": "#layer0" }, + "east": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 1, 1, 15 ], "texture": "#layer0" }, + "west": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" } + } + }, + { + "from": [6, 4.25, 8], + "to": [6.25, 7.75, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 7]}, + "faces": { + "north": { "uv": [ 15, 1, 16, 15 ], "texture": "#layer0" }, + "east": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 15, 1, 16, 15 ], "texture": "#layer0" }, + "west": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" } + } + }, + { + "from": [6, 4, 8], + "to": [10, 4.25, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 7]}, + "faces": { + "north": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "east": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 0, 1, 16 ], "rotation": 90, "texture": "#layer0" }, + "west": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#layer0" }, + "down": { "uv": [ 0, 0, 16, 16 ], "rotation": 90, "texture": "#layer0" } + } + }, + { + "from": [6, 7.75, 8], + "to": [10, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "east": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "west": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#layer0" }, + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#layer0" } + } + }, + { + "from": [7, 5.1875, 7.625], + "to": [8, 6.6875, 7.75], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 1, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.125, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.125, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 1 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 1 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [6.75, 5.1875, 7.75], + "to": [8.25, 6.6875, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 1.5, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 1.5 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 1.5 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [7, 4.75, 7.75], + "to": [8, 7.125, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 1, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 1 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 1 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.625, 4.375, 7.75], + "to": [9, 5, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.5, 4.5, 7.75], + "to": [9.125, 4.875, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.625, 4.5, 7.625], + "to": [9, 4.875, 7.75], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.625, 7, 7.75], + "to": [9, 7.625, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.5, 7.125, 7.75], + "to": [9.125, 7.5, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [8.625, 7.125, 7.625], + "to": [9, 7.5, 7.75], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9.125, 5.375, 7.625], + "to": [9.5, 5.75, 7.75], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9, 5.375, 7.75], + "to": [9.625, 5.75, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9.125, 5.25, 7.75], + "to": [9.5, 5.875, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9, 6.25, 7.75], + "to": [9.625, 6.625, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9.125, 6.125, 7.75], + "to": [9.5, 6.75, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [9.125, 6.25, 7.625], + "to": [9.5, 6.625, 7.75], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "east": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 90, "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "rotation": 270, "texture": "#layer1", "tintindex": 1 } + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [-45, 90, 180], + "translation": [-2, 0, 0.25], + "scale": [1.02, 1, 1] + }, + "thirdperson_lefthand": { + "rotation": [-45, 90, 0], + "translation": [-2, 2.25, -3.25], + "scale": [1.02, 1, 1] + }, + "firstperson_righthand": { + "rotation": [-45, 90, 180], + "translation": [-3, 3.5, 4.5] + }, + "firstperson_lefthand": { + "rotation": [-45, 90, 0], + "translation": [-2, 5.75, 0.75] + }, + "ground": { + "rotation": [-90, 0, -90], + "translation": [2.125, -1.5, 2.25], + "scale": [1, 1.05, 1] + }, + "gui": { + "rotation": [-164, 13, 94], + "translation": [-6.5, -0.25, 0], + "scale": [3, 3, 1.5] + }, + "fixed": { + "rotation": [0, 0, -90], + "translation": [6.5, 0.5, -4.25], + "scale": [3, 3, 3] + } + }, + "groups": [ + { + "name": "Hand", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "Paw", + "origin": [8, 8, 8], + "color": 0, + "children": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + } + ] +} diff --git a/src/main/resources/assets/playercollars/models/item/white_paws.json b/src/main/resources/assets/playercollars/models/item/white_paws.json new file mode 100644 index 00000000..f1c97b7a --- /dev/null +++ b/src/main/resources/assets/playercollars/models/item/white_paws.json @@ -0,0 +1,292 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "layer0": "minecraft:block/white_wool", + "layer1": "minecraft:block/white_concrete", + "particle": "minecraft:block/white_wool" + }, + "elements": [ + { + "from": [6.25, 4.25, 8], + "to": [9.75, 7.75, 8.25], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, 6]}, + "faces": { + "north": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" } + } + }, + { + "from": [9.75, 4.25, 8], + "to": [10, 7.75, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 1, 7]}, + "faces": { + "north": { "uv": [ 0, 1, 1, 15 ], "texture": "#layer0" }, + "east": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 1, 1, 15 ], "texture": "#layer0" }, + "west": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" } + } + }, + { + "from": [6, 4.25, 8], + "to": [6.25, 7.75, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 7]}, + "faces": { + "north": { "uv": [ 15, 1, 16, 15 ], "texture": "#layer0" }, + "east": { "uv": [ 16, 1, 0, 15 ], "texture": "#layer0" }, + "south": { "uv": [ 15, 1, 16, 15 ], "texture": "#layer0" }, + "west": { "uv": [ 1, 1, 15, 15 ], "texture": "#layer0" } + } + }, + { + "from": [6, 4, 8], + "to": [10, 4.25, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 7]}, + "faces": { + "north": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "east": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 0, 1, 16 ], "rotation": 90, "texture": "#layer0" }, + "west": { "uv": [ 0, 15, 16, 16 ], "texture": "#layer0" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#layer0" }, + "down": { "uv": [ 0, 0, 16, 16 ], "rotation": 90, "texture": "#layer0" } + } + }, + { + "from": [6, 7.75, 8], + "to": [10, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 5, 7]}, + "faces": { + "north": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "east": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "south": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "west": { "uv": [ 0, 0, 16, 1 ], "texture": "#layer0" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#layer0" }, + "down": { "uv": [ 0, 16, 16, 0 ], "texture": "#layer0" } + } + }, + { + "from": [5.625, 5.1875, 10], + "to": [5.75, 6.6875, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 10]}, + "faces": { + "north": { "uv": [ 0, 0, 0.125, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.125, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 1, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 1 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 1 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 5.1875, 9.75], + "to": [6, 6.6875, 11.25], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 10]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 1.5, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 1.5 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 4.75, 10], + "to": [6, 7.125, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 10]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 1, 2.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 1 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 1 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 4.375, 9], + "to": [6, 5, 9.375], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 4.5, 8.875], + "to": [6, 4.875, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.625, 4.5, 9], + "to": [5.75, 4.875, 9.375], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 7, 9], + "to": [6, 7.625, 9.375], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 7.125, 8.875], + "to": [6, 7.5, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.625, 7.125, 9], + "to": [5.75, 7.5, 9.375], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.625, 5.375, 8.5], + "to": [5.75, 5.75, 8.875], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 5.375, 8.375], + "to": [6, 5.75, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 5.25, 8.5], + "to": [6, 5.875, 8.875], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 6.25, 8.375], + "to": [6, 6.625, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.625, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.75, 6.125, 8.5], + "to": [6, 6.75, 8.875], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.25, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.625 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.25, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + }, + { + "from": [5.625, 6.25, 8.5], + "to": [5.75, 6.625, 8.875], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 9]}, + "faces": { + "north": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "south": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "west": { "uv": [ 0, 0, 0.375, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "up": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 }, + "down": { "uv": [ 0, 0, 0.125, 0.375 ], "texture": "#layer1", "tintindex": 1 } + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [-45, 0, 0], + "translation": [0, 1.5, -4], + "scale": [1.02, 1, 1] + }, + "thirdperson_lefthand": { + "rotation": [-45, 0, 180], + "translation": [0, -1.5, -1.25], + "scale": [1.02, 1, 1] + }, + "firstperson_righthand": { + "rotation": [-45, 0, 0], + "translation": [-0.75, 4, 0] + }, + "firstperson_lefthand": { + "rotation": [-45, 0, 180], + "translation": [-0.75, 0.5, 1.75] + }, + "gui": { + "rotation": [101, 0, -69], + "translation": [5.75, 6.25, 0], + "scale": [1.5, 3, 3] + }, + "fixed": { + "rotation": [90, 0, 90], + "translation": [-6.25, 6, 2], + "scale": [2, 3, 3] + } + }, + "groups": [ + { + "name": "Hand", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "Paw", + "origin": [8, 8, 8], + "color": 0, + "children": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + } + ] +} diff --git a/src/main/resources/assets/playercollars/textures/gui/paw_controller.png b/src/main/resources/assets/playercollars/textures/gui/paw_controller.png new file mode 100644 index 00000000..4e74dc1f Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/gui/paw_controller.png differ diff --git a/src/main/resources/assets/playercollars/textures/gui/paw_controller_widgets.png b/src/main/resources/assets/playercollars/textures/gui/paw_controller_widgets.png new file mode 100644 index 00000000..1a822610 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/gui/paw_controller_widgets.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/collar_locker.png b/src/main/resources/assets/playercollars/textures/item/collar_locker.png new file mode 100644 index 00000000..32f2ea14 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/collar_locker.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/deed_of_ownership.png b/src/main/resources/assets/playercollars/textures/item/deed_of_ownership.png new file mode 100644 index 00000000..0c37765f Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/deed_of_ownership.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/golden_spatula.png b/src/main/resources/assets/playercollars/textures/item/golden_spatula.png new file mode 100644 index 00000000..3ddaf4d6 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/golden_spatula.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/paw_configurator.png b/src/main/resources/assets/playercollars/textures/item/paw_configurator.png new file mode 100644 index 00000000..b672b1e2 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/paw_configurator.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/stamped_deed_of_ownership.png b/src/main/resources/assets/playercollars/textures/item/stamped_deed_of_ownership.png new file mode 100644 index 00000000..ca0c0d70 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/stamped_deed_of_ownership.png differ diff --git a/src/main/resources/assets/playercollars/textures/item/white_dog_bed.png b/src/main/resources/assets/playercollars/textures/item/white_dog_bed.png new file mode 100644 index 00000000..8c36c936 Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/item/white_dog_bed.png differ diff --git a/src/main/resources/assets/playercollars/textures/slot/empty_feet_slot.png b/src/main/resources/assets/playercollars/textures/slot/empty_feet_slot.png new file mode 100644 index 00000000..dc68302b Binary files /dev/null and b/src/main/resources/assets/playercollars/textures/slot/empty_feet_slot.png differ diff --git a/src/main/resources/data/curios/tags/items/feet.json b/src/main/resources/data/curios/tags/items/feet.json new file mode 100644 index 00000000..aa9f2e85 --- /dev/null +++ b/src/main/resources/data/curios/tags/items/feet.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "playercollars:white_foot_paws", + "playercollars:orange_foot_paws", + "playercollars:magenta_foot_paws", + "playercollars:light_blue_foot_paws", + "playercollars:yellow_foot_paws", + "playercollars:lime_foot_paws", + "playercollars:pink_foot_paws", + "playercollars:gray_foot_paws", + "playercollars:light_gray_foot_paws", + "playercollars:cyan_foot_paws", + "playercollars:purple_foot_paws", + "playercollars:blue_foot_paws", + "playercollars:brown_foot_paws", + "playercollars:green_foot_paws", + "playercollars:red_foot_paws", + "playercollars:black_foot_paws" + ] +} diff --git a/src/main/resources/data/curios/tags/items/hands.json b/src/main/resources/data/curios/tags/items/hands.json new file mode 100644 index 00000000..ff4013a8 --- /dev/null +++ b/src/main/resources/data/curios/tags/items/hands.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "playercollars:white_paws", + "playercollars:orange_paws", + "playercollars:magenta_paws", + "playercollars:light_blue_paws", + "playercollars:yellow_paws", + "playercollars:lime_paws", + "playercollars:pink_paws", + "playercollars:gray_paws", + "playercollars:light_gray_paws", + "playercollars:cyan_paws", + "playercollars:purple_paws", + "playercollars:blue_paws", + "playercollars:brown_paws", + "playercollars:green_paws", + "playercollars:red_paws", + "playercollars:black_paws" + ] +} diff --git a/src/main/resources/data/curios/tags/items/necklace.json b/src/main/resources/data/curios/tags/items/necklace.json index 736c8c48..75b89158 100644 --- a/src/main/resources/data/curios/tags/items/necklace.json +++ b/src/main/resources/data/curios/tags/items/necklace.json @@ -1,6 +1,7 @@ { - "values": [ - "playercollars:collar" - ], - "replace": false -} \ No newline at end of file + "replace": false, + "values": [ + "playercollars:collar", + "playercollars:tagless_collar" + ] +} diff --git a/src/main/resources/data/playercollars/curios/entities/playercollars.json b/src/main/resources/data/playercollars/curios/entities/playercollars.json new file mode 100644 index 00000000..454212bf --- /dev/null +++ b/src/main/resources/data/playercollars/curios/entities/playercollars.json @@ -0,0 +1,4 @@ +{ + "entities": ["minecraft:player"], + "slots": ["necklace", "hands", "feet"] +} diff --git a/src/main/resources/data/playercollars/curios/slots/feet.json b/src/main/resources/data/playercollars/curios/slots/feet.json new file mode 100644 index 00000000..3635b803 --- /dev/null +++ b/src/main/resources/data/playercollars/curios/slots/feet.json @@ -0,0 +1,5 @@ +{ + "size": 1, + "operation": "SET", + "icon": "playercollars:slot/empty_feet_slot" +} diff --git a/src/main/resources/data/playercollars/recipes/generic_collar_ownership.json b/src/main/resources/data/playercollars/recipes/generic_collar_ownership.json new file mode 100644 index 00000000..90ed512d --- /dev/null +++ b/src/main/resources/data/playercollars/recipes/generic_collar_ownership.json @@ -0,0 +1,7 @@ +{ + "type": "playercollars:owner_transfer", + "category": "misc", + "ingredient": { + "tag": "c:collars" + } +} diff --git a/src/main/resources/data/playercollars/tags/blocks/paws_allow_interact.json b/src/main/resources/data/playercollars/tags/blocks/paws_allow_interact.json new file mode 100644 index 00000000..7236f441 --- /dev/null +++ b/src/main/resources/data/playercollars/tags/blocks/paws_allow_interact.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "values": [ + "#minecraft:buttons", + "minecraft:lever", + "#minecraft:beds", + "#minecraft:cauldrons", + "#minecraft:crops", + "#minecraft:geode_invalid_blocks" + ] +} \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index e3b7cfd2..6696ff1a 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,7 +1,6 @@ { "pack": { - "description": "playercollars resources", - "pack_format": 9, - "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." + "description": "Player Collars Forge", + "pack_format": 15 } } diff --git a/src/main/resources/playercollars.leashplayers.mixins.json b/src/main/resources/playercollars.leashplayers.mixins.json new file mode 100644 index 00000000..c1b62049 --- /dev/null +++ b/src/main/resources/playercollars.leashplayers.mixins.json @@ -0,0 +1,18 @@ +{ + "minVersion": "0.8", + "compatibilityLevel": "JAVA_17", + "package": "org.jlortiz.playercollars.leash.mixin", + "required": true, + "injectors": { + "defaultRequire": 1 + }, + "refmap": "playercollars.refmap.json", + "mixins": [ + "MixinFireworkRocketItem", + "MixinLeashKnotEntity", + "MixinPlayerEntity", + "MixinServerPlayerEntity", + "MixinTridentItem", + "MixinTurtleEntity" + ] +} diff --git a/src/main/resources/playercollars.mixins.json b/src/main/resources/playercollars.mixins.json index a3f896a9..76635b1f 100644 --- a/src/main/resources/playercollars.mixins.json +++ b/src/main/resources/playercollars.mixins.json @@ -1,16 +1,22 @@ { - "minVersion": "0.8", - "compatibilityLevel": "JAVA_17", - "package": "org.jlortiz.playercollars.leash.mixin", - "required": true, - "injectors": { - "defaultRequire": 1 - }, - "refmap": "playercollars.mixins.refmap.json", - "mixins": [ - "MixinPlayerEntity", - "MixinServerPlayerEntity", - "MixinServerWorld", - "MixinTurtleEntity" - ] -} \ No newline at end of file + "minVersion": "0.8", + "compatibilityLevel": "JAVA_17", + "package": "org.jlortiz.playercollars.mixin", + "required": true, + "injectors": { + "defaultRequire": 1 + }, + "refmap": "playercollars.refmap.json", + "mixins": [ + "BoneItemMixin", + "LivingEntityMixin", + "MixinBindingCurseEnchantment", + "MixinEnchantment", + "MixinEnchantmentHelper", + "PlayerEntityMixin" + ], + "client": [ + "ClientPlayerInteractionManagerMixin", + "PlayerRendererMixin" + ] +}