Curio custom renderer for the Fire Ward necklace #33

Merged
BlakeRain merged 1 commits from BlakeRain/utamacraft:main into main 2023-12-05 17:42:29 +00:00
9 changed files with 175 additions and 1 deletions

Binary file not shown.

View File

@ -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);
}
}
}

View File

@ -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<LivingEntity> {
public AmuletModel(ModelPart part) {
super(part, RenderType::entityTranslucent);
}
@Override
@Nonnull
protected Iterable<ModelPart> headParts() {
return ImmutableList.of();
}
@Override
@Nonnull
protected Iterable<ModelPart> 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;
}
}

View File

@ -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<LivingEntity> model;
public CuriosRenderer(String texturePath, HumanoidModel<LivingEntity> model) {
this(new ResourceLocation(Utamacraft.MOD_ID, String.format("textures/entity/curio/%s_curio.png", texturePath)), model);
}
public CuriosRenderer(ResourceLocation texture, HumanoidModel<LivingEntity> model) {
this.texture = texture;
this.model = model;
}
@Override
public <T extends LivingEntity, M extends EntityModel<T>> void render(ItemStack stack,
SlotContext slotContext,
PoseStack matrixStack,
RenderLayerParent<T, M> 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);
}
}

View File

@ -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);
}
}

View File

@ -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);
});
}
}

View File

@ -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<Component> pTooltipComponents, TooltipFlag pIsAdvanced) {
public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List<Component> pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) {
super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
pTooltipComponents.add(Component.translatable("tooltip.utamacraft.fire_ward")
.withStyle(ChatFormatting.DARK_RED)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,4 +1,5 @@
{
"replace": false,
"values": [
"utamacraft:fire_ward"
]