diff --git a/gradle.properties b/gradle.properties index cfb66705..68038cb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21.5 - yarn_mappings=1.21.5+build.1 + minecraft_version=1.21.8 + yarn_mappings=1.21.8+build.1 loader_version=0.19.3 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.128.2+1.21.5 + fabric_version=0.136.1+1.21.8 diff --git a/src/client/java/net/errorcraft/itematic/access/client/MinecraftClientAccess.java b/src/client/java/net/errorcraft/itematic/access/client/MinecraftClientAccess.java index d43cb542..ed444c65 100644 --- a/src/client/java/net/errorcraft/itematic/access/client/MinecraftClientAccess.java +++ b/src/client/java/net/errorcraft/itematic/access/client/MinecraftClientAccess.java @@ -3,5 +3,7 @@ import net.errorcraft.itematic.client.item.bar.ItemBarStyleLoader; public interface MinecraftClientAccess { - ItemBarStyleLoader itematic$itemBarStyles(); + default ItemBarStyleLoader itematic$itemBarStyles() { + return null; + } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/gui/DrawContextExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/gui/DrawContextExtender.java index 13ffbb85..17791f6c 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/gui/DrawContextExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/gui/DrawContextExtender.java @@ -2,17 +2,16 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import net.errorcraft.itematic.access.client.MinecraftClientAccess; +import com.mojang.blaze3d.pipeline.RenderPipeline; import net.errorcraft.itematic.client.item.bar.ItemBarStyleLoader; import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.render.state.GuiRenderState; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Final; +import org.joml.Matrix3x2fStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -22,26 +21,20 @@ import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.function.Function; - @Mixin(DrawContext.class) public abstract class DrawContextExtender { @Shadow - @Final - private MatrixStack matrices; - - @Shadow - public abstract void drawGuiTexture(Function function, Identifier identifier, int i, int j, int k, int l, int m); + public abstract void drawGuiTexture(RenderPipeline pipeline, Identifier sprite, int x, int y, int width, int height, int color); @Unique private ItemBarStyleLoader itemBarStyles; @Inject( - method = "(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;)V", + method = "(Lnet/minecraft/client/MinecraftClient;Lorg/joml/Matrix3x2fStack;Lnet/minecraft/client/gui/render/state/GuiRenderState;)V", at = @At("TAIL") ) - private void setItemBarStyles(MinecraftClient client, MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, CallbackInfo info) { - this.itemBarStyles = ((MinecraftClientAccess) client).itematic$itemBarStyles(); + private void setItemBarStyles(MinecraftClient client, Matrix3x2fStack matrices, GuiRenderState state, CallbackInfo info) { + this.itemBarStyles = client.itematic$itemBarStyles(); } @ModifyExpressionValue( @@ -75,25 +68,22 @@ private void renderItemBarFromDataComponent(ItemStack stack, int x, int y, Callb return; } - this.itemBarStyles.get(itemBarStyleId).ifPresent(itemBarStyle -> { - this.matrices.translate(0.0f, 0.0f, 200.0f); - this.drawGuiTexture( - RenderLayer::getGuiTextured, - itemBarStyle.progressTexture(stack), - x, - y, - 16, - 16, - itemBarStyle.color(stack) - ); - }); + this.itemBarStyles.get(itemBarStyleId).ifPresent(itemBarStyle -> this.drawGuiTexture( + RenderPipelines.GUI_TEXTURED, + itemBarStyle.progressTexture(stack), + x, + y, + 16, + 16, + itemBarStyle.color(stack) + )); } @Redirect( method = "drawItemBar", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/gui/DrawContext;fill(Lnet/minecraft/client/render/RenderLayer;IIIIII)V" + target = "Lnet/minecraft/client/gui/DrawContext;fill(Lcom/mojang/blaze3d/pipeline/RenderPipeline;IIIII)V" ), slice = @Slice( from = @At( @@ -102,5 +92,5 @@ private void renderItemBarFromDataComponent(ItemStack stack, int x, int y, Callb ) ) ) - private void doNotRenderOriginalItemBar(DrawContext instance, RenderLayer layer, int x1, int y1, int x2, int y2, int z, int color) {} + private void doNotRenderOriginalItemBar(DrawContext instance, RenderPipeline pipeline, int x1, int y1, int x2, int y2, int z) {} } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/network/AbstractClientPlayerEntityExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/network/AbstractClientPlayerEntityExtender.java index e81a3455..7bbdaa39 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/network/AbstractClientPlayerEntityExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/network/AbstractClientPlayerEntityExtender.java @@ -8,7 +8,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,8 +17,8 @@ @Mixin(AbstractClientPlayerEntity.class) public abstract class AbstractClientPlayerEntityExtender extends PlayerEntity { - public AbstractClientPlayerEntityExtender(World world, BlockPos pos, float yaw, GameProfile gameProfile) { - super(world, pos, yaw, gameProfile); + public AbstractClientPlayerEntityExtender(World world, GameProfile profile) { + super(world, profile); } @Redirect( diff --git a/src/datagen/java/net/errorcraft/itematic/data/recipe/brewing/BrewingRecipeBuilder.java b/src/datagen/java/net/errorcraft/itematic/data/recipe/brewing/BrewingRecipeBuilder.java index 7d4dcf55..6088d805 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/recipe/brewing/BrewingRecipeBuilder.java +++ b/src/datagen/java/net/errorcraft/itematic/data/recipe/brewing/BrewingRecipeBuilder.java @@ -60,7 +60,7 @@ public void save(RecipeExporter exporter) { protected abstract BrewingRecipe createRecipe(); protected Ingredient reagent() { - Ingredient reagent = Ingredient.fromTag(this.reagent); + Ingredient reagent = Ingredient.ofTag(this.reagent); reagent.itematic$setRemainder(Optional.ofNullable(this.remainder).map(ItemStack::new)); return reagent; } diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/ModifiedRecipeProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/ModifiedRecipeProvider.java index ef74cced..54c76d73 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/ModifiedRecipeProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/ModifiedRecipeProvider.java @@ -93,7 +93,7 @@ public ShapelessRecipe build() { public ShapelessRecipeBuilder input(RegistryEntry input, int count, RegistryEntry remainder) { for (int i = 0; i < count; i++) { - Ingredient ingredient = Ingredient.fromTag(RegistryEntryList.of(input)); + Ingredient ingredient = Ingredient.ofTag(RegistryEntryList.of(input)); ingredient.itematic$setRemainder(Optional.of(new ItemStack(remainder))); this.inputs.add(ingredient); } @@ -124,12 +124,12 @@ public ShapedRecipe build() { } public ShapedRecipeBuilder input(char key, RegistryEntry input) { - this.inputs.put(key, Ingredient.fromTag(RegistryEntryList.of(input))); + this.inputs.put(key, Ingredient.ofTag(RegistryEntryList.of(input))); return this; } public ShapedRecipeBuilder input(char key, RegistryEntry input, RegistryEntry remainder) { - Ingredient ingredient = Ingredient.fromTag(RegistryEntryList.of(input)); + Ingredient ingredient = Ingredient.ofTag(RegistryEntryList.of(input)); ingredient.itematic$setRemainder(Optional.of(new ItemStack(remainder))); this.inputs.put(key, ingredient); return this; diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/tag/ActionTagProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/tag/ActionTagProvider.java index 091fed97..d440c9cc 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/tag/ActionTagProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/tag/ActionTagProvider.java @@ -17,11 +17,11 @@ public ActionTagProvider(FabricDataOutput output, CompletableFuture { public PotionTagProvider(FabricDataOutput output, CompletableFuture registriesFuture) { @@ -24,15 +24,13 @@ public PotionTagProvider(FabricDataOutput output, CompletableFuture potions = lookup.getOrThrow(RegistryKeys.POTION); BrewingRecipeRegistry brewingRecipeRegistry = BrewingRecipeRegistry.create(FeatureFlags.VANILLA_FEATURES); - this.getOrCreateTagBuilder(PotionTags.TRADEABLE) + this.builder(PotionTags.TRADEABLE) .add(getAll(potions, potion -> !potion.value().getEffects().isEmpty() && brewingRecipeRegistry.isBrewable(potion))); } - private static Identifier[] getAll(RegistryWrapper.Impl registry, Predicate> predicate) { + private static Stream> getAll(RegistryWrapper.Impl registry, Predicate> predicate) { return registry.streamEntries() .filter(predicate) - .map(RegistryEntry.Reference::registryKey) - .map(RegistryKey::getValue) - .toArray(Identifier[]::new); + .map(RegistryEntry.Reference::registryKey); } } diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/tag/TradeTagProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/tag/TradeTagProvider.java index 1f25f09a..0cf25a4a 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/tag/TradeTagProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/tag/TradeTagProvider.java @@ -17,20 +17,20 @@ public TradeTagProvider(FabricDataOutput output, CompletableFuture LivingEntityAssert livingEntity(TestCo return new LivingEntityAssert<>(helper, entity); } + public static ItemEntityAssert itemEntity(TestContext helper, ItemEntity entity) { + return new ItemEntityAssert(helper, entity); + } + public static ItemStackAssert itemStack(TestContext helper, ItemStack stack) { return new ItemStackAssert(helper, stack); } diff --git a/src/gametest/java/net/errorcraft/itematic/assertion/EntityTypeAssert.java b/src/gametest/java/net/errorcraft/itematic/assertion/EntityTypeAssert.java index cf250477..4c9cc933 100644 --- a/src/gametest/java/net/errorcraft/itematic/assertion/EntityTypeAssert.java +++ b/src/gametest/java/net/errorcraft/itematic/assertion/EntityTypeAssert.java @@ -17,6 +17,12 @@ public class EntityTypeAssert { this.entityType = entityType; } + public > EntityTypeAssert exists(AssertionSupplier assertionSupplier, Consumer entityAssertion) { + E entity = TestUtil.getSingleEntity(this.helper, this.entityType); + entityAssertion.accept(assertionSupplier.get(this.helper, entity)); + return this; + } + public EntityTypeAssert existsAt(BlockPos pos) { TestUtil.getSingleEntityAt(this.helper, this.entityType, pos); return this; diff --git a/src/gametest/java/net/errorcraft/itematic/assertion/ItemEntityAssert.java b/src/gametest/java/net/errorcraft/itematic/assertion/ItemEntityAssert.java new file mode 100644 index 00000000..9fdc0584 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/assertion/ItemEntityAssert.java @@ -0,0 +1,17 @@ +package net.errorcraft.itematic.assertion; + +import net.minecraft.entity.ItemEntity; +import net.minecraft.test.TestContext; + +import java.util.function.Consumer; + +public class ItemEntityAssert extends BaseEntityAssert { + ItemEntityAssert(TestContext helper, ItemEntity entity) { + super(helper, entity); + } + + public ItemEntityAssert itemStack(Consumer stackAssertion) { + stackAssertion.accept(Assert.itemStack(this.helper, this.entity.getStack())); + return this; + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/assertion/ItemStackAssert.java b/src/gametest/java/net/errorcraft/itematic/assertion/ItemStackAssert.java index fc43e792..3a1529c5 100644 --- a/src/gametest/java/net/errorcraft/itematic/assertion/ItemStackAssert.java +++ b/src/gametest/java/net/errorcraft/itematic/assertion/ItemStackAssert.java @@ -82,7 +82,7 @@ public ItemStackAssert isDamaged() { } throw this.helper.createError( - "test.error.item_stack.damaged", + "test.error.item_stack.expected_damaged", this.name ); } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/ShearsTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/ShearsTestSuite.java new file mode 100644 index 00000000..9fc68aa0 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/ShearsTestSuite.java @@ -0,0 +1,174 @@ +package net.errorcraft.itematic.gametest.item; + +import net.errorcraft.itematic.assertion.Assert; +import net.errorcraft.itematic.item.ItemKeys; +import net.fabricmc.fabric.api.gametest.v1.GameTest; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.passive.HorseEntity; +import net.minecraft.entity.passive.PigEntity; +import net.minecraft.entity.passive.WolfEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.TestContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class ShearsTestSuite { + private static final BlockPos SPAWN_POSITION = new BlockPos(1, 1, 1); + + @GameTest(structure = "itematic:item.shears.platform") + public void usingShearsOnSaddledPigRemovesSaddle(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + ItemStack shears = world.itematic$createStack(ItemKeys.SHEARS); + player.setStackInHand(Hand.MAIN_HAND, shears); + PigEntity target = context.spawnEntity(EntityType.PIG, SPAWN_POSITION); + target.equipStack(EquipmentSlot.SADDLE, world.itematic$createStack(ItemKeys.SADDLE)); + context.addFinalTask(() -> { + ActionResult result = target.interact(player, Hand.MAIN_HAND); + Assert.isTrue( + context, + result.isAccepted(), + () -> "Expected Shears usage on Pig to be successful" + ); + Assert.itemStack(context, shears) + .isDamaged(); + Assert.isFalse( + context, + target.hasSaddleEquipped(), + () -> "Expected Pig not to be saddled" + ); + Assert.entityType(context, EntityType.ITEM) + .exists( + Assert::itemEntity, + itemEntity -> itemEntity.itemStack(heldStack -> heldStack + .is(ItemKeys.SADDLE)) + ); + }); + } + + @GameTest(structure = "itematic:item.shears.platform") + public void usingShearsOnSaddledHorseRemovesSaddle(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + ItemStack shears = world.itematic$createStack(ItemKeys.SHEARS); + player.setStackInHand(Hand.MAIN_HAND, shears); + HorseEntity target = context.spawnEntity(EntityType.HORSE, SPAWN_POSITION); + target.equipStack(EquipmentSlot.SADDLE, world.itematic$createStack(ItemKeys.SADDLE)); + context.addFinalTask(() -> { + ActionResult result = target.interact(player, Hand.MAIN_HAND); + Assert.isTrue( + context, + result.isAccepted(), + () -> "Expected Shears usage on Horse to be successful" + ); + Assert.itemStack(context, shears) + .isDamaged(); + Assert.isFalse( + context, + target.hasSaddleEquipped(), + () -> "Expected Horse not to be saddled" + ); + Assert.entityType(context, EntityType.ITEM) + .exists( + Assert::itemEntity, + itemEntity -> itemEntity.itemStack(heldStack -> heldStack + .is(ItemKeys.SADDLE)) + ); + }); + } + + @GameTest(structure = "itematic:item.shears.platform") + public void usingShearsOnHorseWithHorseArmorRemovesHorseArmor(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + ItemStack shears = world.itematic$createStack(ItemKeys.SHEARS); + player.setStackInHand(Hand.MAIN_HAND, shears); + HorseEntity target = context.spawnEntity(EntityType.HORSE, SPAWN_POSITION); + target.equipStack(EquipmentSlot.BODY, world.itematic$createStack(ItemKeys.IRON_HORSE_ARMOR)); + context.addFinalTask(() -> { + ActionResult result = target.interact(player, Hand.MAIN_HAND); + Assert.isTrue( + context, + result.isAccepted(), + () -> "Expected Shears usage on Horse to be successful" + ); + Assert.itemStack(context, shears) + .isDamaged(); + Assert.isFalse( + context, + target.isWearingBodyArmor(), + () -> "Expected Horse not to be wearing Horse Armor" + ); + Assert.entityType(context, EntityType.ITEM) + .exists( + Assert::itemEntity, + itemEntity -> itemEntity.itemStack(heldStack -> heldStack + .is(ItemKeys.IRON_HORSE_ARMOR)) + ); + }); + } + + @GameTest(structure = "itematic:item.shears.platform") + public void usingShearsOnWolfWithCorrectOwnerRemovesWolfArmor(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + ItemStack shears = world.itematic$createStack(ItemKeys.SHEARS); + player.setStackInHand(Hand.MAIN_HAND, shears); + WolfEntity target = context.spawnEntity(EntityType.WOLF, SPAWN_POSITION); + target.equipStack(EquipmentSlot.BODY, world.itematic$createStack(ItemKeys.WOLF_ARMOR)); + target.setOwner(player); + context.addFinalTask(() -> { + ActionResult result = target.interact(player, Hand.MAIN_HAND); + Assert.isTrue( + context, + result.isAccepted(), + () -> "Expected Shears usage on Wolf to be successful" + ); + Assert.itemStack(context, shears) + .isDamaged(); + Assert.isFalse( + context, + target.isWearingBodyArmor(), + () -> "Expected Wolf not to be wearing Wolf Armor" + ); + Assert.entityType(context, EntityType.ITEM) + .exists( + Assert::itemEntity, + itemEntity -> itemEntity.itemStack(heldStack -> heldStack + .is(ItemKeys.WOLF_ARMOR)) + ); + }); + } + + @GameTest(structure = "itematic:item.shears.platform") + public void usingShearsOnWolfWithIncorrectOwnerDoesNotRemoveWolfArmor(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + ItemStack shears = world.itematic$createStack(ItemKeys.SHEARS); + player.setStackInHand(Hand.MAIN_HAND, shears); + WolfEntity target = context.spawnEntity(EntityType.WOLF, SPAWN_POSITION); + target.equipStack(EquipmentSlot.BODY, world.itematic$createStack(ItemKeys.WOLF_ARMOR)); + context.addFinalTask(() -> { + ActionResult result = target.interact(player, Hand.MAIN_HAND); + Assert.isFalse( + context, + result.isAccepted(), + () -> "Expected Shears usage on Wolf to be unsuccessful" + ); + Assert.itemStack(context, shears) + .isNotDamaged(); + Assert.isTrue( + context, + target.isWearingBodyArmor(), + () -> "Expected Wolf to be wearing Wolf Armor" + ); + Assert.entityType(context, EntityType.ITEM) + .doesNotExist(); + }); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/util/TestUtil.java b/src/gametest/java/net/errorcraft/itematic/util/TestUtil.java index 8da08b0b..010be451 100644 --- a/src/gametest/java/net/errorcraft/itematic/util/TestUtil.java +++ b/src/gametest/java/net/errorcraft/itematic/util/TestUtil.java @@ -88,6 +88,26 @@ public static T getBlockEntity(TestContext context, Bloc )); } + public static E getSingleEntity(TestContext context, EntityType type) { + List entities = context.getEntities(type); + if (entities.isEmpty()) { + throw context.createError( + "test.error.expected_entity", + type.getName() + ); + } + + if (entities.size() > 1) { + throw context.createError( + "test.error.entity.too_many_entities", + type.getUntranslatedName(), + entities.size() + ); + } + + return entities.getFirst(); + } + public static E getSingleEntityAt(TestContext context, EntityType type, BlockPos pos) { List entities = getEntitiesAt(context, type, pos); if (entities.isEmpty()) { diff --git a/src/gametest/resources/assets/itematic/lang/en_us.json b/src/gametest/resources/assets/itematic/lang/en_us.json index 8e0d163b..ec74068b 100644 --- a/src/gametest/resources/assets/itematic/lang/en_us.json +++ b/src/gametest/resources/assets/itematic/lang/en_us.json @@ -6,6 +6,7 @@ "test.error.did_not_expect_type": "Expected %s not to be %s", "test.error.expected_tag": "Expected %s to be #%s", "test.error.block_entity.expected_block_entity_type": "Expected block entity type to be %s", + "test.error.entity.too_many_entities": "Expected only one %s to exist, but found %s", "test.error.entity.expected_effect": "Expected entity %s to have effect %s", "test.error.entity.did_not_expect_effect": "Expected entity %s not to have effect %s", "test.error.entity_type.cannot_create_entity": "Cannot create entity with type %s", diff --git a/src/gametest/resources/data/itematic/structure/item.shears.platform.nbt b/src/gametest/resources/data/itematic/structure/item.shears.platform.nbt new file mode 100644 index 00000000..dceb8c7c Binary files /dev/null and b/src/gametest/resources/data/itematic/structure/item.shears.platform.nbt differ diff --git a/src/gametest/resources/fabric.mod.json b/src/gametest/resources/fabric.mod.json index a537a0b9..5a7d6f54 100644 --- a/src/gametest/resources/fabric.mod.json +++ b/src/gametest/resources/fabric.mod.json @@ -44,6 +44,7 @@ "net.errorcraft.itematic.gametest.item.LeadTestSuite", "net.errorcraft.itematic.gametest.item.MinecartTestSuite", "net.errorcraft.itematic.gametest.item.PaintingTestSuite", + "net.errorcraft.itematic.gametest.item.ShearsTestSuite", "net.errorcraft.itematic.gametest.item.SignTestSuite", "net.errorcraft.itematic.gametest.item.TotemOfUndyingTestSuite", "net.errorcraft.itematic.gametest.item.component.BlockItemComponentTestSuite", diff --git a/src/main/generated/data/minecraft/item/black_carpet.json b/src/main/generated/data/minecraft/item/black_carpet.json index 5edbfdf4..d51f4b0f 100644 --- a/src/main/generated/data/minecraft/item/black_carpet.json +++ b/src/main/generated/data/minecraft/item/black_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:black_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/black_harness.json b/src/main/generated/data/minecraft/item/black_harness.json new file mode 100644 index 00000000..fcfc2d1f --- /dev/null +++ b/src/main/generated/data/minecraft/item/black_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:black_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:black_harness", + "translation_key": "item.minecraft.black_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/blue_carpet.json b/src/main/generated/data/minecraft/item/blue_carpet.json index 66cadc57..446035ea 100644 --- a/src/main/generated/data/minecraft/item/blue_carpet.json +++ b/src/main/generated/data/minecraft/item/blue_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:blue_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/blue_harness.json b/src/main/generated/data/minecraft/item/blue_harness.json new file mode 100644 index 00000000..7575ba72 --- /dev/null +++ b/src/main/generated/data/minecraft/item/blue_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:blue_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:blue_harness", + "translation_key": "item.minecraft.blue_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/brown_carpet.json b/src/main/generated/data/minecraft/item/brown_carpet.json index aec18e24..83d88772 100644 --- a/src/main/generated/data/minecraft/item/brown_carpet.json +++ b/src/main/generated/data/minecraft/item/brown_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:brown_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/brown_harness.json b/src/main/generated/data/minecraft/item/brown_harness.json new file mode 100644 index 00000000..53393018 --- /dev/null +++ b/src/main/generated/data/minecraft/item/brown_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:brown_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:brown_harness", + "translation_key": "item.minecraft.brown_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/carved_pumpkin.json b/src/main/generated/data/minecraft/item/carved_pumpkin.json index 2a41c112..b9ed65c6 100644 --- a/src/main/generated/data/minecraft/item/carved_pumpkin.json +++ b/src/main/generated/data/minecraft/item/carved_pumpkin.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": "minecraft:carved_pumpkin" diff --git a/src/main/generated/data/minecraft/item/creeper_head.json b/src/main/generated/data/minecraft/item/creeper_head.json index 53c5b50e..faf91eb8 100644 --- a/src/main/generated/data/minecraft/item/creeper_head.json +++ b/src/main/generated/data/minecraft/item/creeper_head.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/cyan_carpet.json b/src/main/generated/data/minecraft/item/cyan_carpet.json index a4ce3cf3..3843cfac 100644 --- a/src/main/generated/data/minecraft/item/cyan_carpet.json +++ b/src/main/generated/data/minecraft/item/cyan_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:cyan_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/cyan_harness.json b/src/main/generated/data/minecraft/item/cyan_harness.json new file mode 100644 index 00000000..276995cd --- /dev/null +++ b/src/main/generated/data/minecraft/item/cyan_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:cyan_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:cyan_harness", + "translation_key": "item.minecraft.cyan_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/diamond_horse_armor.json b/src/main/generated/data/minecraft/item/diamond_horse_armor.json index 8f204e45..991c9094 100644 --- a/src/main/generated/data/minecraft/item/diamond_horse_armor.json +++ b/src/main/generated/data/minecraft/item/diamond_horse_armor.json @@ -22,8 +22,10 @@ "minecraft:equipment": { "allowed_entities": "#minecraft:can_wear_horse_armor", "asset_id": "minecraft:diamond", + "can_be_sheared": true, "damage_on_hurt": false, "equip_sound": "minecraft:entity.horse.armor", + "shearing_sound": "minecraft:item.horse_armor.unequip", "slot": "body" }, "minecraft:stackable": 1 diff --git a/src/main/generated/data/minecraft/item/dragon_head.json b/src/main/generated/data/minecraft/item/dragon_head.json index 9a019542..9260fea1 100644 --- a/src/main/generated/data/minecraft/item/dragon_head.json +++ b/src/main/generated/data/minecraft/item/dragon_head.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/dried_ghast.json b/src/main/generated/data/minecraft/item/dried_ghast.json new file mode 100644 index 00000000..159b9981 --- /dev/null +++ b/src/main/generated/data/minecraft/item/dried_ghast.json @@ -0,0 +1,12 @@ +{ + "behavior": { + "minecraft:block": { + "block": "minecraft:dried_ghast" + }, + "minecraft:stackable": 64 + }, + "display": { + "model": "minecraft:dried_ghast", + "translation_key": "block.minecraft.dried_ghast" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/golden_horse_armor.json b/src/main/generated/data/minecraft/item/golden_horse_armor.json index d5297ad8..a141d875 100644 --- a/src/main/generated/data/minecraft/item/golden_horse_armor.json +++ b/src/main/generated/data/minecraft/item/golden_horse_armor.json @@ -15,8 +15,10 @@ "minecraft:equipment": { "allowed_entities": "#minecraft:can_wear_horse_armor", "asset_id": "minecraft:gold", + "can_be_sheared": true, "damage_on_hurt": false, "equip_sound": "minecraft:entity.horse.armor", + "shearing_sound": "minecraft:item.horse_armor.unequip", "slot": "body" }, "minecraft:stackable": 1 diff --git a/src/main/generated/data/minecraft/item/gray_carpet.json b/src/main/generated/data/minecraft/item/gray_carpet.json index 9aba5685..0e7b9e81 100644 --- a/src/main/generated/data/minecraft/item/gray_carpet.json +++ b/src/main/generated/data/minecraft/item/gray_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:gray_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/gray_harness.json b/src/main/generated/data/minecraft/item/gray_harness.json new file mode 100644 index 00000000..767485a5 --- /dev/null +++ b/src/main/generated/data/minecraft/item/gray_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:gray_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:gray_harness", + "translation_key": "item.minecraft.gray_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/green_carpet.json b/src/main/generated/data/minecraft/item/green_carpet.json index 4549961e..f0bbe75a 100644 --- a/src/main/generated/data/minecraft/item/green_carpet.json +++ b/src/main/generated/data/minecraft/item/green_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:green_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/green_harness.json b/src/main/generated/data/minecraft/item/green_harness.json new file mode 100644 index 00000000..d36966e4 --- /dev/null +++ b/src/main/generated/data/minecraft/item/green_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:green_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:green_harness", + "translation_key": "item.minecraft.green_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/happy_ghast_spawn_egg.json b/src/main/generated/data/minecraft/item/happy_ghast_spawn_egg.json new file mode 100644 index 00000000..c0911eed --- /dev/null +++ b/src/main/generated/data/minecraft/item/happy_ghast_spawn_egg.json @@ -0,0 +1,24 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:spawn_entity_from_item" + }, + "minecraft:entity": { + "allow_spawner_modification": true, + "entity": { + "allow_item_data": true, + "entity": "minecraft:happy_ghast" + }, + "passes": [ + "block", + "fluid" + ] + }, + "minecraft:spawn_egg": {}, + "minecraft:stackable": 64 + }, + "display": { + "model": "minecraft:happy_ghast_spawn_egg", + "translation_key": "item.minecraft.happy_ghast_spawn_egg" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/iron_horse_armor.json b/src/main/generated/data/minecraft/item/iron_horse_armor.json index eea89d8a..f8894b72 100644 --- a/src/main/generated/data/minecraft/item/iron_horse_armor.json +++ b/src/main/generated/data/minecraft/item/iron_horse_armor.json @@ -15,8 +15,10 @@ "minecraft:equipment": { "allowed_entities": "#minecraft:can_wear_horse_armor", "asset_id": "minecraft:iron", + "can_be_sheared": true, "damage_on_hurt": false, "equip_sound": "minecraft:entity.horse.armor", + "shearing_sound": "minecraft:item.horse_armor.unequip", "slot": "body" }, "minecraft:stackable": 1 diff --git a/src/main/generated/data/minecraft/item/leather_horse_armor.json b/src/main/generated/data/minecraft/item/leather_horse_armor.json index 84ee190a..40c6004e 100644 --- a/src/main/generated/data/minecraft/item/leather_horse_armor.json +++ b/src/main/generated/data/minecraft/item/leather_horse_armor.json @@ -18,8 +18,10 @@ "minecraft:equipment": { "allowed_entities": "#minecraft:can_wear_horse_armor", "asset_id": "minecraft:leather", + "can_be_sheared": true, "damage_on_hurt": false, "equip_sound": "minecraft:entity.horse.armor", + "shearing_sound": "minecraft:item.horse_armor.unequip", "slot": "body" }, "minecraft:stackable": 1 diff --git a/src/main/generated/data/minecraft/item/light_blue_carpet.json b/src/main/generated/data/minecraft/item/light_blue_carpet.json index 38f5bcf5..5283fda9 100644 --- a/src/main/generated/data/minecraft/item/light_blue_carpet.json +++ b/src/main/generated/data/minecraft/item/light_blue_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:light_blue_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/light_blue_harness.json b/src/main/generated/data/minecraft/item/light_blue_harness.json new file mode 100644 index 00000000..ce316c10 --- /dev/null +++ b/src/main/generated/data/minecraft/item/light_blue_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:light_blue_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:light_blue_harness", + "translation_key": "item.minecraft.light_blue_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/light_gray_carpet.json b/src/main/generated/data/minecraft/item/light_gray_carpet.json index ca00694f..f179ae36 100644 --- a/src/main/generated/data/minecraft/item/light_gray_carpet.json +++ b/src/main/generated/data/minecraft/item/light_gray_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:light_gray_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/light_gray_harness.json b/src/main/generated/data/minecraft/item/light_gray_harness.json new file mode 100644 index 00000000..c60c8e75 --- /dev/null +++ b/src/main/generated/data/minecraft/item/light_gray_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:light_gray_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:light_gray_harness", + "translation_key": "item.minecraft.light_gray_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/lime_carpet.json b/src/main/generated/data/minecraft/item/lime_carpet.json index 6b6ec9f7..5781859e 100644 --- a/src/main/generated/data/minecraft/item/lime_carpet.json +++ b/src/main/generated/data/minecraft/item/lime_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:lime_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/lime_harness.json b/src/main/generated/data/minecraft/item/lime_harness.json new file mode 100644 index 00000000..9da133fe --- /dev/null +++ b/src/main/generated/data/minecraft/item/lime_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:lime_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:lime_harness", + "translation_key": "item.minecraft.lime_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/magenta_carpet.json b/src/main/generated/data/minecraft/item/magenta_carpet.json index 3221d874..79f6dbc4 100644 --- a/src/main/generated/data/minecraft/item/magenta_carpet.json +++ b/src/main/generated/data/minecraft/item/magenta_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:magenta_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/magenta_harness.json b/src/main/generated/data/minecraft/item/magenta_harness.json new file mode 100644 index 00000000..9d8199df --- /dev/null +++ b/src/main/generated/data/minecraft/item/magenta_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:magenta_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:magenta_harness", + "translation_key": "item.minecraft.magenta_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_lava_chicken.json b/src/main/generated/data/minecraft/item/music_disc_lava_chicken.json new file mode 100644 index 00000000..42d5e134 --- /dev/null +++ b/src/main/generated/data/minecraft/item/music_disc_lava_chicken.json @@ -0,0 +1,11 @@ +{ + "behavior": { + "minecraft:playable_song": "minecraft:lava_chicken", + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:music_disc_lava_chicken", + "rarity": "rare", + "translation_key": "item.minecraft.music_disc_lava_chicken" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_tears.json b/src/main/generated/data/minecraft/item/music_disc_tears.json new file mode 100644 index 00000000..8c89e9bb --- /dev/null +++ b/src/main/generated/data/minecraft/item/music_disc_tears.json @@ -0,0 +1,11 @@ +{ + "behavior": { + "minecraft:playable_song": "minecraft:tears", + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:music_disc_tears", + "rarity": "uncommon", + "translation_key": "item.minecraft.music_disc_tears" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/orange_carpet.json b/src/main/generated/data/minecraft/item/orange_carpet.json index 499b6036..8bb89d4b 100644 --- a/src/main/generated/data/minecraft/item/orange_carpet.json +++ b/src/main/generated/data/minecraft/item/orange_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:orange_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/orange_harness.json b/src/main/generated/data/minecraft/item/orange_harness.json new file mode 100644 index 00000000..cb952d5e --- /dev/null +++ b/src/main/generated/data/minecraft/item/orange_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:orange_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:orange_harness", + "translation_key": "item.minecraft.orange_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/piglin_head.json b/src/main/generated/data/minecraft/item/piglin_head.json index 8d4363fa..ae2701a1 100644 --- a/src/main/generated/data/minecraft/item/piglin_head.json +++ b/src/main/generated/data/minecraft/item/piglin_head.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/pink_carpet.json b/src/main/generated/data/minecraft/item/pink_carpet.json index 783c7546..11e89660 100644 --- a/src/main/generated/data/minecraft/item/pink_carpet.json +++ b/src/main/generated/data/minecraft/item/pink_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:pink_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/pink_harness.json b/src/main/generated/data/minecraft/item/pink_harness.json new file mode 100644 index 00000000..0d0ef5d4 --- /dev/null +++ b/src/main/generated/data/minecraft/item/pink_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:pink_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:pink_harness", + "translation_key": "item.minecraft.pink_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/player_head.json b/src/main/generated/data/minecraft/item/player_head.json index 6e2d777c..70124492 100644 --- a/src/main/generated/data/minecraft/item/player_head.json +++ b/src/main/generated/data/minecraft/item/player_head.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/purple_carpet.json b/src/main/generated/data/minecraft/item/purple_carpet.json index 2581274a..679c6a95 100644 --- a/src/main/generated/data/minecraft/item/purple_carpet.json +++ b/src/main/generated/data/minecraft/item/purple_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:purple_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/purple_harness.json b/src/main/generated/data/minecraft/item/purple_harness.json new file mode 100644 index 00000000..f85a6fa2 --- /dev/null +++ b/src/main/generated/data/minecraft/item/purple_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:purple_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:purple_harness", + "translation_key": "item.minecraft.purple_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/red_carpet.json b/src/main/generated/data/minecraft/item/red_carpet.json index e3a32171..721136b4 100644 --- a/src/main/generated/data/minecraft/item/red_carpet.json +++ b/src/main/generated/data/minecraft/item/red_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:red_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/red_harness.json b/src/main/generated/data/minecraft/item/red_harness.json new file mode 100644 index 00000000..4a9ba1dc --- /dev/null +++ b/src/main/generated/data/minecraft/item/red_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:red_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:red_harness", + "translation_key": "item.minecraft.red_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/saddle.json b/src/main/generated/data/minecraft/item/saddle.json index 81944b62..1af9ef5f 100644 --- a/src/main/generated/data/minecraft/item/saddle.json +++ b/src/main/generated/data/minecraft/item/saddle.json @@ -6,8 +6,10 @@ "minecraft:equipment": { "allowed_entities": "#minecraft:can_equip_saddle", "asset_id": "minecraft:saddle", + "can_be_sheared": true, "equip_on_interact": true, "equip_sound": "minecraft:entity.horse.saddle", + "shearing_sound": "minecraft:item.saddle.unequip", "slot": "saddle" }, "minecraft:stackable": 1 diff --git a/src/main/generated/data/minecraft/item/skeleton_skull.json b/src/main/generated/data/minecraft/item/skeleton_skull.json index 526dfcb8..63a283b3 100644 --- a/src/main/generated/data/minecraft/item/skeleton_skull.json +++ b/src/main/generated/data/minecraft/item/skeleton_skull.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/white_carpet.json b/src/main/generated/data/minecraft/item/white_carpet.json index 0a9f0daf..2c29ff81 100644 --- a/src/main/generated/data/minecraft/item/white_carpet.json +++ b/src/main/generated/data/minecraft/item/white_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:white_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/white_harness.json b/src/main/generated/data/minecraft/item/white_harness.json new file mode 100644 index 00000000..c0b8a35f --- /dev/null +++ b/src/main/generated/data/minecraft/item/white_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:white_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:white_harness", + "translation_key": "item.minecraft.white_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/wither_skeleton_skull.json b/src/main/generated/data/minecraft/item/wither_skeleton_skull.json index 099f47ef..829cbfa0 100644 --- a/src/main/generated/data/minecraft/item/wither_skeleton_skull.json +++ b/src/main/generated/data/minecraft/item/wither_skeleton_skull.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item/wolf_armor.json b/src/main/generated/data/minecraft/item/wolf_armor.json index 7896dadc..2c2c00c3 100644 --- a/src/main/generated/data/minecraft/item/wolf_armor.json +++ b/src/main/generated/data/minecraft/item/wolf_armor.json @@ -19,7 +19,9 @@ "minecraft:equipment": { "allowed_entities": "minecraft:wolf", "asset_id": "minecraft:armadillo_scute", + "can_be_sheared": true, "equip_sound": "minecraft:item.armor.equip_wolf", + "shearing_sound": "minecraft:item.armor.unequip_wolf", "slot": "body" }, "minecraft:repairable": { diff --git a/src/main/generated/data/minecraft/item/yellow_carpet.json b/src/main/generated/data/minecraft/item/yellow_carpet.json index 15904095..765e0345 100644 --- a/src/main/generated/data/minecraft/item/yellow_carpet.json +++ b/src/main/generated/data/minecraft/item/yellow_carpet.json @@ -12,7 +12,9 @@ "minecraft:trader_llama" ], "asset_id": "minecraft:yellow_carpet", + "can_be_sheared": true, "equip_sound": "minecraft:entity.llama.swag", + "shearing_sound": "minecraft:item.llama_carpet.unequip", "slot": "body" }, "minecraft:fuel": { diff --git a/src/main/generated/data/minecraft/item/yellow_harness.json b/src/main/generated/data/minecraft/item/yellow_harness.json new file mode 100644 index 00000000..cc090cd5 --- /dev/null +++ b/src/main/generated/data/minecraft/item/yellow_harness.json @@ -0,0 +1,21 @@ +{ + "behavior": { + "minecraft:dispensable": { + "behavior": "minecraft:equip_entity" + }, + "minecraft:equipment": { + "allowed_entities": "#minecraft:can_equip_harness", + "asset_id": "minecraft:yellow_harness", + "can_be_sheared": true, + "equip_on_interact": true, + "equip_sound": "minecraft:entity.happy_ghast.equip", + "shearing_sound": "minecraft:entity.happy_ghast.unequip", + "slot": "body" + }, + "minecraft:stackable": 1 + }, + "display": { + "model": "minecraft:yellow_harness", + "translation_key": "item.minecraft.yellow_harness" + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/zombie_head.json b/src/main/generated/data/minecraft/item/zombie_head.json index 534ca7bd..e592a84c 100644 --- a/src/main/generated/data/minecraft/item/zombie_head.json +++ b/src/main/generated/data/minecraft/item/zombie_head.json @@ -1,4 +1,16 @@ { + "attribute_modifiers": [ + { + "id": "minecraft:waypoint_transmit_range_hide", + "type": "minecraft:waypoint_transmit_range", + "amount": -1.0, + "display": { + "type": "hidden" + }, + "operation": "add_multiplied_total", + "slot": "head" + } + ], "behavior": { "minecraft:block": { "block": { diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/natural_blocks.json b/src/main/generated/data/minecraft/item_group_entry_provider/natural_blocks.json index dc9161be..e8572114 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/natural_blocks.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/natural_blocks.json @@ -67,6 +67,7 @@ "type": "tag", "tag": "minecraft:item_group/egg_like_blocks" }, + "minecraft:dried_ghast", { "type": "tag", "tag": "minecraft:item_group/seeds" diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json b/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json index 41184b14..a4c1a691 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json @@ -34,6 +34,7 @@ "minecraft:glow_squid_spawn_egg", "minecraft:goat_spawn_egg", "minecraft:guardian_spawn_egg", + "minecraft:happy_ghast_spawn_egg", "minecraft:hoglin_spawn_egg", "minecraft:horse_spawn_egg", "minecraft:husk_spawn_egg", diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json b/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json index fe80eb39..f617191a 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json @@ -58,6 +58,10 @@ "item": "minecraft:firework_rocket" }, "minecraft:saddle", + { + "type": "tag", + "tag": "minecraft:item_group/harnesses" + }, "minecraft:carrot_on_a_stick", "minecraft:warped_fungus_on_a_stick", { diff --git a/src/main/generated/data/minecraft/tags/item/item_group/harnesses.json b/src/main/generated/data/minecraft/tags/item/item_group/harnesses.json new file mode 100644 index 00000000..4d74b1f6 --- /dev/null +++ b/src/main/generated/data/minecraft/tags/item/item_group/harnesses.json @@ -0,0 +1,20 @@ +{ + "values": [ + "minecraft:white_harness", + "minecraft:light_gray_harness", + "minecraft:gray_harness", + "minecraft:black_harness", + "minecraft:brown_harness", + "minecraft:red_harness", + "minecraft:orange_harness", + "minecraft:yellow_harness", + "minecraft:lime_harness", + "minecraft:green_harness", + "minecraft:cyan_harness", + "minecraft:light_blue_harness", + "minecraft:blue_harness", + "minecraft:purple_harness", + "minecraft:magenta_harness", + "minecraft:pink_harness" + ] +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/item/item_group/music_discs.json b/src/main/generated/data/minecraft/tags/item/item_group/music_discs.json index b70fbefc..58a4619d 100644 --- a/src/main/generated/data/minecraft/tags/item/item_group/music_discs.json +++ b/src/main/generated/data/minecraft/tags/item/item_group/music_discs.json @@ -4,8 +4,6 @@ "minecraft:music_disc_cat", "minecraft:music_disc_blocks", "minecraft:music_disc_chirp", - "minecraft:music_disc_creator", - "minecraft:music_disc_creator_music_box", "minecraft:music_disc_far", "minecraft:music_disc_mall", "minecraft:music_disc_mellohi", @@ -13,11 +11,15 @@ "minecraft:music_disc_strad", "minecraft:music_disc_ward", "minecraft:music_disc_11", + "minecraft:music_disc_creator_music_box", "minecraft:music_disc_wait", + "minecraft:music_disc_creator", + "minecraft:music_disc_precipice", "minecraft:music_disc_otherside", "minecraft:music_disc_relic", "minecraft:music_disc_5", "minecraft:music_disc_pigstep", - "minecraft:music_disc_precipice" + "minecraft:music_disc_tears", + "minecraft:music_disc_lava_chicken" ] } \ No newline at end of file diff --git a/src/main/java/net/errorcraft/itematic/access/entity/attribute/AttributeContainerAccess.java b/src/main/java/net/errorcraft/itematic/access/entity/attribute/AttributeContainerAccess.java index c0901e37..bf0bd5bc 100644 --- a/src/main/java/net/errorcraft/itematic/access/entity/attribute/AttributeContainerAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/entity/attribute/AttributeContainerAccess.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable; public interface AttributeContainerAccess { - double itematic$getTrueBaseValue(RegistryEntry attribute); - double itematic$getValue(RegistryEntry attribute, @Nullable Double possibleBase); + default double itematic$getValue(RegistryEntry attribute, @Nullable Double possibleBase) { + return 0.0d; + } } diff --git a/src/main/java/net/errorcraft/itematic/access/entity/attribute/DefaultAttributeContainerAccess.java b/src/main/java/net/errorcraft/itematic/access/entity/attribute/DefaultAttributeContainerAccess.java index d877ea62..8be67700 100644 --- a/src/main/java/net/errorcraft/itematic/access/entity/attribute/DefaultAttributeContainerAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/entity/attribute/DefaultAttributeContainerAccess.java @@ -4,5 +4,7 @@ import net.minecraft.registry.entry.RegistryEntry; public interface DefaultAttributeContainerAccess { - double itematic$getValue(RegistryEntry attribute, double base); + default double itematic$getValue(RegistryEntry attribute, double base) { + return 0.0d; + } } diff --git a/src/main/java/net/errorcraft/itematic/access/entity/attribute/EntityAttributeInstanceAccess.java b/src/main/java/net/errorcraft/itematic/access/entity/attribute/EntityAttributeInstanceAccess.java index 2f46eee3..dc762ae7 100644 --- a/src/main/java/net/errorcraft/itematic/access/entity/attribute/EntityAttributeInstanceAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/entity/attribute/EntityAttributeInstanceAccess.java @@ -1,5 +1,7 @@ package net.errorcraft.itematic.access.entity.attribute; public interface EntityAttributeInstanceAccess { - double itematic$getValue(double base); + default double itematic$getValue(double base) { + return 0.0d; + } } diff --git a/src/main/java/net/errorcraft/itematic/access/recipe/book/RecipeBookOptionsAccess.java b/src/main/java/net/errorcraft/itematic/access/recipe/book/RecipeBookOptionsAccess.java new file mode 100644 index 00000000..4099486e --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/access/recipe/book/RecipeBookOptionsAccess.java @@ -0,0 +1,10 @@ +package net.errorcraft.itematic.access.recipe.book; + +import net.minecraft.recipe.book.RecipeBookOptions; + +public interface RecipeBookOptionsAccess { + default RecipeBookOptions.CategoryOption itematic$brewing() { + return null; + } + default void itematic$setBrewing(RecipeBookOptions.CategoryOption brewing) {} +} diff --git a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java index 11038326..efb04520 100644 --- a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java +++ b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java @@ -707,6 +707,7 @@ public class BlockKeys { public static final RegistryKey DRIED_KELP_BLOCK = of("dried_kelp_block"); public static final RegistryKey TURTLE_EGG = of("turtle_egg"); public static final RegistryKey SNIFFER_EGG = of("sniffer_egg"); + public static final RegistryKey DRIED_GHAST = of("dried_ghast"); public static final RegistryKey DEAD_TUBE_CORAL_BLOCK = of("dead_tube_coral_block"); public static final RegistryKey DEAD_BRAIN_CORAL_BLOCK = of("dead_brain_coral_block"); public static final RegistryKey DEAD_BUBBLE_CORAL_BLOCK = of("dead_bubble_coral_block"); diff --git a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java index c38c7f4b..7357a733 100644 --- a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java @@ -58,6 +58,7 @@ public class EntityTypeKeys { public static final RegistryKey> GLOW_SQUID = of("glow_squid"); public static final RegistryKey> GOAT = of("goat"); public static final RegistryKey> GUARDIAN = of("guardian"); + public static final RegistryKey> HAPPY_GHAST = of("happy_ghast"); public static final RegistryKey> HOGLIN = of("hoglin"); public static final RegistryKey> HOPPER_MINECART = of("hopper_minecart"); public static final RegistryKey> HORSE = of("horse"); diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java index 31f668e0..74e62922 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java @@ -77,7 +77,7 @@ private EyeOfEnderEntity createEntity(ServerWorld world, Vec3d pos, ItemStack st entity.setItem(stack); } - entity.initTargetPos(strongholdPos); + entity.initTargetPos(Vec3d.of(strongholdPos)); return entity; } } diff --git a/src/main/java/net/errorcraft/itematic/item/AttributeModifiers.java b/src/main/java/net/errorcraft/itematic/item/AttributeModifiers.java index f91d9504..fee82f93 100644 --- a/src/main/java/net/errorcraft/itematic/item/AttributeModifiers.java +++ b/src/main/java/net/errorcraft/itematic/item/AttributeModifiers.java @@ -7,6 +7,7 @@ import net.minecraft.item.equipment.ArmorMaterial; import net.minecraft.item.equipment.EquipmentType; import net.minecraft.util.Identifier; +import net.minecraft.world.waypoint.Waypoint; public class AttributeModifiers { private AttributeModifiers() {} @@ -52,4 +53,15 @@ public static AttributeModifiersComponent armor(ArmorMaterial material, Equipmen return builder.build(); } + + public static AttributeModifiersComponent hideFromLocatorBar() { + return AttributeModifiersComponent.builder() + .add( + EntityAttributes.WAYPOINT_TRANSMIT_RANGE, + Waypoint.DISABLE_TRACKING, + AttributeModifierSlot.HEAD, + AttributeModifiersComponent.Display.getHidden() + ) + .build(); + } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java index aac3921c..01c0c2cb 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java @@ -625,6 +625,7 @@ public class ItemKeys { public static final RegistryKey BLACK_CONCRETE_POWDER = register("black_concrete_powder"); public static final RegistryKey TURTLE_EGG = register("turtle_egg"); public static final RegistryKey SNIFFER_EGG = register("sniffer_egg"); + public static final RegistryKey DRIED_GHAST = register("dried_ghast"); public static final RegistryKey DEAD_TUBE_CORAL_BLOCK = register("dead_tube_coral_block"); public static final RegistryKey DEAD_BRAIN_CORAL_BLOCK = register("dead_brain_coral_block"); public static final RegistryKey DEAD_BUBBLE_CORAL_BLOCK = register("dead_bubble_coral_block"); @@ -807,6 +808,22 @@ public class ItemKeys { public static final RegistryKey RAIL = register("rail"); public static final RegistryKey ACTIVATOR_RAIL = register("activator_rail"); public static final RegistryKey SADDLE = register("saddle"); + public static final RegistryKey WHITE_HARNESS = register("white_harness"); + public static final RegistryKey ORANGE_HARNESS = register("orange_harness"); + public static final RegistryKey MAGENTA_HARNESS = register("magenta_harness"); + public static final RegistryKey LIGHT_BLUE_HARNESS = register("light_blue_harness"); + public static final RegistryKey YELLOW_HARNESS = register("yellow_harness"); + public static final RegistryKey LIME_HARNESS = register("lime_harness"); + public static final RegistryKey PINK_HARNESS = register("pink_harness"); + public static final RegistryKey GRAY_HARNESS = register("gray_harness"); + public static final RegistryKey LIGHT_GRAY_HARNESS = register("light_gray_harness"); + public static final RegistryKey CYAN_HARNESS = register("cyan_harness"); + public static final RegistryKey PURPLE_HARNESS = register("purple_harness"); + public static final RegistryKey BLUE_HARNESS = register("blue_harness"); + public static final RegistryKey BROWN_HARNESS = register("brown_harness"); + public static final RegistryKey GREEN_HARNESS = register("green_harness"); + public static final RegistryKey RED_HARNESS = register("red_harness"); + public static final RegistryKey BLACK_HARNESS = register("black_harness"); public static final RegistryKey MINECART = register("minecart"); public static final RegistryKey CHEST_MINECART = register("chest_minecart"); public static final RegistryKey FURNACE_MINECART = register("furnace_minecart"); @@ -1099,6 +1116,7 @@ public class ItemKeys { public static final RegistryKey FOX_SPAWN_EGG = register("fox_spawn_egg"); public static final RegistryKey FROG_SPAWN_EGG = register("frog_spawn_egg"); public static final RegistryKey GHAST_SPAWN_EGG = register("ghast_spawn_egg"); + public static final RegistryKey HAPPY_GHAST_SPAWN_EGG = register("happy_ghast_spawn_egg"); public static final RegistryKey GLOW_SQUID_SPAWN_EGG = register("glow_squid_spawn_egg"); public static final RegistryKey GOAT_SPAWN_EGG = register("goat_spawn_egg"); public static final RegistryKey GUARDIAN_SPAWN_EGG = register("guardian_spawn_egg"); @@ -1242,6 +1260,7 @@ public class ItemKeys { public static final RegistryKey MUSIC_DISC_CREATOR = register("music_disc_creator"); public static final RegistryKey MUSIC_DISC_CREATOR_MUSIC_BOX = register("music_disc_creator_music_box"); public static final RegistryKey MUSIC_DISC_FAR = register("music_disc_far"); + public static final RegistryKey MUSIC_DISC_LAVA_CHICKEN = register("music_disc_lava_chicken"); public static final RegistryKey MUSIC_DISC_MALL = register("music_disc_mall"); public static final RegistryKey MUSIC_DISC_MELLOHI = register("music_disc_mellohi"); public static final RegistryKey MUSIC_DISC_STAL = register("music_disc_stal"); @@ -1254,6 +1273,7 @@ public class ItemKeys { public static final RegistryKey MUSIC_DISC_5 = register("music_disc_5"); public static final RegistryKey MUSIC_DISC_PIGSTEP = register("music_disc_pigstep"); public static final RegistryKey MUSIC_DISC_PRECIPICE = register("music_disc_precipice"); + public static final RegistryKey MUSIC_DISC_TEARS = register("music_disc_tears"); public static final RegistryKey DISC_FRAGMENT_5 = register("disc_fragment_5"); public static final RegistryKey TRIDENT = register("trident"); public static final RegistryKey NAUTILUS_SHELL = register("nautilus_shell"); diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 765ffec4..482509c5 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -86,7 +86,6 @@ import net.minecraft.registry.tag.*; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; import net.minecraft.state.property.Properties; import net.minecraft.text.Text; import net.minecraft.util.DyeColor; @@ -2709,6 +2708,13 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.SNIFFER_EGG))) .build() )); + this.registerable.register(ItemKeys.DRIED_GHAST, create( + ItemDisplay.Builder.forBlock(ItemKeys.DRIED_GHAST).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.DRIED_GHAST))) + .build() + )); this.registerable.register(ItemKeys.DEAD_TUBE_CORAL_BLOCK, create( ItemDisplay.Builder.forBlock(ItemKeys.DEAD_TUBE_CORAL_BLOCK).build(), ItemComponentSet.builder() @@ -6113,6 +6119,13 @@ private void bootstrapSpawnEggs() { .with(EntityItemComponent.spawnEgg(this.entityTypes.getOrThrow(EntityTypeKeys.GHAST), this.dispenseBehaviors)) .build() )); + this.registerable.register(ItemKeys.HAPPY_GHAST_SPAWN_EGG, create( + ItemDisplay.Builder.forItem(ItemKeys.HAPPY_GHAST_SPAWN_EGG).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(EntityItemComponent.spawnEgg(this.entityTypes.getOrThrow(EntityTypeKeys.HAPPY_GHAST), this.dispenseBehaviors)) + .build() + )); this.registerable.register(ItemKeys.GLOW_SQUID_SPAWN_EGG, create( ItemDisplay.Builder.forItem(ItemKeys.GLOW_SQUID_SPAWN_EGG).build(), ItemComponentSet.builder() @@ -6980,6 +6993,7 @@ private void bootstrapCompostables() { )); this.registerable.register(ItemKeys.CARVED_PUMPKIN, create( ItemDisplay.Builder.forBlock(ItemKeys.CARVED_PUMPKIN).build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CARVED_PUMPKIN))) @@ -7850,11 +7864,125 @@ private void bootstrapArmor() { .allowedEntities(RegistryEntryList.of( this.entityTypes.getOrThrow(EntityTypeKeys.WOLF) )) + .canBeSheared(true) + .shearingSound(this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_UNEQUIP_WOLF)) .build() )) .with(DyeableItemComponent.of(0x000000)) .build() )); + this.registerable.register(ItemKeys.WHITE_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.WHITE_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.WHITE, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.ORANGE_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.ORANGE_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.ORANGE, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.MAGENTA_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.MAGENTA_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.MAGENTA, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.LIGHT_BLUE_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.LIGHT_BLUE_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.LIGHT_BLUE, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.YELLOW_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.YELLOW_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.YELLOW, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.LIME_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.LIME_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.LIME, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.PINK_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.PINK_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.PINK, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.GRAY_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.GRAY_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.GRAY, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.LIGHT_GRAY_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.LIGHT_GRAY_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.LIGHT_GRAY, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.CYAN_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.CYAN_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.CYAN, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.PURPLE_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.PURPLE_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.PURPLE, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.BLUE_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.BLUE_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.BLUE, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.BROWN_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.BROWN_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.BROWN, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.GREEN_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.GREEN_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.GREEN, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.RED_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.RED_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.RED, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.BLACK_HARNESS, create( + ItemDisplay.Builder.forItem(ItemKeys.BLACK_HARNESS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(EquipmentItemComponent.ofHarness(DyeColor.BLACK, this.soundEvents, this.entityTypes, this.dispenseBehaviors)) + .build() + )); } private void bootstrapSkulls() { @@ -7862,6 +7990,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.SKELETON_SKULL) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7875,6 +8004,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.WITHER_SKELETON_SKULL) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7888,6 +8018,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.PLAYER_HEAD) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7901,6 +8032,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.ZOMBIE_HEAD) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7914,6 +8046,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.CREEPER_HEAD) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7927,6 +8060,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.DRAGON_HEAD) .rarity(Rarity.RARE) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -7940,6 +8074,7 @@ private void bootstrapSkulls() { ItemDisplay.Builder.forBlock(ItemKeys.PIGLIN_HEAD) .rarity(Rarity.UNCOMMON) .build(), + AttributeModifiers.hideFromLocatorBar(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(EquipmentItemComponent.forSkull( @@ -10172,6 +10307,22 @@ private void bootstrapRecords() { .with(StackableItemComponent.of(64)) .build() )); + this.registerable.register(ItemKeys.MUSIC_DISC_TEARS, create( + ItemDisplay.Builder.forItem(ItemKeys.MUSIC_DISC_TEARS) + .rarity(Rarity.UNCOMMON) + .build(), + ItemComponentSet.builder() + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.TEARS))) + .build() + )); + this.registerable.register(ItemKeys.MUSIC_DISC_LAVA_CHICKEN, create( + ItemDisplay.Builder.forItem(ItemKeys.MUSIC_DISC_LAVA_CHICKEN) + .rarity(Rarity.RARE) + .build(), + ItemComponentSet.builder() + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.LAVA_CHICKEN))) + .build() + )); } private void bootstrapBuckets() { @@ -10980,10 +11131,12 @@ private void bootstrapMiscellaneous() { ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(EquipmentItemComponent.of(EquippableComponent.builder(EquipmentSlot.SADDLE) - .equipSound(SoundEvents.ENTITY_HORSE_SADDLE) + .equipSound(this.soundEvents.getOrThrow(SoundEventKeys.HORSE_SADDLE)) .model(EquipmentAssetKeys.SADDLE) .allowedEntities(this.entityTypes.getOrThrow(EntityTypeTags.CAN_EQUIP_SADDLE)) .equipOnInteract(true) + .canBeSheared(true) + .shearingSound(this.soundEvents.getOrThrow(SoundEventKeys.SADDLE_UNEQUIP)) .build() )) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) diff --git a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java index c4ebe5ff..4eea9a39 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java +++ b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java @@ -133,6 +133,7 @@ public class ItematicItemTags { public static final TagKey TOOLS = of("item_group/tools"); public static final TagKey BUCKETS = of("item_group/buckets"); public static final TagKey BUNDLES = of("item_group/bundles"); + public static final TagKey HARNESSES = of("item_group/harnesses"); public static final TagKey BOATS = of("item_group/boats"); public static final TagKey MUSIC_DISCS = of("item_group/music_discs"); public static final TagKey SWORDS = of("item_group/swords"); diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/EquipmentItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/EquipmentItemComponent.java index ed61870c..c152532c 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/EquipmentItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/EquipmentItemComponent.java @@ -22,6 +22,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.equipment.ArmorMaterial; +import net.minecraft.item.equipment.EquipmentAssetKeys; import net.minecraft.item.equipment.EquipmentType; import net.minecraft.loot.context.LootContextParameters; import net.minecraft.registry.RegistryEntryLookup; @@ -30,6 +31,7 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; import net.minecraft.util.ActionResult; +import net.minecraft.util.DyeColor; import net.minecraft.util.Hand; import net.minecraft.util.math.Direction; import net.minecraft.world.World; @@ -47,10 +49,26 @@ public static EquipmentItemComponent ofHorseArmor(ArmorMaterial material, Regist .model(material.assetId()) .allowedEntities(entityTypes.getOrThrow(EntityTypeTags.CAN_WEAR_HORSE_ARMOR)) .damageOnHurt(false) + .canBeSheared(true) + .shearingSound(soundEvents.getOrThrow(SoundEventKeys.HORSE_ARMOR_UNEQUIP)) .build() ); } + public static ItemComponent[] ofHarness(DyeColor color, RegistryEntryLookup soundEvents, RegistryEntryLookup> entityTypes, RegistryEntryLookup dispenseBehaviors) { + return new ItemComponent[] { + of(EquippableComponent.builder(EquipmentSlot.BODY) + .equipSound(soundEvents.getOrThrow(SoundEventKeys.HAPPY_GHAST_EQUIP)) + .model(EquipmentAssetKeys.HARNESS_FROM_COLOR.get(color)) + .allowedEntities(entityTypes.getOrThrow(EntityTypeTags.CAN_EQUIP_HARNESS)) + .equipOnInteract(true) + .canBeSheared(true) + .shearingSound(soundEvents.getOrThrow(SoundEventKeys.HAPPY_GHAST_UNEQUIP)) + .build()), + DispensableItemComponent.of(dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY)) + }; + } + public static ItemComponent[] forArmor(ArmorMaterial material, EquipmentType type) { return new ItemComponent[] { StackableItemComponent.of(1), @@ -66,7 +84,7 @@ public static ItemComponent[] forArmor(ArmorMaterial material, EquipmentType public static ItemComponent[] forSkull(RegistryEntry attachedBlock, RegistryEntry otherBlock, RegistryEntryLookup dispenseBehaviors) { return new ItemComponent[] { BlockItemComponent.attachedToSide(attachedBlock, otherBlock, Direction.DOWN), - new EquipmentItemComponent(EquippableComponent.builder(EquipmentSlot.HEAD) + of(EquippableComponent.builder(EquipmentSlot.HEAD) .swappable(false) .build()), DispensableItemComponent.of(dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY_HEAD)), diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java index c062f77d..d1e4d86e 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java @@ -56,6 +56,11 @@ public ItemResult use(World world, PlayerEntity user, Hand hand, ItemStack stack @Override public ItemResult useOnBlock(ItemUsageContext context, ItemStackExchanger stackExchanger) { + PlayerEntity player = context.getPlayer(); + if (player != null && player.isGliding()) { + return ItemResult.PASS; + } + World world = context.getWorld(); ItemStack stack = context.getStack(); if (world.isClient()) { diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java index f2a34071..04858c73 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java @@ -82,6 +82,7 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.tag(ItematicItemTags.SAPLINGS), ItemGroupEntry.tag(ItematicItemTags.PLANTS), ItemGroupEntry.tag(ItematicItemTags.EGG_LIKE_BLOCKS), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.DRIED_GHAST)), ItemGroupEntry.tag(ItematicItemTags.SEEDS), ItemGroupEntry.tag(ItematicItemTags.WATER_BLOCKS), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.SPONGE)), @@ -252,6 +253,7 @@ public static void bootstrap(Registerable registerable) .add(items.getOrThrow(ItemKeys.ELYTRA)) .add(flightDuration(items.getOrThrow(ItemKeys.FIREWORK_ROCKET))) .add(items.getOrThrow(ItemKeys.SADDLE)) + .add(ItemGroupEntry.tag(ItematicItemTags.HARNESSES)) .add(items.getOrThrow(ItemKeys.CARROT_ON_A_STICK)) .add(items.getOrThrow(ItemKeys.WARPED_FUNGUS_ON_A_STICK)) .add(ItemGroupEntry.tag(ItematicItemTags.BOATS)) @@ -397,6 +399,7 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.simple(items.getOrThrow(ItemKeys.GLOW_SQUID_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.GOAT_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.GUARDIAN_SPAWN_EGG)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HAPPY_GHAST_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HOGLIN_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HORSE_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HUSK_SPAWN_EGG)), diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/entity/DecoratedPotBlockEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/entity/DecoratedPotBlockEntityExtender.java deleted file mode 100644 index 42017525..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/block/entity/DecoratedPotBlockEntityExtender.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.errorcraft.itematic.mixin.block.entity; - -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.serialization.Codec; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.DecoratedPotBlockEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtOps; -import net.minecraft.registry.RegistryWrapper; -import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Optional; - -@Mixin(DecoratedPotBlockEntity.class) -public class DecoratedPotBlockEntityExtender extends BlockEntity { - public DecoratedPotBlockEntityExtender(BlockEntityType type, BlockPos pos, BlockState state) { - super(type, pos, state); - } - - @Redirect( - method = "readNbt", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/nbt/NbtCompound;get(Ljava/lang/String;Lcom/mojang/serialization/Codec;)Ljava/util/Optional;" - ) - ) - private Optional getUseRegistryOps(NbtCompound instance, String key, Codec codec, @Local(argsOnly = true) RegistryWrapper.WrapperLookup lookup) { - return instance.get(key, codec, lookup.getOps(NbtOps.INSTANCE)); - } - - @Redirect( - method = "writeNbt", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/nbt/NbtCompound;put(Ljava/lang/String;Lcom/mojang/serialization/Codec;Ljava/lang/Object;)V" - ) - ) - private void putUseRegistryOps(NbtCompound instance, String key, Codec codec, T value, @Local(argsOnly = true) RegistryWrapper.WrapperLookup lookup) { - instance.put(key, codec, lookup.getOps(NbtOps.INSTANCE), value); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java index e8691fd9..4ea264cd 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java @@ -1,19 +1,30 @@ package net.errorcraft.itematic.mixin.entity; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.access.entity.EntityAccess; import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.advancement.criterion.PlayerInteractedWithEntityCriterion; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; 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.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; @Mixin(Entity.class) public abstract class EntityExtender implements EntityAccess { @@ -30,12 +41,64 @@ public abstract class EntityExtender implements EntityAccess { at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" + ), + slice = @Slice( + from = @At( + value = "FIELD:FIRST", + target = "Lnet/minecraft/item/Items;SHEARS:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC + ), + to = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/mob/MobEntity;canRemoveSaddle(Lnet/minecraft/entity/player/PlayerEntity;)Z" + ) + ) + ) + private boolean isOfForShearsUseRegistryKeyCheck(ItemStack instance, Item item) { + return instance.itematic$isOf(ItemKeys.SHEARS); + } + + @Redirect( + method = "interact", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "FIELD", + target = "Lnet/minecraft/item/Items;LEAD:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC + ) ) ) private boolean isOfForLeadUseRegistryKeyCheck(ItemStack instance, Item item) { return instance.itematic$isOf(ItemKeys.LEAD); } + @Definition(id = "ServerPlayerEntity", type = ServerPlayerEntity.class) + @Definition(id = "player", local = @Local(type = PlayerEntity.class)) + @Expression("(ServerPlayerEntity) player") + @WrapOperation( + method = "shearEquipment", + at = @At("MIXINEXTRAS:EXPRESSION") + ) + private ServerPlayerEntity checkForServerPlayer(Object obj, Operation original) { + return obj instanceof ServerPlayerEntity serverPlayer ? serverPlayer : null; + } + + @WrapWithCondition( + method = "shearEquipment", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/advancement/criterion/PlayerInteractedWithEntityCriterion;trigger(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/Entity;)V" + ) + ) + private boolean checkForServerPlayer(PlayerInteractedWithEntityCriterion instance, ServerPlayerEntity player, ItemStack stack, Entity entity) { + return player != null; + } + @Override public ItemEntity itematic$dropItem(ServerWorld world, RegistryKey key) { return this.dropStack(world, world.itematic$createStack(key)); diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java index ebb467c4..1eaa69e1 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java @@ -6,7 +6,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.access.entity.LivingEntityAccess; -import net.errorcraft.itematic.access.entity.attribute.AttributeContainerAccess; import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.errorcraft.itematic.component.type.WeaponAttackDamageDataComponent; import net.errorcraft.itematic.item.ItemKeys; @@ -454,8 +453,7 @@ private int getItemUseTimeUseField(int original) { @Override public double itematic$getAttackDamage() { Double baseAttackDamage = this.getBaseAttackDamage(this.getMainHandStack()); - return ((AttributeContainerAccess) this.getAttributes()) - .itematic$getValue(EntityAttributes.ATTACK_DAMAGE, baseAttackDamage); + return this.getAttributes().itematic$getValue(EntityAttributes.ATTACK_DAMAGE, baseAttackDamage); } @Unique diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/AttributeContainerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/AttributeContainerExtender.java index 4c1c6863..1e617a7f 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/AttributeContainerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/AttributeContainerExtender.java @@ -1,8 +1,6 @@ package net.errorcraft.itematic.mixin.entity.attribute; import net.errorcraft.itematic.access.entity.attribute.AttributeContainerAccess; -import net.errorcraft.itematic.access.entity.attribute.DefaultAttributeContainerAccess; -import net.errorcraft.itematic.access.entity.attribute.EntityAttributeInstanceAccess; import net.minecraft.entity.attribute.AttributeContainer; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttribute; @@ -19,7 +17,7 @@ public abstract class AttributeContainerExtender implements AttributeContainerAccess { @Shadow @Final - private DefaultAttributeContainer fallback; + private DefaultAttributeContainer defaultAttributes; @Shadow @Final @@ -28,11 +26,6 @@ public abstract class AttributeContainerExtender implements AttributeContainerAc @Shadow public abstract double getValue(RegistryEntry attribute); - @Override - public double itematic$getTrueBaseValue(RegistryEntry attribute) { - return this.fallback.getBaseValue(attribute); - } - @Override public double itematic$getValue(RegistryEntry attribute, @Nullable Double possibleBase) { if (possibleBase == null) { @@ -41,7 +34,7 @@ public abstract class AttributeContainerExtender implements AttributeContainerAc EntityAttributeInstance instance = this.custom.get(attribute); return instance != null ? - ((EntityAttributeInstanceAccess) instance).itematic$getValue(possibleBase) : - ((DefaultAttributeContainerAccess) this.fallback).itematic$getValue(attribute, possibleBase); + instance.itematic$getValue(possibleBase) : + this.defaultAttributes.itematic$getValue(attribute, possibleBase); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/DefaultAttributeContainerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/DefaultAttributeContainerExtender.java index cdde3a7b..bd400aef 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/DefaultAttributeContainerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/DefaultAttributeContainerExtender.java @@ -1,7 +1,6 @@ package net.errorcraft.itematic.mixin.entity.attribute; import net.errorcraft.itematic.access.entity.attribute.DefaultAttributeContainerAccess; -import net.errorcraft.itematic.access.entity.attribute.EntityAttributeInstanceAccess; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeInstance; @@ -16,6 +15,6 @@ public abstract class DefaultAttributeContainerExtender implements DefaultAttrib @Override public double itematic$getValue(RegistryEntry attribute, double base) { - return ((EntityAttributeInstanceAccess) this.require(attribute)).itematic$getValue(base); + return this.require(attribute).itematic$getValue(base); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/EntityAttributeInstanceExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/EntityAttributeInstanceExtender.java index 13369517..3d47f673 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/EntityAttributeInstanceExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/attribute/EntityAttributeInstanceExtender.java @@ -21,6 +21,7 @@ public abstract class EntityAttributeInstanceExtender implements EntityAttribute if (this.baseValue == base) { return this.getValue(); } + // Temporarily update the base value without sending any updates by directly modifying the field double originalBase = this.baseValue; this.baseValue = base; diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java index eb495593..35a44ef8 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java @@ -88,6 +88,25 @@ private boolean isOfForAppleUseRegistryKeyCheck(ItemStack instance, Item item) { return instance.itematic$isOf(ItemKeys.APPLE); } + @Redirect( + method = "receiveFood", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "FIELD", + target = "Lnet/minecraft/item/Items;CARROT:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC + ) + ) + ) + private boolean isOfForCarrotUseRegistryKeyCheck(ItemStack instance, Item item) { + return instance.itematic$isOf(ItemKeys.CARROT); + } + @Redirect( method = "receiveFood", at = @At( diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java index f34746e9..b0c45ba7 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java @@ -10,7 +10,6 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -44,25 +43,6 @@ private boolean isOfForWolfArmorUseRegistryKeyCheck(ItemStack instance, Item ite return instance.itematic$isOf(ItemKeys.WOLF_ARMOR); } - @Redirect( - method = "interactMob", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z", - ordinal = 0 - ), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/item/Items;SHEARS:Lnet/minecraft/item/Item;", - opcode = Opcodes.GETSTATIC - ) - ) - ) - private boolean isOfForShearsUseRegistryKeyCheck(ItemStack instance, Item item) { - return instance.itematic$isOf(ItemKeys.SHEARS); - } - @Redirect( method = "interactMob", at = @At( diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java index dd9d4de8..f2cc563d 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java @@ -11,7 +11,6 @@ import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -21,8 +20,8 @@ @Mixin(ServerPlayerEntity.class) public abstract class ServerPlayerEntityExtender extends PlayerEntity { - public ServerPlayerEntityExtender(World world, BlockPos pos, float yaw, GameProfile gameProfile) { - super(world, pos, yaw, gameProfile); + public ServerPlayerEntityExtender(World world, GameProfile profile) { + super(world, profile); } @Inject( diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/FireworkRocketEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/FireworkRocketEntityExtender.java index e98f74b8..8a9801a4 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/FireworkRocketEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/FireworkRocketEntityExtender.java @@ -32,7 +32,7 @@ private Item getHandPosOffsetUseRegistryEntry(Item item) { @Redirect( method = { "initDataTracker", - "readCustomDataFromNbt" + "readCustomData" }, at = @At( value = "INVOKE", diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/thrown/ThrownItemEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/thrown/ThrownItemEntityExtender.java index 62120cfb..0d8e4582 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/thrown/ThrownItemEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/thrown/ThrownItemEntityExtender.java @@ -21,7 +21,10 @@ protected ThrownItemEntityExtender(EntityType entityType } @Redirect( - method = { "initDataTracker", "readCustomDataFromNbt", "method_57319" }, + method = { + "initDataTracker", + "method_57319" + }, at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsAccessor.java new file mode 100644 index 00000000..f3d07488 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsAccessor.java @@ -0,0 +1,16 @@ +package net.errorcraft.itematic.mixin.recipe.book; + +import com.mojang.serialization.MapCodec; +import net.minecraft.recipe.book.RecipeBookOptions; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +public interface RecipeBookOptionsAccessor { + @Mixin(RecipeBookOptions.CategoryOption.class) + interface CategoryOptionAccessor { + @Invoker("createCodec") + static MapCodec createCodec(String guiOpenField, String filteringCraftableField) { + throw new AssertionError(); + } + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsExtender.java index b2d4c553..aee22375 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/book/RecipeBookOptionsExtender.java @@ -1,30 +1,113 @@ package net.errorcraft.itematic.mixin.recipe.book; -import com.google.common.collect.ImmutableMap; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.mojang.datafixers.util.Pair; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.errorcraft.itematic.access.recipe.book.RecipeBookOptionsAccess; +import net.errorcraft.itematic.recipe.book.ItematicRecipeBookOptions; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.recipe.book.RecipeBookOptions; import net.minecraft.recipe.book.RecipeBookType; import org.spongepowered.asm.mixin.Mixin; +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 java.util.function.Function; +import java.util.function.UnaryOperator; @Mixin(RecipeBookOptions.class) -public class RecipeBookOptionsExtender { +public class RecipeBookOptionsExtender implements RecipeBookOptionsAccess { + @Unique + private RecipeBookOptions.CategoryOption brewing = RecipeBookOptions.CategoryOption.DEFAULT; + + @ModifyExpressionValue( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/network/codec/PacketCodec;tuple(Lnet/minecraft/network/codec/PacketCodec;Ljava/util/function/Function;Lnet/minecraft/network/codec/PacketCodec;Ljava/util/function/Function;Lnet/minecraft/network/codec/PacketCodec;Ljava/util/function/Function;Lnet/minecraft/network/codec/PacketCodec;Ljava/util/function/Function;Lcom/mojang/datafixers/util/Function4;)Lnet/minecraft/network/codec/PacketCodec;" + ) + ) + private static PacketCodec addBrewingFieldPacketCodec(PacketCodec original) { + return PacketCodec.tuple( + original, Function.identity(), + RecipeBookOptions.CategoryOption.PACKET_CODEC, RecipeBookOptions::itematic$brewing, + RecipeBookOptionsExtender::setFields + ); + } + @ModifyExpressionValue( method = "", at = @At( value = "INVOKE", - target = "Lcom/google/common/collect/ImmutableMap;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableMap;", + target = "Lcom/mojang/serialization/codecs/RecordCodecBuilder;mapCodec(Ljava/util/function/Function;)Lcom/mojang/serialization/MapCodec;", remap = false ) ) - private static ImmutableMap> addCustomEntries(ImmutableMap> original) { - return ImmutableMap.>builder() - .putAll(original) - .put( - RecipeBookType.ITEMATIC_BREWING, - Pair.of("isBrewingStandGuiOpen", "isBrewingStandFilteringCraftable") - ) - .build(); + private static MapCodec addBrewingFieldCodec(MapCodec original) { + return RecordCodecBuilder.mapCodec(instance -> instance.group( + original.forGetter(Function.identity()), + ItematicRecipeBookOptions.BREWING_CODEC.forGetter(RecipeBookOptions::itematic$brewing) + ).apply(instance, RecipeBookOptionsExtender::setFields)); + } + + @Inject( + method = "getOption", + at = @At("HEAD"), + cancellable = true + ) + private void getOptionCheckBrewing(RecipeBookType type, CallbackInfoReturnable info) { + if (type == RecipeBookType.ITEMATIC_BREWING) { + info.setReturnValue(this.brewing); + } + } + + @Inject( + method = "apply", + at = @At("HEAD"), + cancellable = true + ) + private void applyCheckBrewing(RecipeBookType type, UnaryOperator modifier, CallbackInfo info) { + if (type == RecipeBookType.ITEMATIC_BREWING) { + this.brewing = modifier.apply(this.brewing); + info.cancel(); + } + } + + @ModifyReturnValue( + method = "copy", + at = @At("TAIL") + ) + private RecipeBookOptions setBrewingField(RecipeBookOptions original) { + original.itematic$setBrewing(this.brewing); + return original; + } + + @Inject( + method = "copyFrom", + at = @At("TAIL") + ) + private void copyBrewingField(RecipeBookOptions other, CallbackInfo info) { + this.brewing = other.itematic$brewing(); + } + + @Override + public RecipeBookOptions.CategoryOption itematic$brewing() { + return this.brewing; + } + + @Override + public void itematic$setBrewing(RecipeBookOptions.CategoryOption brewing) { + this.brewing = brewing; + } + + @Unique + private static RecipeBookOptions setFields(RecipeBookOptions recipeBookOptions, RecipeBookOptions.CategoryOption brewing) { + recipeBookOptions.itematic$setBrewing(brewing); + return recipeBookOptions; } } diff --git a/src/main/java/net/errorcraft/itematic/recipe/book/ItematicRecipeBookOptions.java b/src/main/java/net/errorcraft/itematic/recipe/book/ItematicRecipeBookOptions.java new file mode 100644 index 00000000..d6179dae --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/recipe/book/ItematicRecipeBookOptions.java @@ -0,0 +1,14 @@ +package net.errorcraft.itematic.recipe.book; + +import com.mojang.serialization.MapCodec; +import net.errorcraft.itematic.mixin.recipe.book.RecipeBookOptionsAccessor; +import net.minecraft.recipe.book.RecipeBookOptions; + +public class ItematicRecipeBookOptions { + public static final MapCodec BREWING_CODEC = RecipeBookOptionsAccessor.CategoryOptionAccessor.createCodec( + "isBrewingStandGuiOpen", + "isBrewingStandFilteringCraftable" + ); + + private ItematicRecipeBookOptions() {} +} diff --git a/src/main/java/net/errorcraft/itematic/recipe/brewing/AmplifyBrewingRecipe.java b/src/main/java/net/errorcraft/itematic/recipe/brewing/AmplifyBrewingRecipe.java index 7d451e27..40a36eca 100644 --- a/src/main/java/net/errorcraft/itematic/recipe/brewing/AmplifyBrewingRecipe.java +++ b/src/main/java/net/errorcraft/itematic/recipe/brewing/AmplifyBrewingRecipe.java @@ -54,7 +54,7 @@ public RecipeSerializer> getSerializer() { @Override public IngredientPlacement getIngredientPlacement() { return IngredientPlacement.forMultipleSlots(List.of( - Optional.of(Ingredient.fromTag(RegistryEntryList.of(this.base()))), + Optional.of(Ingredient.ofTag(RegistryEntryList.of(this.base()))), Optional.of(this.reagent()) )); } diff --git a/src/main/java/net/errorcraft/itematic/recipe/brewing/ModifyBrewingRecipe.java b/src/main/java/net/errorcraft/itematic/recipe/brewing/ModifyBrewingRecipe.java index b58a44ab..0b974739 100644 --- a/src/main/java/net/errorcraft/itematic/recipe/brewing/ModifyBrewingRecipe.java +++ b/src/main/java/net/errorcraft/itematic/recipe/brewing/ModifyBrewingRecipe.java @@ -63,7 +63,7 @@ public IngredientPlacement getIngredientPlacement() { @Override public IngredientPlacement itematic$ingredientPlacement(RegistryEntryLookup items) { return IngredientPlacement.forMultipleSlots(List.of( - items.getOptional(ItematicItemTags.BREWING_INPUTS).map(Ingredient::fromTag), + items.getOptional(ItematicItemTags.BREWING_INPUTS).map(Ingredient::ofTag), Optional.of(this.reagent()) )); } diff --git a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java index eeac7f98..66e3ab91 100644 --- a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java +++ b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java @@ -9,6 +9,7 @@ public class SoundEventKeys { public static final RegistryKey ARMOR_EQUIP_ELYTRA = of("item.armor.equip_elytra"); public static final RegistryKey ARMOR_EQUIP_GENERIC = of("item.armor.equip_generic"); public static final RegistryKey ARMOR_STAND_PLACE = of("entity.armor_stand.place"); + public static final RegistryKey ARMOR_UNEQUIP_WOLF = of("item.armor.unequip_wolf"); public static final RegistryKey BOTTLE_EMPTY = of("item.bottle.empty"); public static final RegistryKey BOTTLE_FILL = of("item.bottle.fill"); public static final RegistryKey BUCKET_EMPTY = of("item.bucket.empty"); @@ -26,9 +27,13 @@ public class SoundEventKeys { public static final RegistryKey FIRE_EXTINGUISH = of("block.fire.extinguish"); public static final RegistryKey FLINT_AND_STEEL_USE = of("item.flintandsteel.use"); public static final RegistryKey GENERIC_SPLASH = of("entity.generic.splash"); + public static final RegistryKey HAPPY_GHAST_EQUIP = of("entity.happy_ghast.equip"); + public static final RegistryKey HAPPY_GHAST_UNEQUIP = of("entity.happy_ghast.unequip"); public static final RegistryKey HOE_TILL = of("item.hoe.till"); public static final RegistryKey HONEY_BOTTLE_DRINK = of("item.honey_bottle.drink"); public static final RegistryKey HORSE_ARMOR = of("entity.horse.armor"); + public static final RegistryKey HORSE_ARMOR_UNEQUIP = of("item.horse_armor.unequip"); + public static final RegistryKey HORSE_SADDLE = of("entity.horse.saddle"); public static final RegistryKey LODESTONE_COMPASS_LOCK = of("item.lodestone_compass.lock"); public static final RegistryKey MUSIC_DISC_5 = of("music_disc.5"); public static final RegistryKey MUSIC_DISC_11 = of("music_disc.11"); @@ -50,6 +55,7 @@ public class SoundEventKeys { public static final RegistryKey MUSIC_DISC_WAIT = of("music_disc.wait"); public static final RegistryKey MUSIC_DISC_WARD = of("music_disc.ward"); public static final RegistryKey OMINOUS_BOTTLE_DISPOSE = of("item.ominous_bottle.dispose"); + public static final RegistryKey SADDLE_UNEQUIP = of("item.saddle.unequip"); public static final RegistryKey SHIELD_BLOCK = of("item.shield.block"); public static final RegistryKey SHIELD_BREAK = of("item.shield.break"); public static final RegistryKey SHOVEL_FLATTEN = of("item.shovel.flatten"); diff --git a/src/main/resources/itematic.classtweaker b/src/main/resources/itematic.classtweaker index 742d52bf..bee6be3b 100644 --- a/src/main/resources/itematic.classtweaker +++ b/src/main/resources/itematic.classtweaker @@ -26,6 +26,11 @@ inject-interface net/minecraft/village/VillagerProfession net/errorcraft/i inject-interface net/minecraft/client/gui/screen/GameModeSwitcherScreen$GameModeSelection net/errorcraft/itematic/access/client/gui/screen/GameModeSwitcherScreenAccess$GameModeSelectionAccess inject-interface net/minecraft/item/ItemPlacementContext net/errorcraft/itematic/access/item/ItemPlacementContextAccess inject-interface net/minecraft/predicate/StatePredicate$Builder net/errorcraft/itematic/access/predicate/StatePredicateAccess$BuilderAccess +inject-interface net/minecraft/entity/attribute/AttributeContainer net/errorcraft/itematic/access/entity/attribute/AttributeContainerAccess +inject-interface net/minecraft/entity/attribute/EntityAttributeInstance net/errorcraft/itematic/access/entity/attribute/EntityAttributeInstanceAccess +inject-interface net/minecraft/entity/attribute/DefaultAttributeContainer net/errorcraft/itematic/access/entity/attribute/DefaultAttributeContainerAccess +inject-interface net/minecraft/client/MinecraftClient net/errorcraft/itematic/access/client/MinecraftClientAccess +inject-interface net/minecraft/recipe/book/RecipeBookOptions net/errorcraft/itematic/access/recipe/book/RecipeBookOptionsAccess extend-enum net/minecraft/recipe/book/RecipeBookType ITEMATIC_BREWING extend-enum net/minecraft/client/recipebook/RecipeBookType ITEMATIC_BREWING diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index 53907f40..84e107bf 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -71,7 +71,6 @@ "block.entity.BannerBlockEntityExtender", "block.entity.BrewingStandBlockEntityExtender", "block.entity.BrewingStandBlockEntityExtender$PropertyDelegateExtender", - "block.entity.DecoratedPotBlockEntityExtender", "block.entity.LecternBlockEntityExtender", "block.entity.SherdsAccessor", "block.entity.SherdsExtender", @@ -342,6 +341,7 @@ "recipe.TippedArrowRecipeExtender", "recipe.TransmuteRecipeExtender", "recipe.TransmuteRecipeResultExtender", + "recipe.book.RecipeBookOptionsAccessor$CategoryOptionAccessor", "recipe.book.RecipeBookOptionsExtender", "recipe.book.RecipeBookTypeExtender", "recipe.display.SlotDisplayExtender$AnyFuelSlotDisplayExtender",