From 702e0800026882a2ab92517fc936190d9116031c Mon Sep 17 00:00:00 2001 From: Insane96 Date: Thu, 11 Aug 2022 20:33:31 +0200 Subject: [PATCH] Added recipe to apply banners to shields --- changelog.md | 2 + .../insane96mcp/shieldsplus/ShieldsPlus.java | 2 + .../module/base/feature/BaseFeature.java | 2 +- ...ShieldBlockEntityWithoutLevelRenderer.java | 2 +- .../insane96mcp/shieldsplus/setup/Client.java | 2 +- .../shieldsplus/setup/SPItems.java | 4 +- .../setup/SPRecipeSerializers.java | 15 ++++ .../shieldsplus/setup/SPShieldMaterials.java | 2 +- .../{ => world}/item/SPShieldItem.java | 12 ++- .../{ => world}/item/SPShieldMaterial.java | 2 +- .../crafting/SPShieldDecorationRecipe.java | 89 +++++++++++++++++++ .../recipes/shield_decoration.json | 3 + 12 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/insane96mcp/shieldsplus/setup/SPRecipeSerializers.java rename src/main/java/com/insane96mcp/shieldsplus/{ => world}/item/SPShieldItem.java (88%) rename src/main/java/com/insane96mcp/shieldsplus/{ => world}/item/SPShieldMaterial.java (94%) create mode 100644 src/main/java/com/insane96mcp/shieldsplus/world/item/crafting/SPShieldDecorationRecipe.java create mode 100644 src/main/resources/data/shieldsplus/recipes/shield_decoration.json diff --git a/changelog.md b/changelog.md index 4c0dd9d..486249d 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,8 @@ # Changelog ## Upcoming +* Added Copper Shield +* Added recipe to apply banners to shields * Added Combat Test shield disabling * Fixed (hopefully) vanilla shield recipe not being overridden diff --git a/src/main/java/com/insane96mcp/shieldsplus/ShieldsPlus.java b/src/main/java/com/insane96mcp/shieldsplus/ShieldsPlus.java index a0ad92c..668d8f5 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/ShieldsPlus.java +++ b/src/main/java/com/insane96mcp/shieldsplus/ShieldsPlus.java @@ -3,6 +3,7 @@ import com.insane96mcp.shieldsplus.setup.Client; import com.insane96mcp.shieldsplus.setup.Config; import com.insane96mcp.shieldsplus.setup.SPItems; +import com.insane96mcp.shieldsplus.setup.SPRecipeSerializers; import com.mojang.logging.LogUtils; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModLoadingContext; @@ -23,5 +24,6 @@ public ShieldsPlus() FMLJavaModLoadingContext.get().getModEventBus().addListener(Client::setup); final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); SPItems.ITEMS.register(modEventBus); + SPRecipeSerializers.RECIPE_SERIALIZERS.register(modEventBus); } } diff --git a/src/main/java/com/insane96mcp/shieldsplus/module/base/feature/BaseFeature.java b/src/main/java/com/insane96mcp/shieldsplus/module/base/feature/BaseFeature.java index 2e03df0..d8f642f 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/module/base/feature/BaseFeature.java +++ b/src/main/java/com/insane96mcp/shieldsplus/module/base/feature/BaseFeature.java @@ -1,8 +1,8 @@ package com.insane96mcp.shieldsplus.module.base.feature; -import com.insane96mcp.shieldsplus.item.SPShieldItem; import com.insane96mcp.shieldsplus.setup.Config; import com.insane96mcp.shieldsplus.setup.SPShieldMaterials; +import com.insane96mcp.shieldsplus.world.item.SPShieldItem; import insane96mcp.insanelib.base.Feature; import insane96mcp.insanelib.base.Label; import insane96mcp.insanelib.base.Module; diff --git a/src/main/java/com/insane96mcp/shieldsplus/render/ShieldBlockEntityWithoutLevelRenderer.java b/src/main/java/com/insane96mcp/shieldsplus/render/ShieldBlockEntityWithoutLevelRenderer.java index f7038b9..8259685 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/render/ShieldBlockEntityWithoutLevelRenderer.java +++ b/src/main/java/com/insane96mcp/shieldsplus/render/ShieldBlockEntityWithoutLevelRenderer.java @@ -1,7 +1,7 @@ package com.insane96mcp.shieldsplus.render; import com.insane96mcp.shieldsplus.ShieldsPlus; -import com.insane96mcp.shieldsplus.item.SPShieldItem; +import com.insane96mcp.shieldsplus.world.item.SPShieldItem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.datafixers.util.Pair; diff --git a/src/main/java/com/insane96mcp/shieldsplus/setup/Client.java b/src/main/java/com/insane96mcp/shieldsplus/setup/Client.java index 227a350..7004b88 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/setup/Client.java +++ b/src/main/java/com/insane96mcp/shieldsplus/setup/Client.java @@ -1,7 +1,7 @@ package com.insane96mcp.shieldsplus.setup; import com.insane96mcp.shieldsplus.ShieldsPlus; -import com.insane96mcp.shieldsplus.item.SPShieldItem; +import com.insane96mcp.shieldsplus.world.item.SPShieldItem; import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.client.renderer.item.ItemPropertyFunction; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/insane96mcp/shieldsplus/setup/SPItems.java b/src/main/java/com/insane96mcp/shieldsplus/setup/SPItems.java index d0e1d46..56bf53c 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/setup/SPItems.java +++ b/src/main/java/com/insane96mcp/shieldsplus/setup/SPItems.java @@ -1,8 +1,8 @@ package com.insane96mcp.shieldsplus.setup; import com.insane96mcp.shieldsplus.ShieldsPlus; -import com.insane96mcp.shieldsplus.item.SPShieldItem; -import com.insane96mcp.shieldsplus.item.SPShieldMaterial; +import com.insane96mcp.shieldsplus.world.item.SPShieldItem; +import com.insane96mcp.shieldsplus.world.item.SPShieldMaterial; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraftforge.registries.DeferredRegister; diff --git a/src/main/java/com/insane96mcp/shieldsplus/setup/SPRecipeSerializers.java b/src/main/java/com/insane96mcp/shieldsplus/setup/SPRecipeSerializers.java new file mode 100644 index 0000000..e951cdf --- /dev/null +++ b/src/main/java/com/insane96mcp/shieldsplus/setup/SPRecipeSerializers.java @@ -0,0 +1,15 @@ +package com.insane96mcp.shieldsplus.setup; + +import com.insane96mcp.shieldsplus.ShieldsPlus; +import com.insane96mcp.shieldsplus.world.item.crafting.SPShieldDecorationRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleRecipeSerializer; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class SPRecipeSerializers { + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, ShieldsPlus.MOD_ID); + + public static final RegistryObject> SHIELD_DECORATION_RECIPE = RECIPE_SERIALIZERS.register("shield_decoration_recipe", () -> new SimpleRecipeSerializer<>(SPShieldDecorationRecipe::new)); +} diff --git a/src/main/java/com/insane96mcp/shieldsplus/setup/SPShieldMaterials.java b/src/main/java/com/insane96mcp/shieldsplus/setup/SPShieldMaterials.java index ba2a673..41ad05c 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/setup/SPShieldMaterials.java +++ b/src/main/java/com/insane96mcp/shieldsplus/setup/SPShieldMaterials.java @@ -1,6 +1,6 @@ package com.insane96mcp.shieldsplus.setup; -import com.insane96mcp.shieldsplus.item.SPShieldMaterial; +import com.insane96mcp.shieldsplus.world.item.SPShieldMaterial; import net.minecraft.world.item.Rarity; public class SPShieldMaterials { diff --git a/src/main/java/com/insane96mcp/shieldsplus/item/SPShieldItem.java b/src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldItem.java similarity index 88% rename from src/main/java/com/insane96mcp/shieldsplus/item/SPShieldItem.java rename to src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldItem.java index 8d91a39..e5e22aa 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/item/SPShieldItem.java +++ b/src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldItem.java @@ -1,4 +1,4 @@ -package com.insane96mcp.shieldsplus.item; +package com.insane96mcp.shieldsplus.world.item; import com.insane96mcp.shieldsplus.ShieldsPlus; import com.insane96mcp.shieldsplus.render.ShieldBlockEntityWithoutLevelRenderer; @@ -17,6 +17,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.IItemRenderProperties; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.text.DecimalFormat; @@ -38,6 +39,10 @@ public SPShieldItem(SPShieldMaterial material, Properties p_43089_) { this.material = material; } + public @NotNull String getDescriptionId(@NotNull ItemStack itemStack) { + return super.getDescriptionId(); + } + public double getBlockedDamage() { return this.material.damageBlocked; } @@ -63,6 +68,11 @@ public static void addDamageBlockedText(List components, double block components.add(new TranslatableComponent(Strings.Translatable.DAMAGE_BLOCKED, new DecimalFormat("#.#").format(blockedDamage)).withStyle(ChatFormatting.BLUE)); } + @Override + public boolean isValidRepairItem(ItemStack repaired, ItemStack repairingMaterial) { + return super.isValidRepairItem(repaired, repairingMaterial); + } + @OnlyIn(Dist.CLIENT) public void initClientMaterial() { this.clientMaterial = new Material(InventoryMenu.BLOCK_ATLAS, new ResourceLocation(ShieldsPlus.MOD_ID, "entity/%s_shield".formatted(this.material.materialName))); diff --git a/src/main/java/com/insane96mcp/shieldsplus/item/SPShieldMaterial.java b/src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldMaterial.java similarity index 94% rename from src/main/java/com/insane96mcp/shieldsplus/item/SPShieldMaterial.java rename to src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldMaterial.java index 13d2b20..28082f9 100644 --- a/src/main/java/com/insane96mcp/shieldsplus/item/SPShieldMaterial.java +++ b/src/main/java/com/insane96mcp/shieldsplus/world/item/SPShieldMaterial.java @@ -1,4 +1,4 @@ -package com.insane96mcp.shieldsplus.item; +package com.insane96mcp.shieldsplus.world.item; import net.minecraft.world.item.Rarity; diff --git a/src/main/java/com/insane96mcp/shieldsplus/world/item/crafting/SPShieldDecorationRecipe.java b/src/main/java/com/insane96mcp/shieldsplus/world/item/crafting/SPShieldDecorationRecipe.java new file mode 100644 index 0000000..93891fd --- /dev/null +++ b/src/main/java/com/insane96mcp/shieldsplus/world/item/crafting/SPShieldDecorationRecipe.java @@ -0,0 +1,89 @@ +package com.insane96mcp.shieldsplus.world.item.crafting; + +import com.insane96mcp.shieldsplus.setup.SPRecipeSerializers; +import com.insane96mcp.shieldsplus.world.item.SPShieldItem; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.BannerItem; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import org.jetbrains.annotations.NotNull; + +public class SPShieldDecorationRecipe extends CustomRecipe { + public SPShieldDecorationRecipe(ResourceLocation id) { + super(id); + } + + public boolean matches(CraftingContainer craftingContainer, @NotNull Level level) { + ItemStack shieldStack = ItemStack.EMPTY; + ItemStack bannerStack = ItemStack.EMPTY; + + for(int i = 0; i < craftingContainer.getContainerSize(); ++i) { + ItemStack itemStack = craftingContainer.getItem(i); + if (!itemStack.isEmpty()) { + if (itemStack.getItem() instanceof BannerItem) { + if (!bannerStack.isEmpty()) { + return false; + } + + bannerStack = itemStack; + } + else { + if (!(itemStack.getItem() instanceof SPShieldItem)) { + return false; + } + + if (!shieldStack.isEmpty()) { + return false; + } + + if (BlockItem.getBlockEntityData(itemStack) != null) { + return false; + } + + shieldStack = itemStack; + } + } + } + + return !shieldStack.isEmpty() && !bannerStack.isEmpty(); + } + + public @NotNull ItemStack assemble(CraftingContainer craftingContainer) { + ItemStack bannerStack = ItemStack.EMPTY; + ItemStack shieldStack = ItemStack.EMPTY; + + for(int i = 0; i < craftingContainer.getContainerSize(); ++i) { + ItemStack itemStack = craftingContainer.getItem(i); + if (!itemStack.isEmpty()) { + if (itemStack.getItem() instanceof BannerItem) { + bannerStack = itemStack; + } + else if (itemStack.getItem() instanceof SPShieldItem) { + shieldStack = itemStack.copy(); + } + } + } + + if (!shieldStack.isEmpty()) { + CompoundTag bannerTag = BlockItem.getBlockEntityData(bannerStack); + CompoundTag shieldTag = bannerTag == null ? new CompoundTag() : bannerTag.copy(); + shieldTag.putInt("Base", ((BannerItem) bannerStack.getItem()).getColor().getId()); + BlockItem.setBlockEntityData(shieldStack, BlockEntityType.BANNER, shieldTag); + } + return shieldStack; + } + + public boolean canCraftInDimensions(int width, int height) { + return width * height >= 2; + } + + public @NotNull RecipeSerializer getSerializer() { + return SPRecipeSerializers.SHIELD_DECORATION_RECIPE.get(); + } +} diff --git a/src/main/resources/data/shieldsplus/recipes/shield_decoration.json b/src/main/resources/data/shieldsplus/recipes/shield_decoration.json new file mode 100644 index 0000000..9037d2d --- /dev/null +++ b/src/main/resources/data/shieldsplus/recipes/shield_decoration.json @@ -0,0 +1,3 @@ +{ + "type": "shieldsplus:shield_decoration_recipe" +} \ No newline at end of file