From e316d1bda7cdf5ece539644d3fbe438c8d149d53 Mon Sep 17 00:00:00 2001 From: Cephaeus Owen Drome Date: Wed, 18 Mar 2026 00:08:51 -0600 Subject: [PATCH] Forge 1.20.1 backport w/ Enchant --- .gradle/8.1.1/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.1.1/checksums/md5-checksums.bin | Bin 0 -> 18597 bytes .gradle/8.1.1/checksums/sha1-checksums.bin | Bin 0 -> 18605 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 488416 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.1.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.1.1/fileHashes/fileHashes.bin | Bin 0 -> 92115 bytes .gradle/8.1.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.1.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 20299 bytes .gradle/8.1.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 19073 bytes .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 Git Redundancy - Delete me! | 1 + build.gradle | 247 ++-------- gradle.properties | 11 +- gradlew | 41 +- gradlew.bat | 35 +- settings.gradle | 24 +- .../blockstates/black_dog_bed.json | 44 ++ .../blockstates/black_dog_bowl.json | 28 ++ .../blockstates/blue_dog_bed.json | 44 ++ .../blockstates/blue_dog_bowl.json | 28 ++ .../blockstates/brown_dog_bed.json | 44 ++ .../blockstates/brown_dog_bowl.json | 28 ++ .../blockstates/cyan_dog_bed.json | 44 ++ .../blockstates/cyan_dog_bowl.json | 28 ++ .../blockstates/gray_dog_bed.json | 44 ++ .../blockstates/gray_dog_bowl.json | 28 ++ .../blockstates/green_dog_bed.json | 44 ++ .../blockstates/green_dog_bowl.json | 28 ++ .../blockstates/invisible_fence.json | 48 ++ .../blockstates/light_blue_dog_bed.json | 44 ++ .../blockstates/light_blue_dog_bowl.json | 28 ++ .../blockstates/light_gray_dog_bed.json | 44 ++ .../blockstates/light_gray_dog_bowl.json | 28 ++ .../blockstates/lime_dog_bed.json | 44 ++ .../blockstates/lime_dog_bowl.json | 28 ++ .../blockstates/magenta_dog_bed.json | 44 ++ .../blockstates/magenta_dog_bowl.json | 28 ++ .../blockstates/orange_dog_bed.json | 44 ++ .../blockstates/orange_dog_bowl.json | 28 ++ .../blockstates/pink_dog_bed.json | 44 ++ .../blockstates/pink_dog_bowl.json | 28 ++ .../blockstates/purple_dog_bed.json | 44 ++ .../blockstates/purple_dog_bowl.json | 28 ++ .../blockstates/red_dog_bed.json | 44 ++ .../blockstates/red_dog_bowl.json | 28 ++ .../blockstates/white_dog_bed.json | 44 ++ .../blockstates/white_dog_bowl.json | 28 ++ .../blockstates/yellow_dog_bed.json | 44 ++ .../blockstates/yellow_dog_bowl.json | 28 ++ .../assets/playercollars/lang/en_us.json | 139 ++++++ .../models/block/black_dog_bed.json | 6 + .../models/block/black_dog_bowl_0.json | 6 + .../models/block/black_dog_bowl_1.json | 6 + .../models/block/black_dog_bowl_2.json | 6 + .../models/block/black_dog_bowl_3.json | 6 + .../models/block/black_dog_bowl_milk.json | 6 + .../models/block/blue_dog_bed.json | 6 + .../models/block/blue_dog_bowl_0.json | 6 + .../models/block/blue_dog_bowl_1.json | 6 + .../models/block/blue_dog_bowl_2.json | 6 + .../models/block/blue_dog_bowl_3.json | 6 + .../models/block/blue_dog_bowl_milk.json | 6 + .../models/block/brown_dog_bed.json | 6 + .../models/block/brown_dog_bowl_0.json | 6 + .../models/block/brown_dog_bowl_1.json | 6 + .../models/block/brown_dog_bowl_2.json | 6 + .../models/block/brown_dog_bowl_3.json | 6 + .../models/block/brown_dog_bowl_milk.json | 6 + .../models/block/cyan_dog_bed.json | 6 + .../models/block/cyan_dog_bowl_0.json | 6 + .../models/block/cyan_dog_bowl_1.json | 6 + .../models/block/cyan_dog_bowl_2.json | 6 + .../models/block/cyan_dog_bowl_3.json | 6 + .../models/block/cyan_dog_bowl_milk.json | 6 + .../models/block/gray_dog_bed.json | 6 + .../models/block/gray_dog_bowl_0.json | 6 + .../models/block/gray_dog_bowl_1.json | 6 + .../models/block/gray_dog_bowl_2.json | 6 + .../models/block/gray_dog_bowl_3.json | 6 + .../models/block/gray_dog_bowl_milk.json | 6 + .../models/block/green_dog_bed.json | 6 + .../models/block/green_dog_bowl_0.json | 6 + .../models/block/green_dog_bowl_1.json | 6 + .../models/block/green_dog_bowl_2.json | 6 + .../models/block/green_dog_bowl_3.json | 6 + .../models/block/green_dog_bowl_milk.json | 6 + .../models/block/invisible_fence_post.json | 6 + .../models/block/invisible_fence_side.json | 6 + .../models/block/light_blue_dog_bed.json | 6 + .../models/block/light_blue_dog_bowl_0.json | 6 + .../models/block/light_blue_dog_bowl_1.json | 6 + .../models/block/light_blue_dog_bowl_2.json | 6 + .../models/block/light_blue_dog_bowl_3.json | 6 + .../block/light_blue_dog_bowl_milk.json | 6 + .../models/block/light_gray_dog_bed.json | 6 + .../models/block/light_gray_dog_bowl_0.json | 6 + .../models/block/light_gray_dog_bowl_1.json | 6 + .../models/block/light_gray_dog_bowl_2.json | 6 + .../models/block/light_gray_dog_bowl_3.json | 6 + .../block/light_gray_dog_bowl_milk.json | 6 + .../models/block/lime_dog_bed.json | 6 + .../models/block/lime_dog_bowl_0.json | 6 + .../models/block/lime_dog_bowl_1.json | 6 + .../models/block/lime_dog_bowl_2.json | 6 + .../models/block/lime_dog_bowl_3.json | 6 + .../models/block/lime_dog_bowl_milk.json | 6 + .../models/block/magenta_dog_bed.json | 6 + .../models/block/magenta_dog_bowl_0.json | 6 + .../models/block/magenta_dog_bowl_1.json | 6 + .../models/block/magenta_dog_bowl_2.json | 6 + .../models/block/magenta_dog_bowl_3.json | 6 + .../models/block/magenta_dog_bowl_milk.json | 6 + .../models/block/orange_dog_bed.json | 6 + .../models/block/orange_dog_bowl_0.json | 6 + .../models/block/orange_dog_bowl_1.json | 6 + .../models/block/orange_dog_bowl_2.json | 6 + .../models/block/orange_dog_bowl_3.json | 6 + .../models/block/orange_dog_bowl_milk.json | 6 + .../models/block/pink_dog_bed.json | 6 + .../models/block/pink_dog_bowl_0.json | 6 + .../models/block/pink_dog_bowl_1.json | 6 + .../models/block/pink_dog_bowl_2.json | 6 + .../models/block/pink_dog_bowl_3.json | 6 + .../models/block/pink_dog_bowl_milk.json | 6 + .../models/block/purple_dog_bed.json | 6 + .../models/block/purple_dog_bowl_0.json | 6 + .../models/block/purple_dog_bowl_1.json | 6 + .../models/block/purple_dog_bowl_2.json | 6 + .../models/block/purple_dog_bowl_3.json | 6 + .../models/block/purple_dog_bowl_milk.json | 6 + .../models/block/red_dog_bed.json | 6 + .../models/block/white_dog_bowl_0.json | 6 + .../models/block/white_dog_bowl_1.json | 6 + .../models/block/white_dog_bowl_2.json | 6 + .../models/block/white_dog_bowl_3.json | 6 + .../models/block/white_dog_bowl_milk.json | 6 + .../models/block/yellow_dog_bed.json | 6 + .../models/block/yellow_dog_bowl_0.json | 6 + .../models/block/yellow_dog_bowl_1.json | 6 + .../models/block/yellow_dog_bowl_2.json | 6 + .../models/block/yellow_dog_bowl_3.json | 6 + .../models/block/yellow_dog_bowl_milk.json | 6 + .../models/item/black_dog_bed.json | 6 + .../models/item/black_dog_bowl.json | 3 + .../models/item/black_foot_paws.json | 7 + .../playercollars/models/item/black_paws.json | 7 + .../models/item/blue_dog_bed.json | 6 + .../models/item/blue_dog_bowl.json | 3 + .../models/item/blue_foot_paws.json | 7 + .../playercollars/models/item/blue_paws.json | 7 + .../models/item/brown_dog_bed.json | 6 + .../models/item/brown_dog_bowl.json | 3 + .../models/item/brown_foot_paws.json | 7 + .../playercollars/models/item/brown_paws.json | 7 + .../models/item/collar_locker.json | 6 + .../models/item/cyan_dog_bed.json | 6 + .../models/item/cyan_dog_bowl.json | 3 + .../models/item/cyan_foot_paws.json | 7 + .../playercollars/models/item/cyan_paws.json | 7 + .../models/item/deed_of_ownership.json | 6 + .../models/item/golden_spatula.json | 6 + .../models/item/gray_dog_bed.json | 6 + .../models/item/gray_dog_bowl.json | 3 + .../models/item/gray_foot_paws.json | 7 + .../playercollars/models/item/gray_paws.json | 7 + .../models/item/green_dog_bed.json | 6 + .../models/item/green_dog_bowl.json | 3 + .../models/item/green_foot_paws.json | 7 + .../playercollars/models/item/green_paws.json | 7 + .../models/item/invisible_fence.json | 6 + .../models/item/light_blue_dog_bed.json | 6 + .../models/item/light_blue_dog_bowl.json | 3 + .../models/item/light_blue_foot_paws.json | 7 + .../models/item/light_blue_paws.json | 7 + .../models/item/light_gray_dog_bed.json | 6 + .../models/item/light_gray_dog_bowl.json | 3 + .../models/item/light_gray_foot_paws.json | 7 + .../models/item/light_gray_paws.json | 7 + .../models/item/lime_dog_bed.json | 6 + .../models/item/lime_dog_bowl.json | 3 + .../models/item/lime_foot_paws.json | 7 + .../playercollars/models/item/lime_paws.json | 7 + .../models/item/magenta_dog_bed.json | 6 + .../models/item/magenta_dog_bowl.json | 3 + .../models/item/magenta_foot_paws.json | 7 + .../models/item/magenta_paws.json | 7 + .../models/item/orange_dog_bed.json | 6 + .../models/item/orange_dog_bowl.json | 3 + .../models/item/orange_foot_paws.json | 7 + .../models/item/orange_paws.json | 7 + .../models/item/pink_dog_bed.json | 6 + .../models/item/pink_dog_bowl.json | 3 + .../models/item/pink_foot_paws.json | 7 + .../playercollars/models/item/pink_paws.json | 7 + .../models/item/purple_dog_bed.json | 6 + .../models/item/purple_dog_bowl.json | 3 + .../models/item/purple_foot_paws.json | 7 + .../models/item/purple_paws.json | 7 + .../models/item/red_dog_bed.json | 6 + .../models/item/red_dog_bowl.json | 3 + .../models/item/red_foot_paws.json | 7 + .../playercollars/models/item/red_paws.json | 7 + .../item/stamped_deed_of_ownership.json | 6 + .../models/item/white_dog_bed.json | 6 + .../models/item/white_dog_bowl.json | 3 + .../models/item/yellow_dog_bed.json | 6 + .../models/item/yellow_dog_bowl.json | 3 + .../models/item/yellow_foot_paws.json | 7 + .../models/item/yellow_paws.json | 7 + .../generated/data/c/tags/items/collars.json | 11 + .../data/minecraft/tags/blocks/beds.json | 21 + .../data/minecraft/tags/blocks/fences.json | 6 + .../building_blocks/invisible_fence.json | 35 ++ .../recipes/decorations/black_dog_bed.json | 35 ++ .../recipes/decorations/black_dog_bowl.json | 35 ++ .../recipes/decorations/blue_dog_bed.json | 35 ++ .../recipes/decorations/blue_dog_bowl.json | 35 ++ .../recipes/decorations/brown_dog_bed.json | 35 ++ .../recipes/decorations/brown_dog_bowl.json | 35 ++ .../recipes/decorations/cyan_dog_bed.json | 35 ++ .../recipes/decorations/cyan_dog_bowl.json | 35 ++ .../recipes/decorations/gray_dog_bed.json | 35 ++ .../recipes/decorations/gray_dog_bowl.json | 35 ++ .../recipes/decorations/green_dog_bed.json | 35 ++ .../recipes/decorations/green_dog_bowl.json | 35 ++ .../decorations/light_blue_dog_bed.json | 35 ++ .../decorations/light_blue_dog_bowl.json | 35 ++ .../decorations/light_gray_dog_bed.json | 35 ++ .../decorations/light_gray_dog_bowl.json | 35 ++ .../recipes/decorations/lime_dog_bed.json | 35 ++ .../recipes/decorations/lime_dog_bowl.json | 35 ++ .../recipes/decorations/magenta_dog_bed.json | 35 ++ .../recipes/decorations/magenta_dog_bowl.json | 35 ++ .../recipes/decorations/orange_dog_bed.json | 35 ++ .../recipes/decorations/orange_dog_bowl.json | 35 ++ .../recipes/decorations/pink_dog_bed.json | 35 ++ .../recipes/decorations/pink_dog_bowl.json | 35 ++ .../recipes/decorations/purple_dog_bed.json | 35 ++ .../recipes/decorations/purple_dog_bowl.json | 35 ++ .../recipes/decorations/red_dog_bed.json | 35 ++ .../recipes/decorations/red_dog_bowl.json | 35 ++ .../recipes/decorations/white_dog_bed.json | 35 ++ .../recipes/decorations/white_dog_bowl.json | 35 ++ .../recipes/decorations/yellow_dog_bed.json | 35 ++ .../recipes/decorations/yellow_dog_bowl.json | 35 ++ .../recipes/misc/black_foot_paws.json | 35 ++ .../advancements/recipes/misc/black_paws.json | 35 ++ .../recipes/misc/blue_foot_paws.json | 35 ++ .../advancements/recipes/misc/blue_paws.json | 35 ++ .../recipes/misc/brown_foot_paws.json | 35 ++ .../advancements/recipes/misc/brown_paws.json | 35 ++ .../advancements/recipes/misc/clicker.json | 35 ++ .../advancements/recipes/misc/collar.json | 35 ++ .../recipes/misc/cyan_foot_paws.json | 35 ++ .../advancements/recipes/misc/cyan_paws.json | 35 ++ .../recipes/misc/deed_of_ownership.json | 35 ++ .../recipes/misc/gray_foot_paws.json | 35 ++ .../advancements/recipes/misc/gray_paws.json | 35 ++ .../recipes/misc/green_foot_paws.json | 35 ++ .../advancements/recipes/misc/green_paws.json | 35 ++ .../recipes/misc/light_blue_foot_paws.json | 35 ++ .../recipes/misc/light_blue_paws.json | 35 ++ .../recipes/misc/light_gray_foot_paws.json | 35 ++ .../recipes/misc/light_gray_paws.json | 35 ++ .../recipes/misc/lime_foot_paws.json | 35 ++ .../advancements/recipes/misc/lime_paws.json | 35 ++ .../recipes/misc/magenta_foot_paws.json | 35 ++ .../recipes/misc/magenta_paws.json | 35 ++ .../recipes/misc/orange_foot_paws.json | 35 ++ .../recipes/misc/orange_paws.json | 35 ++ .../recipes/misc/pink_foot_paws.json | 35 ++ .../advancements/recipes/misc/pink_paws.json | 35 ++ .../recipes/misc/purple_foot_paws.json | 35 ++ .../recipes/misc/purple_paws.json | 35 ++ .../recipes/misc/red_foot_paws.json | 35 ++ .../advancements/recipes/misc/red_paws.json | 35 ++ .../recipes/misc/tagless_collar.json | 35 ++ .../recipes/misc/white_foot_paws.json | 35 ++ .../advancements/recipes/misc/white_paws.json | 35 ++ .../recipes/misc/yellow_foot_paws.json | 35 ++ .../recipes/misc/yellow_paws.json | 35 ++ .../recipes/tools/collar_locker.json | 35 ++ .../recipes/tools/golden_spatula.json | 33 ++ .../recipes/tools/paw_configurator.json | 33 ++ .../loot_tables/blocks/black_dog_bed.json | 29 ++ .../loot_tables/blocks/black_dog_bowl.json | 20 + .../loot_tables/blocks/blue_dog_bed.json | 29 ++ .../loot_tables/blocks/blue_dog_bowl.json | 20 + .../loot_tables/blocks/brown_dog_bed.json | 29 ++ .../loot_tables/blocks/brown_dog_bowl.json | 20 + .../loot_tables/blocks/cyan_dog_bed.json | 29 ++ .../loot_tables/blocks/cyan_dog_bowl.json | 20 + .../loot_tables/blocks/gray_dog_bed.json | 29 ++ .../loot_tables/blocks/gray_dog_bowl.json | 20 + .../loot_tables/blocks/green_dog_bed.json | 29 ++ .../loot_tables/blocks/green_dog_bowl.json | 20 + .../loot_tables/blocks/invisible_fence.json | 20 + .../blocks/light_blue_dog_bed.json | 29 ++ .../blocks/light_blue_dog_bowl.json | 20 + .../blocks/light_gray_dog_bed.json | 29 ++ .../blocks/light_gray_dog_bowl.json | 20 + .../loot_tables/blocks/lime_dog_bed.json | 29 ++ .../loot_tables/blocks/lime_dog_bowl.json | 20 + .../loot_tables/blocks/magenta_dog_bed.json | 29 ++ .../loot_tables/blocks/magenta_dog_bowl.json | 20 + .../loot_tables/blocks/orange_dog_bed.json | 29 ++ .../loot_tables/blocks/orange_dog_bowl.json | 20 + .../loot_tables/blocks/pink_dog_bed.json | 29 ++ .../loot_tables/blocks/pink_dog_bowl.json | 20 + .../loot_tables/blocks/purple_dog_bed.json | 29 ++ .../loot_tables/blocks/purple_dog_bowl.json | 20 + .../loot_tables/blocks/red_dog_bed.json | 29 ++ .../loot_tables/blocks/red_dog_bowl.json | 20 + .../loot_tables/blocks/white_dog_bed.json | 29 ++ .../loot_tables/blocks/white_dog_bowl.json | 20 + .../loot_tables/blocks/yellow_dog_bed.json | 29 ++ .../loot_tables/blocks/yellow_dog_bowl.json | 20 + .../playercollars/recipes/black_dog_bed.json | 18 + .../playercollars/recipes/black_dog_bowl.json | 18 + .../recipes/black_foot_paws.json | 22 + .../playercollars/recipes/black_paws.json | 22 + .../playercollars/recipes/blue_dog_bed.json | 18 + .../playercollars/recipes/blue_dog_bowl.json | 18 + .../playercollars/recipes/blue_foot_paws.json | 22 + .../data/playercollars/recipes/blue_paws.json | 22 + .../playercollars/recipes/brown_dog_bed.json | 18 + .../playercollars/recipes/brown_dog_bowl.json | 18 + .../recipes/brown_foot_paws.json | 22 + .../playercollars/recipes/brown_paws.json | 22 + .../data/playercollars/recipes/clicker.json | 24 + .../data/playercollars/recipes/collar.json | 24 + .../playercollars/recipes/collar_locker.json | 21 + .../playercollars/recipes/cyan_dog_bed.json | 18 + .../playercollars/recipes/cyan_dog_bowl.json | 18 + .../playercollars/recipes/cyan_foot_paws.json | 22 + .../data/playercollars/recipes/cyan_paws.json | 22 + .../recipes/deed_of_ownership.json | 21 + .../playercollars/recipes/golden_spatula.json | 21 + .../playercollars/recipes/gray_dog_bed.json | 18 + .../playercollars/recipes/gray_dog_bowl.json | 18 + .../playercollars/recipes/gray_foot_paws.json | 22 + .../data/playercollars/recipes/gray_paws.json | 22 + .../playercollars/recipes/green_dog_bed.json | 18 + .../playercollars/recipes/green_dog_bowl.json | 18 + .../recipes/green_foot_paws.json | 22 + .../playercollars/recipes/green_paws.json | 22 + .../recipes/invisible_fence.json | 24 + .../recipes/light_blue_dog_bed.json | 18 + .../recipes/light_blue_dog_bowl.json | 18 + .../recipes/light_blue_foot_paws.json | 22 + .../recipes/light_blue_paws.json | 22 + .../recipes/light_gray_dog_bed.json | 18 + .../recipes/light_gray_dog_bowl.json | 18 + .../recipes/light_gray_foot_paws.json | 22 + .../recipes/light_gray_paws.json | 22 + .../playercollars/recipes/lime_dog_bed.json | 18 + .../playercollars/recipes/lime_dog_bowl.json | 18 + .../playercollars/recipes/lime_foot_paws.json | 22 + .../data/playercollars/recipes/lime_paws.json | 22 + .../recipes/magenta_dog_bed.json | 18 + .../recipes/magenta_dog_bowl.json | 18 + .../recipes/magenta_foot_paws.json | 22 + .../playercollars/recipes/magenta_paws.json | 22 + .../playercollars/recipes/orange_dog_bed.json | 18 + .../recipes/orange_dog_bowl.json | 18 + .../recipes/orange_foot_paws.json | 22 + .../playercollars/recipes/orange_paws.json | 22 + .../recipes/paw_configurator.json | 18 + .../playercollars/recipes/pink_dog_bed.json | 18 + .../playercollars/recipes/pink_dog_bowl.json | 18 + .../playercollars/recipes/pink_foot_paws.json | 22 + .../data/playercollars/recipes/pink_paws.json | 22 + .../playercollars/recipes/purple_dog_bed.json | 18 + .../recipes/purple_dog_bowl.json | 18 + .../recipes/purple_foot_paws.json | 22 + .../playercollars/recipes/purple_paws.json | 22 + .../playercollars/recipes/red_dog_bed.json | 18 + .../playercollars/recipes/red_dog_bowl.json | 18 + .../playercollars/recipes/red_foot_paws.json | 22 + .../data/playercollars/recipes/red_paws.json | 22 + .../playercollars/recipes/tagless_collar.json | 20 + .../playercollars/recipes/white_dog_bed.json | 18 + .../playercollars/recipes/white_dog_bowl.json | 18 + .../recipes/white_foot_paws.json | 22 + .../playercollars/recipes/white_paws.json | 22 + .../playercollars/recipes/yellow_dog_bed.json | 18 + .../recipes/yellow_dog_bowl.json | 18 + .../recipes/yellow_foot_paws.json | 22 + .../playercollars/recipes/yellow_paws.json | 22 + .../playercollars/tags/items/foot_paws.json | 21 + .../data/playercollars/tags/items/paws.json | 21 + .../trinkets/tags/items/chest/necklace.json | 7 + .../data/trinkets/tags/items/feet/shoes.json | 6 + .../data/trinkets/tags/items/hand/glove.json | 6 + .../jlortiz/playercollars/OwnerComponent.java | 10 + .../playercollars/PlayerCollarsMod.java | 427 ++++++++++++++++-- .../playercollars/block/DogBedBlock.java | 34 ++ .../playercollars/block/DogBowlBlock.java | 206 +++++++++ .../block/InvisibleFenceBlock.java | 129 ++++++ .../playercollars/client/CollarRenderer.java | 51 +-- .../playercollars/client/FootPawRenderer.java | 44 ++ .../playercollars/client/PawRenderer.java | 71 +++ .../playercollars/client/RegisterClient.java | 93 +++- .../client/RotationLerpHandler.java | 56 +-- .../client/screen/CollarDyeScreen.java | 115 +++++ .../client/screen/DeedItemScreen.java | 57 +++ .../client/screen/PawsConfigScreen.java | 88 ++++ .../client/screen/PawsSelectScreen.java | 45 ++ .../client/screen/TagLikeListWidget.java | 133 ++++++ .../enchantment/AudibleEnchantment.java | 28 ++ .../enchantment/HealingEnchantment.java | 45 ++ .../enchantment/SpikedEnchantment.java | 44 ++ .../enchantment/TightLeashEnchantment.java | 28 ++ .../playercollars/item/ClickerItem.java | 124 +++-- .../playercollars/item/CollarItem.java | 213 ++++----- .../playercollars/item/CollarLockerItem.java | 62 +++ .../jlortiz/playercollars/item/DeedItem.java | 64 +++ .../playercollars/item/DummyBoneItem.java | 15 + .../playercollars/item/FootPawsItem.java | 52 +++ .../item/OwnershipCraftingRecipe.java | 103 +++++ .../playercollars/item/PawSetupItem.java | 54 +++ .../jlortiz/playercollars/item/PawsItem.java | 69 +++ .../playercollars/item/SpatulaItem.java | 59 +++ .../playercollars/item/StampedDeedItem.java | 38 ++ .../playercollars/leash/LeashImpl.java | 2 + .../playercollars/leash/LeashProxyEntity.java | 134 +++--- .../leash/mixin/MixinFireworkRocketItem.java | 28 ++ .../leash/mixin/MixinLeashKnotEntity.java | 35 ++ .../leash/mixin/MixinPlayerEntity.java | 23 +- .../leash/mixin/MixinServerPlayerEntity.java | 224 ++++----- .../leash/mixin/MixinServerWorld.java | 10 +- .../leash/mixin/MixinTridentItem.java | 24 + .../leash/mixin/MixinTurtleEntity.java | 28 +- .../playercollars/mixin/BoneItemMixin.java | 24 + .../ClientPlayerInteractionManagerMixin.java | 53 +++ .../mixin/LivingEntityMixin.java | 34 ++ .../mixin/MixinBindingCurseEnchantment.java | 20 + .../playercollars/mixin/MixinEnchantment.java | 19 + .../mixin/MixinEnchantmentHelper.java | 40 ++ .../mixin/PlayerEntityMixin.java | 128 ++++++ .../mixin/PlayerRendererMixin.java | 51 +++ .../playercollars/network/ModPackets.java | 37 ++ .../network/PacketLookAtLerped.java | 33 ++ .../network/PacketOpenPawsConfig.java | 83 ++++ .../network/PacketStampDeed.java | 37 ++ .../network/PacketUpdateCollar.java | 48 ++ .../network/PawsConfigScreenHandler.java | 190 ++++++++ .../playercollars/util/LeashedUtil.java | 18 + .../jlortiz/playercollars/util/NbtUtil.java | 118 +++++ .../playercollars/util/TagKeyUtil.java | 28 ++ .../resources/META-INF/accesstransformer.cfg | 7 + src/main/resources/META-INF/mods.toml | 72 ++- .../resources/assets/playercollars/icon.png | Bin 0 -> 2269 bytes .../playercollars/item/paw_configurator.json | 6 + .../assets/playercollars/item/paws.json | 16 + .../playercollars/lang/en_us.existing.json | 75 +++ .../models/block/red_dog_bowl_0.json | 64 +++ .../models/block/red_dog_bowl_1.json | 73 +++ .../models/block/red_dog_bowl_2.json | 73 +++ .../models/block/red_dog_bowl_3.json | 111 +++++ .../models/block/red_dog_bowl_milk.json | 6 + .../models/block/white_dog_bed.json | 147 ++++++ .../models/item/paw_configurator.json | 19 + .../models/item/tagless_collar.json | 128 ++++++ .../models/item/white_foot_paws.json | 298 ++++++++++++ .../playercollars/models/item/white_paws.json | 292 ++++++++++++ .../textures/gui/paw_controller.png | Bin 0 -> 696 bytes .../textures/gui/paw_controller_widgets.png | Bin 0 -> 265 bytes .../textures/item/collar_locker.png | Bin 0 -> 323 bytes .../textures/item/deed_of_ownership.png | Bin 0 -> 371 bytes .../textures/item/golden_spatula.png | Bin 0 -> 377 bytes .../textures/item/paw_configurator.png | Bin 0 -> 423 bytes .../item/stamped_deed_of_ownership.png | Bin 0 -> 401 bytes .../textures/item/white_dog_bed.png | Bin 0 -> 653 bytes .../textures/slot/empty_feet_slot.png | Bin 0 -> 176 bytes .../data/curios/tags/items/feet.json | 21 + .../data/curios/tags/items/hands.json | 21 + .../data/curios/tags/items/necklace.json | 11 +- .../curios/entities/playercollars.json | 4 + .../data/playercollars/curios/slots/feet.json | 5 + .../recipes/generic_collar_ownership.json | 7 + .../tags/blocks/paws_allow_interact.json | 11 + src/main/resources/pack.mcmeta | 5 +- .../playercollars.leashplayers.mixins.json | 18 + src/main/resources/playercollars.mixins.json | 36 +- 492 files changed, 12226 insertions(+), 834 deletions(-) create mode 100644 .gradle/8.1.1/checksums/checksums.lock create mode 100644 .gradle/8.1.1/checksums/md5-checksums.bin create mode 100644 .gradle/8.1.1/checksums/sha1-checksums.bin create mode 100644 .gradle/8.1.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/8.1.1/dependencies-accessors/gc.properties create mode 100644 .gradle/8.1.1/executionHistory/executionHistory.bin create mode 100644 .gradle/8.1.1/executionHistory/executionHistory.lock create mode 100644 .gradle/8.1.1/fileChanges/last-build.bin create mode 100644 .gradle/8.1.1/fileHashes/fileHashes.bin create mode 100644 .gradle/8.1.1/fileHashes/fileHashes.lock create mode 100644 .gradle/8.1.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/8.1.1/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 Git Redundancy - Delete me! create mode 100644 src/main/generated/assets/playercollars/blockstates/black_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/black_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/blue_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/brown_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/brown_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/cyan_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/cyan_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/gray_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/green_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/green_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/invisible_fence.json create mode 100644 src/main/generated/assets/playercollars/blockstates/light_blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/light_blue_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/light_gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/light_gray_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/lime_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/lime_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/magenta_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/magenta_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/orange_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/orange_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/pink_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/pink_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/purple_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/purple_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/red_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/red_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/white_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/white_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/blockstates/yellow_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/blockstates/yellow_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/lang/en_us.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/black_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/blue_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/brown_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/cyan_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/gray_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/green_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/invisible_fence_post.json create mode 100644 src/main/generated/assets/playercollars/models/block/invisible_fence_side.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_blue_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/light_gray_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/lime_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/magenta_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/orange_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/pink_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/purple_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/red_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/white_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/white_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/white_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/white_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/white_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_0.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_1.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_2.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_3.json create mode 100644 src/main/generated/assets/playercollars/models/block/yellow_dog_bowl_milk.json create mode 100644 src/main/generated/assets/playercollars/models/item/black_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/black_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/black_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/black_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/blue_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/blue_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/blue_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/brown_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/brown_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/brown_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/brown_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/collar_locker.json create mode 100644 src/main/generated/assets/playercollars/models/item/cyan_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/cyan_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/cyan_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/cyan_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/deed_of_ownership.json create mode 100644 src/main/generated/assets/playercollars/models/item/golden_spatula.json create mode 100644 src/main/generated/assets/playercollars/models/item/gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/gray_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/gray_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/gray_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/green_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/green_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/green_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/green_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/invisible_fence.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_blue_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_blue_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_blue_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_blue_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_gray_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_gray_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_gray_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/light_gray_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/lime_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/lime_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/lime_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/lime_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/magenta_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/magenta_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/magenta_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/magenta_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/orange_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/orange_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/orange_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/orange_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/pink_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/pink_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/pink_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/pink_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/purple_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/purple_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/purple_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/purple_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/red_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/red_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/red_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/red_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/stamped_deed_of_ownership.json create mode 100644 src/main/generated/assets/playercollars/models/item/white_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/white_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/yellow_dog_bed.json create mode 100644 src/main/generated/assets/playercollars/models/item/yellow_dog_bowl.json create mode 100644 src/main/generated/assets/playercollars/models/item/yellow_foot_paws.json create mode 100644 src/main/generated/assets/playercollars/models/item/yellow_paws.json create mode 100644 src/main/generated/data/c/tags/items/collars.json create mode 100644 src/main/generated/data/minecraft/tags/blocks/beds.json create mode 100644 src/main/generated/data/minecraft/tags/blocks/fences.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/building_blocks/invisible_fence.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/black_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/brown_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/cyan_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/green_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/light_blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/light_gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/lime_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/magenta_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/orange_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/pink_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/purple_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/red_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/white_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bed.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/decorations/yellow_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/black_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/black_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/blue_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/blue_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/brown_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/brown_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/clicker.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/collar.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/cyan_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/cyan_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/deed_of_ownership.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/gray_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/gray_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/green_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/green_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/light_blue_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/light_gray_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/lime_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/lime_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/magenta_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/magenta_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/orange_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/orange_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/pink_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/pink_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/purple_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/purple_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/red_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/red_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/tagless_collar.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/white_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/white_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/yellow_foot_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/misc/yellow_paws.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/tools/collar_locker.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/tools/golden_spatula.json create mode 100644 src/main/generated/data/playercollars/advancements/recipes/tools/paw_configurator.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/black_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/brown_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/cyan_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/green_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/invisible_fence.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/light_blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/light_gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/lime_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/magenta_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/orange_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/pink_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/purple_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/red_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/white_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bed.json create mode 100644 src/main/generated/data/playercollars/loot_tables/blocks/yellow_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/black_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/black_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/black_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/black_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/blue_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/blue_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/brown_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/brown_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/brown_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/brown_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/clicker.json create mode 100644 src/main/generated/data/playercollars/recipes/collar.json create mode 100644 src/main/generated/data/playercollars/recipes/collar_locker.json create mode 100644 src/main/generated/data/playercollars/recipes/cyan_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/cyan_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/cyan_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/cyan_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/deed_of_ownership.json create mode 100644 src/main/generated/data/playercollars/recipes/golden_spatula.json create mode 100644 src/main/generated/data/playercollars/recipes/gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/gray_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/gray_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/green_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/green_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/green_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/green_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/invisible_fence.json create mode 100644 src/main/generated/data/playercollars/recipes/light_blue_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/light_blue_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/light_blue_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/light_blue_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/light_gray_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/light_gray_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/light_gray_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/light_gray_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/lime_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/lime_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/lime_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/lime_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/magenta_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/magenta_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/magenta_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/magenta_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/orange_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/orange_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/orange_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/orange_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/paw_configurator.json create mode 100644 src/main/generated/data/playercollars/recipes/pink_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/pink_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/pink_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/pink_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/purple_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/purple_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/purple_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/purple_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/red_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/red_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/red_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/red_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/tagless_collar.json create mode 100644 src/main/generated/data/playercollars/recipes/white_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/white_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/white_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/white_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/yellow_dog_bed.json create mode 100644 src/main/generated/data/playercollars/recipes/yellow_dog_bowl.json create mode 100644 src/main/generated/data/playercollars/recipes/yellow_foot_paws.json create mode 100644 src/main/generated/data/playercollars/recipes/yellow_paws.json create mode 100644 src/main/generated/data/playercollars/tags/items/foot_paws.json create mode 100644 src/main/generated/data/playercollars/tags/items/paws.json create mode 100644 src/main/generated/data/trinkets/tags/items/chest/necklace.json create mode 100644 src/main/generated/data/trinkets/tags/items/feet/shoes.json create mode 100644 src/main/generated/data/trinkets/tags/items/hand/glove.json create mode 100644 src/main/java/org/jlortiz/playercollars/OwnerComponent.java create mode 100644 src/main/java/org/jlortiz/playercollars/block/DogBedBlock.java create mode 100644 src/main/java/org/jlortiz/playercollars/block/DogBowlBlock.java create mode 100644 src/main/java/org/jlortiz/playercollars/block/InvisibleFenceBlock.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/FootPawRenderer.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/PawRenderer.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/screen/CollarDyeScreen.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/screen/DeedItemScreen.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/screen/PawsConfigScreen.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/screen/PawsSelectScreen.java create mode 100644 src/main/java/org/jlortiz/playercollars/client/screen/TagLikeListWidget.java create mode 100644 src/main/java/org/jlortiz/playercollars/enchantment/AudibleEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/enchantment/HealingEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/enchantment/SpikedEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/enchantment/TightLeashEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/CollarLockerItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/DeedItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/DummyBoneItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/FootPawsItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/OwnershipCraftingRecipe.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/PawSetupItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/PawsItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/SpatulaItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/item/StampedDeedItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/leash/mixin/MixinFireworkRocketItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/leash/mixin/MixinLeashKnotEntity.java create mode 100644 src/main/java/org/jlortiz/playercollars/leash/mixin/MixinTridentItem.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/BoneItemMixin.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/ClientPlayerInteractionManagerMixin.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/LivingEntityMixin.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/MixinBindingCurseEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantment.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/MixinEnchantmentHelper.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/PlayerEntityMixin.java create mode 100644 src/main/java/org/jlortiz/playercollars/mixin/PlayerRendererMixin.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/ModPackets.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/PacketLookAtLerped.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/PacketOpenPawsConfig.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/PacketStampDeed.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/PacketUpdateCollar.java create mode 100644 src/main/java/org/jlortiz/playercollars/network/PawsConfigScreenHandler.java create mode 100644 src/main/java/org/jlortiz/playercollars/util/LeashedUtil.java create mode 100644 src/main/java/org/jlortiz/playercollars/util/NbtUtil.java create mode 100644 src/main/java/org/jlortiz/playercollars/util/TagKeyUtil.java create mode 100644 src/main/resources/META-INF/accesstransformer.cfg create mode 100644 src/main/resources/assets/playercollars/icon.png create mode 100644 src/main/resources/assets/playercollars/item/paw_configurator.json create mode 100644 src/main/resources/assets/playercollars/item/paws.json create mode 100644 src/main/resources/assets/playercollars/lang/en_us.existing.json create mode 100644 src/main/resources/assets/playercollars/models/block/red_dog_bowl_0.json create mode 100644 src/main/resources/assets/playercollars/models/block/red_dog_bowl_1.json create mode 100644 src/main/resources/assets/playercollars/models/block/red_dog_bowl_2.json create mode 100644 src/main/resources/assets/playercollars/models/block/red_dog_bowl_3.json create mode 100644 src/main/resources/assets/playercollars/models/block/red_dog_bowl_milk.json create mode 100644 src/main/resources/assets/playercollars/models/block/white_dog_bed.json create mode 100644 src/main/resources/assets/playercollars/models/item/paw_configurator.json create mode 100644 src/main/resources/assets/playercollars/models/item/tagless_collar.json create mode 100644 src/main/resources/assets/playercollars/models/item/white_foot_paws.json create mode 100644 src/main/resources/assets/playercollars/models/item/white_paws.json create mode 100644 src/main/resources/assets/playercollars/textures/gui/paw_controller.png create mode 100644 src/main/resources/assets/playercollars/textures/gui/paw_controller_widgets.png create mode 100644 src/main/resources/assets/playercollars/textures/item/collar_locker.png create mode 100644 src/main/resources/assets/playercollars/textures/item/deed_of_ownership.png create mode 100644 src/main/resources/assets/playercollars/textures/item/golden_spatula.png create mode 100644 src/main/resources/assets/playercollars/textures/item/paw_configurator.png create mode 100644 src/main/resources/assets/playercollars/textures/item/stamped_deed_of_ownership.png create mode 100644 src/main/resources/assets/playercollars/textures/item/white_dog_bed.png create mode 100644 src/main/resources/assets/playercollars/textures/slot/empty_feet_slot.png create mode 100644 src/main/resources/data/curios/tags/items/feet.json create mode 100644 src/main/resources/data/curios/tags/items/hands.json create mode 100644 src/main/resources/data/playercollars/curios/entities/playercollars.json create mode 100644 src/main/resources/data/playercollars/curios/slots/feet.json create mode 100644 src/main/resources/data/playercollars/recipes/generic_collar_ownership.json create mode 100644 src/main/resources/data/playercollars/tags/blocks/paws_allow_interact.json create mode 100644 src/main/resources/playercollars.leashplayers.mixins.json diff --git a/.gradle/8.1.1/checksums/checksums.lock b/.gradle/8.1.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..41dcf69e3f4f1f16c4b7abc4cf7702c9ae9a939e GIT binary patch literal 17 UcmZQxxmbYz@G5mX1_@ zIyt%d0s0dn);wMx#UF5xb0Nv)CLzgL(+Z(h84M$gVrrDi2oNAZfB*pk1PBlyK!5-N z0t5&UAV7csf&U`Vjt?2nA5*KBvSe~Ugr$j?lpbGq4z><2j`QiwX7PW}eZFqIZGTjU z^-fVQ##nFWb9w><2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK;SP0mg8abvCU?!QhvD%XNzgtxT-!pwN7_K7(4%--do6Tv~m~6mf{OI$af&;9!?T2`PPt12)U{LAi^kSN2Q7Y0RjXF5FkK+009C7 z2oNAZfB*pk1PBoLF9O@~AYFuz+dvbM_PFG9A`-A4o&HDSn z$Mm4z8uo|Z*e|7XG64bv2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBly@RtIs@n_3%}DNEXFd ryNjv#d)HF!di=FlZ(Q~s_ioEa=f~B0d|Qy|^b7aN!WfGiF%^FR%Ew2& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e761aa095fcbd6edabf32fdf99c9f081c9036ce0 GIT binary patch literal 17 TcmZSnoxkYz+RP>u1}FdkJ!b@` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2070c4139c7fd98d5c468bef2d819223a0f5876a GIT binary patch literal 488416 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 AZ2$lO literal 0 HcmV?d00001 diff --git a/.gradle/8.1.1/fileHashes/fileHashes.lock b/.gradle/8.1.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..f1075c7977ba5b07dc74c969973d6c72d1a7ff08 GIT binary patch literal 17 UcmZS1Qa{gCIyHuo0Ss7p0VJ9N<^TWy literal 0 HcmV?d00001 diff --git a/.gradle/8.1.1/fileHashes/resourceHashesCache.bin b/.gradle/8.1.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..2478a56fa52e08ad8d1820431a00a07075b1d2f7 GIT binary patch literal 20299 zcmeI3`!|&NAHb)ut=nd#RiQS%$tCyFB#GTs=H`~QS`^t7qg|I3GD3FTZ$q=z&}C96 z!>)uACWJ&$a^FAFK``5DeuO4|YU5nU2&JuzIkMDObSv2dvQx`^Kyy+%Rrq1$Yw8 zNtAz~qa5ROHsEP3+-Eg~rd=4feFivN;TILh`};~UZl?`+W^eQZt08qF#>sPl=Qd;# zC%S!~VVn{J_~nc|Ni)SK78s|05BN1_85yqp6&^mv0q`P0NWnCZtc!8m2EdDhw+#Fy z_?wP#8y4WDUK?FaDV#anj|9BN!0kcypocZaX)5pe3B?yWv{&Xh9|pX>&9mD%D?T2d z-vanU#~5~{n!6Fk?N$NadD>`rPuQE?7$*k-{#5_uM2J@16h6lb@R9OguJ!i?T*P?+ z;G@qce*e1cu{Xx)ZvY=_z04R;tQo_(G~ln>T8xF`llL)Bl?8m#<0ds-HeVg%e|~k;{G1MiMh&c*(Ia`oF4{U$**|YuS1C6?sPifY98y7 zGxXU>m{0Kpe3PS{y|B>&|Bj403%Gi@wz>cAv-o{Q*9Ba&juU>ih!l&@X$D;DvnC%w z=wJAAMDKdfsTX!Md79w;se13Z@ZoS!>Q)nM4z(O`?fIXSSDkb2$2j>h;QFlIz7-rd zCcds3;Ct5`=^xN#a&eyn_`Yv02O5&w-El4tI3+w@PLZ>E8^&qTfYZL(H61y|$DdPb zCg2BLqEtk??G-VfY6tisj|q--t^@x3QbqyyxLLc#XSn(~zODh_UZSEX(s8S4jN7^c ze(XgoJxo9548|#Y0Y7n&_nXWQ$0IRLF9ZC04<)JTv0*2C&U(ND?eqhBy&w7Dd^h0C zarPxsb>s6Gw|NOTcqb5~q_NM?e^dY!Km||%Q~(t~1yBK002M$5Pyti`6+i`00aO4L zKm||%Q~(t~1yBK002M$5Pyti`6+i`00aO4LKm||%Q~(t~1yBK0;D4)t_{YfW7yraR z>Ln^9cCk{J@Ahs#+8F2LJJ9>ZBHZ}j#<<1UxFOxZOqTzMDC%L^z(yr|;Y7`BGk?m$ zcj776B@8yUQsd2(T4r=FCCqG=x6cx9Raml$ifORzD6Nb5+F|cvFTv|{^ zsPsy*XxDR>4f_)|2sMQ|){{olf`IF7)#-D~6!U%ToaQw6-420M|3`jJWVsw}f6t+{JMUB*z()V(m{1Lxaq4FRd%2h~ zuVt!lX;I5h&l#pzZn<}QDEwk7Ji}kV$Yt`irgXFS-lOLYMy|nz!v^9^YMgC*_{Rap z5rzqMu%Y|1!A!d*c)XKSSz?se@enqWgH1B))AKIHlYWY8oErEGHZ;Ep={r}(vH7^8 zO~g2*Ed?8EnrP4M zRFan?$wa(&Vaau|Ivv*9DkW|HX~OT+^QXs=G@YPSvJfQ<;Zw}qQ%w^uq&rrk=B zi8~1!8}s*D{P>KKd|ToSt^IK%y*$PA{aI=GWh2gJL?6;JXM0$fogV)t zlpjTU?Yb$-X_-5y=FCCkU$@&!72GA!yf5k$!K(}g=BZZE1RnAQ38!Y-8WUk-gsG&x zVs1op|Czk|^FLNDW0Y7Q$q{zlKHQL7r8gThz6+kAIC1}hMTnNa%FjWJ#6+7u*l_H8 z@~hg=m!9ri39`^q#SAull1!8Wx^=d%-J|bvgVAaZ8zmKmUJ1Di5&nM@rVcc-Q(z-J z>~P~Mbr!{}@_FWs(~+vMac9npq4_54d3OJQG<-9P17Sm{u`r4#*(eb>TAb4%Wnc#z pcl|bx-E00wjyasxtwY$51slSWtqBTQNlgoGecY+6YI0|Y1o050_d+5i9m literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f371cf3c0a2bf8e9d006a2597171939ef748076b GIT binary patch literal 19073 zcmeI%Ur18{6vy$~E|zAcURuo{wZ!${g35?8gK0u@PQx1hX*Lq7sZriI5pmjAj`Tfl{)pbZy;plJI3jfy8gH?eg8ZXZL>gxMD%j zq(v`{2~UA&j#+VeXiMMzQJoWU(S74vK~0TexRM^ZNGYhxXXQer=8{-xxcTt zB%5yP9@G2^?qS_vxI=q3jppZY|6&gXFI)2HdkvM`zlDUY*R=~LlzBrf_lf6M!}-AyW{J%!wpmxLsb>mXgf;Xe12=ANbFPhXy+`7!QN zg1^r$`A#U^Sjs(Pe5Lh9Ml1Q0baKx&iiK6Bi@NAKpKxENx?}y&&|gFQ&v4Iw<&?A5 zq%NlUT*8w^SzZ3IPZ}00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG`~CJW?6FD@zioE3Y< lUKadTqG3jrc&_ko%}l@dcs5TzE1vRaoB!Qe@ofG%^8+eevw8pk literal 0 HcmV?d00001 diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..15ab98a6e4e221f062d1e61c0c52a84eb3b57160 GIT binary patch literal 8 PcmZQzV4U+`XGJmq2~7gj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4b4f59d054190f39879689c294cfc560fe9fdb27 GIT binary patch literal 2269 zcmb_di#L>88{hBCiv}Grh7NMe*9;n(bk%4u7($cFspQVlDYtUX9BPmnWXL6vds4_q zipVXDCgsCXpq(^ATgjq+Mgah1 zttn&&03eYI0VxR)xQ0CN6Ty}Xl+&RANGtqfk@*jqq7zronVVCs&CN9~garGY3-}d) zOL;LjiIfhKD%->Ho|dAd9)scgz#c{dTtY;w{!pB)=sFAH~O+p-AChcMIx)T^cV z%@>P7J?(yOC1*DCm-q$$ z9@`)e%q~hcehBI8V(Jb6AhBspHg&p`w=mknL^~@>c-}fpTwfsh$(6`AN!Ph2WXJWV zT#VhKdAmp@lI+&d*O^f36&$BzhLIeBW)+3EV zdw11wyWH%Pi-A4CgC;b+*X+F|Pqw;bY!WKa&&i8QZ`yLzgxvfe-W;Vn*Q3ukD3N4y zs9R+5+6hM68YG(3mutkvyrH*g*_$RFA0Jmg>+Q2$)zi|N2&p1wQn! z!MqxGyCK@?lEWAJ>H_(zg_tBZp`>QWEQ%T0J&TL0C|Z z8$C1ZP#7h=uwD#P!DGCR`7u+`nl29bbc8`$CIyPh4lU2`Cc2PvAK2y zDFVK~7wGfFh4TXhq%YC^)91hQpFsMAt|G3q9}5r-Su5yM_gZ~#uo;aj)%*V~^O}Wu|JTo1U3pb#b zjKj7%G>ZQ*F{|w=$v*hC99UVC#w{zbWD>UGQ+U(mJMVDj6}j3f(RR7wJ;MS$nOOQTRfGb>Fku|G%^u>6OxA^JV?oXtbej~4G=)J7T}&(I|pp)?c_O-BZNo3Z3kj~-S-47K}>Gi(h|MSI4WoDein zDv2a-(FcQ&T(fo(tU(npu_!vJ-?#(|V2edY36MfJYfo|Bwis`_Xii;)x$Ww$mm^wo zd9eqL%HNkcC1&F3e14NX6k-a^8@!9uGefma992Wo2Gi~`M0r02^E8Qw+}uKPSGOWb z5aGB5F(g*jf84Qlnw`PUAFkdeX7?1lC-P1D{axY%b(X>|P703(W5I7jb*2>!%4o3D zundTP9o;4iOIJmTfkrHEV!U2eM92}jhvb{f3|0C&9)cqI{`e{&65y$FSqe=YL5b?$ z`UIwX?rSO01K83o7|16phan(~v4e(y*pln+5UGe)d=kiEX}l~5{Wz$tMAB_LNz>;V ze`@+@iy{IPA}LTn5=>9zoB%pD8njVQjExehqMhM>;C7z5M|dcvZD?~BZMRp*loPOl zEOUQ{u+WehMCw2TBisK%z#Eb-xSf-3uI3E7q5T|Z&@g6+1r&;iK98l>q?$q`t*4l_ z+aXl&=>8#en`WvWO{n?SRoav1bHn|LR8}Pj!6d+RvW+6C+l&g*C{9r3daEJ`xWLon zXG&|(7BokSuTP-Bzvk0cCo4N108eiR3~3e%IJOYT7L~%f1rHfRSIC zQd=g9Ig~0PW9$?(e$o#Cd($QjV;nWH;DKueeCnhW3g~86f@?AjFugldA9%uOaKRb^ iDmcJRhyTZ^<2R))8-0nAiawq4ccit2J(*?Z8TS`o8^QDd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4e74dc1f957a7e7d750a75233e76accba200fb80 GIT binary patch literal 696 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZzY=1HA;AcrO0(btiI zVPik{pF~z5Um@8e$d`ekN{xY`p@o6r7f`6-1p`B=0RzLU1O^7H84L{K1#@-<+5jaa z0(?STfiw{O|NsBkv18rc-JzkO=H})=k=X*RhCqt3B*-tA!Qt7BG$4nwz$3Dlfq`2X zgc%uT&5-~KvX^-Jy0X9I5@F{O{iUgt4%Bnk)5S5Q;?~={r~8@=BpL#%67T(=*voCM zEUHs-sovuLq#Ya7FHR7L(oY1i8`7f1A~Eb3DbeHpxKEd>mh9oi49V4lI|s^sEdaD*x1P>jB&=d^zZo}ZU=U)<2z*x2~+>^*S_ zA*FLd8Z|jt2?_6)`!8m_xPn>3yX6MMJ{R*f3=H23r5-Z;O<@FD#o+1c=d#Wzp$P!* CcTXq) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..32f2ea14fd804b86f2440871a7ba2cc7c52909eb GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD* z^*N8$^_`P=6}cgEU-5Isu-kWRZ2!N%wQsKAa_$MH>*KexxfUk`aKy;m6cEcXTd19s zkdUCEt9|g5k(w9t#MX$`8%zSKJO!;bW(CjBF}Iz$lH$fA{(!4CC$Z%+x1?rgh3WYj z#`6mlX3dOBx?o^doAmI?%f}I!i+CKqD__*x0kqQX(^75*hC_v<~Xtc z)eGYoUcG_VZl^5k5r*2g4Z*hcA6b(Sy?f zdmWzt`!8iOy#4ryL6}dD!Ombh!;#C7kVghM4e&A%`!6rS&M<9L1cR-?Ook)C0K=AM zunKybi2Qdj7Gjvc{SinBz0<@W%;oyZg4A&ohB^b?c1>R<&|NjAb z4hBLD3${NYN;67I^a9#!uP?x`V8>I2>yN(^v>9tOYRPl||M&Ml!;L4n{Y-Q$5SvQ@ XccE+%ZOgWv00000NkvXXu0mjfhYO>9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b672b1e27eb1470c868f469cb28bea15d506fd27 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*hw*8#J zGY_dLyu9WnF}-2#Q@KNWk4!IBHp(1OD(9G3!NM*0HYL{MaY^8W6A4q3Hj7y$mTl7M zm=wOZGXLNIdgIUhf6`eTZMmDOo?Xj3r+V}4z8xJ0`nx$>s`nK)M6G9O*peXHwzT1k z`qO{wo=r1a8}790fl8b~Z58W+zjsbP<-Pi(c=y6f_I$E}j4AueCmiX%#A!Dv^<3x)42ZGq?>WhrkQ(r`dA(wp4z*_ zujk*1byf#z_NVQOf8P7$IQya6w@LCm_wO4V>zE__w?9bim;_@1L!w;F^jBq)-3= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ca0c0d7089937eb76a7dc3bde9f50b1090c9347b GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbU*R5N3?b@|Je?GOhw=*2vcYBfWrWCpMb)g1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6 zo}X)of~lUNp4p#^$JYbZ@TEq0ruq6ZXaU(AKnwzxf+qvXC7v#hAr}5yFL3fTD+sU# zwE3R;%YWyl2D9Uu+&`RMKluY<_nr_wQ26Dc*#fQuzimILH+a3VC}#{U+SZb$=#k&} z-SATcL+siHqvo*scfuL2N9Hi|FrQ;MBNuCu)cEDHoGe3zyl@)lkFNzfj{o~D<=wql zm8Zt6XAsOgxU;9Sa7GV98N>Mk#^7wtkXMRq4_@&u@Ur)5JhPuYxup73|A8m*0k5UM WNy~6Bi)n*g&*16m=d#Wzp$P!x=aG*9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8c36c93672b120954dec409de2c4c5d9a3a26857 GIT binary patch literal 653 zcmV;80&@L{P)<0i)tGAb#Q{~bj7%~i<_oK0|0{eLLjYk!C1&cW>|zd{^>t6(RCh6+ z<=yvZ4Jk#F0X~s9&UC{f-XNacv~yC6lWPMvev4p+a)};D7LYwq|L1%1sI;fWV7we@p=VyFj~X z+uz5w-97>Q&%l+|_19a#+$ZVHt`<20hPQ!>>#ip60hc?#=#wrPk|X(P38fP7en#I^ z07hFFE(--^6HLa!U=)p&5n)mLKEc=fN zW~O`vE_S8O@@>o{$@y|KA}Bvpwk)1O_EsWL9R(qfWOb^Cuj4y%i1^Mvy{n{M1*)@z zqX?_wfUrhg8TtKA+Fus-QnTkU0q#mZEYPL9jEqhPXJ0;dAc};RLn_EIKV8z!YaW! zvw_ErjnOTQQKOkt-np^Sk>LcxCkGFPmPQ_TwNya?=YScF2Ll2a`lm9?+00ZZutM!7 P&=dwwS3j3^P6