diff --git a/assets/fire_ward_curio.afdesign b/assets/fire_ward_curio.afdesign new file mode 100644 index 0000000..6f81028 Binary files /dev/null and b/assets/fire_ward_curio.afdesign differ diff --git a/src/main/java/net/banutama/utamacraft/Utamacraft.java b/src/main/java/net/banutama/utamacraft/Utamacraft.java index f403c0c..c1b9637 100644 --- a/src/main/java/net/banutama/utamacraft/Utamacraft.java +++ b/src/main/java/net/banutama/utamacraft/Utamacraft.java @@ -1,9 +1,14 @@ package net.banutama.utamacraft; +import com.google.common.eventbus.Subscribe; import com.mojang.logging.LogUtils; import net.banutama.utamacraft.block.custom.ModBlocks; import net.banutama.utamacraft.block.entity.ModBlockEntities; +import net.banutama.utamacraft.client.model.AmuletModel; +import net.banutama.utamacraft.integrations.curios.CuriosRenderers; +import net.banutama.utamacraft.integrations.curios.CuriousLayerDefinitions; +import net.banutama.utamacraft.item.FireWardItem; import net.banutama.utamacraft.item.ModItems; import net.banutama.utamacraft.networking.ModMessages; @@ -16,6 +21,7 @@ import net.banutama.utamacraft.world.feature.ModPlacedFeatures; import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; @@ -30,6 +36,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; import top.theillusivec4.curios.api.SlotTypeMessage; import top.theillusivec4.curios.api.SlotTypePreset; +import top.theillusivec4.curios.api.client.CuriosRendererRegistry; // The value here should match an entry in the META-INF/mods.toml file @Mod(Utamacraft.MOD_ID) @@ -66,6 +73,7 @@ public class Utamacraft { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(ModMenuTypes.INSOLATOR_MENU.get(), InsolatorScreen::new); + CuriosRenderers.register(); } @SubscribeEvent @@ -83,5 +91,10 @@ public class Utamacraft { return RecipeBookCategories.UNKNOWN; }); } + + @SubscribeEvent + public static void onRegisterLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + CuriousLayerDefinitions.register(event); + } } } diff --git a/src/main/java/net/banutama/utamacraft/client/model/AmuletModel.java b/src/main/java/net/banutama/utamacraft/client/model/AmuletModel.java new file mode 100644 index 0000000..97e09a5 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/client/model/AmuletModel.java @@ -0,0 +1,54 @@ +package net.banutama.utamacraft.client.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; + +public class AmuletModel extends HumanoidModel { + public AmuletModel(ModelPart part) { + super(part, RenderType::entityTranslucent); + } + + @Override + @Nonnull + protected Iterable headParts() { + return ImmutableList.of(); + } + + @Override + @Nonnull + protected Iterable bodyParts() { + return ImmutableList.of(body); + } + + @Override + public void renderToBuffer(PoseStack pPoseStack, @NotNull VertexConsumer pBuffer, int pPackedLight, int pPackedOverlay, float pRed, float pGreen, float pBlue, float pAlpha) { + pPoseStack.pushPose(); + pPoseStack.scale(0.25f, 0.25f, 0.25f); + super.renderToBuffer(pPoseStack, pBuffer, pPackedLight, pPackedOverlay, pRed, pGreen, pBlue, pAlpha); + pPoseStack.popPose(); + } + + public static MeshDefinition createFireWard() { + CubeListBuilder body = CubeListBuilder.create(); + + body.texOffs(0, 0); + body.addBox(-7.0f, 2.5f, -12.5f, 14, 14, 1); + + MeshDefinition mesh = createMesh(CubeDeformation.NONE, 0); + mesh.getRoot().addOrReplaceChild("body", body, PartPose.ZERO); + + return mesh; + } +} \ No newline at end of file diff --git a/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderer.java b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderer.java new file mode 100644 index 0000000..490b815 --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderer.java @@ -0,0 +1,53 @@ +package net.banutama.utamacraft.integrations.curios; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.banutama.utamacraft.Utamacraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; + +public class CuriosRenderer implements ICurioRenderer { + private final ResourceLocation texture; + private final HumanoidModel model; + + public CuriosRenderer(String texturePath, HumanoidModel model) { + this(new ResourceLocation(Utamacraft.MOD_ID, String.format("textures/entity/curio/%s_curio.png", texturePath)), model); + } + + public CuriosRenderer(ResourceLocation texture, HumanoidModel model) { + this.texture = texture; + this.model = model; + } + + @Override + public > void render(ItemStack stack, + SlotContext slotContext, + PoseStack matrixStack, + RenderLayerParent renderLayerParent, + MultiBufferSource renderTypeBuffer, + int light, + float limbSwing, + float limbSwingAmount, + float partialTicks, + float ageInTicks, + float netHeadYaw, + float headPitch) { + model.setupAnim(slotContext.entity(), limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + model.prepareMobModel(slotContext.entity(), limbSwing, limbSwingAmount, partialTicks); + ICurioRenderer.followBodyRotations(slotContext.entity(), model); + + RenderType renderType = model.renderType(texture); + VertexConsumer vertexConsumer = ItemRenderer.getFoilBuffer(renderTypeBuffer, renderType, false, stack.hasFoil()); + model.renderToBuffer(matrixStack, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0f, 1.0f, 1.0f, 1.0f); + } +} diff --git a/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderers.java b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderers.java new file mode 100644 index 0000000..0d6571e --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriosRenderers.java @@ -0,0 +1,20 @@ +package net.banutama.utamacraft.integrations.curios; + +import net.banutama.utamacraft.client.model.AmuletModel; +import net.banutama.utamacraft.item.ModItems; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import top.theillusivec4.curios.api.client.CuriosRendererRegistry; + +public class CuriosRenderers { + public static void register() { + CuriosRendererRegistry.register(ModItems.FIRE_WARD.get(), () -> { + return new CuriosRenderer("fire_ward", new AmuletModel(bakeLayer(CuriousLayerDefinitions.FIRE_WARD))); + }); + } + + private static ModelPart bakeLayer(ModelLayerLocation layerLocation) { + return Minecraft.getInstance().getEntityModels().bakeLayer(layerLocation); + } +} diff --git a/src/main/java/net/banutama/utamacraft/integrations/curios/CuriousLayerDefinitions.java b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriousLayerDefinitions.java new file mode 100644 index 0000000..1b26c3f --- /dev/null +++ b/src/main/java/net/banutama/utamacraft/integrations/curios/CuriousLayerDefinitions.java @@ -0,0 +1,19 @@ +package net.banutama.utamacraft.integrations.curios; + +import net.banutama.utamacraft.Utamacraft; +import net.banutama.utamacraft.client.model.AmuletModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.event.EntityRenderersEvent; + +public class CuriousLayerDefinitions { + public static final ModelLayerLocation FIRE_WARD = + new ModelLayerLocation(new ResourceLocation(Utamacraft.MOD_ID, "fire_ward"), "fire_ward"); + + public static void register(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(FIRE_WARD, () -> { + return LayerDefinition.create(AmuletModel.createFireWard(), 16, 16); + }); + } +} diff --git a/src/main/java/net/banutama/utamacraft/item/FireWardItem.java b/src/main/java/net/banutama/utamacraft/item/FireWardItem.java index e87aa6d..a16ab90 100644 --- a/src/main/java/net/banutama/utamacraft/item/FireWardItem.java +++ b/src/main/java/net/banutama/utamacraft/item/FireWardItem.java @@ -1,27 +1,41 @@ package net.banutama.utamacraft.item; +import net.banutama.utamacraft.Utamacraft; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.theillusivec4.curios.api.type.capability.ICurioItem; +import javax.annotation.Nonnull; import java.util.List; public class FireWardItem extends Item implements ICurioItem { + private static final ResourceLocation FIRE_WARD_TEXTURE = + new ResourceLocation(Utamacraft.MOD_ID, "textures/item/fire_ward.png"); + + private Object model; + public FireWardItem() { super(getProperties()); } + @Override + public boolean isFoil(@Nonnull ItemStack stack) { + return true; + } + private static Properties getProperties() { return new Properties().tab(ModCreativeModeTab.TAB).stacksTo(1); } @Override - public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { + public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); pTooltipComponents.add(Component.translatable("tooltip.utamacraft.fire_ward") .withStyle(ChatFormatting.DARK_RED) diff --git a/src/main/resources/assets/utamacraft/textures/entity/curio/fire_ward_curio.png b/src/main/resources/assets/utamacraft/textures/entity/curio/fire_ward_curio.png new file mode 100644 index 0000000..cc2db8d Binary files /dev/null and b/src/main/resources/assets/utamacraft/textures/entity/curio/fire_ward_curio.png differ diff --git a/src/main/resources/data/curios/tags/items/necklace.json b/src/main/resources/data/curios/tags/items/necklace.json index 6144672..6595b3b 100644 --- a/src/main/resources/data/curios/tags/items/necklace.json +++ b/src/main/resources/data/curios/tags/items/necklace.json @@ -1,4 +1,5 @@ { + "replace": false, "values": [ "utamacraft:fire_ward" ]