Curio custom renderer for the Fire Ward necklace #33
BIN
assets/fire_ward_curio.afdesign
Normal file
BIN
assets/fire_ward_curio.afdesign
Normal file
Binary file not shown.
@ -1,9 +1,14 @@
|
|||||||
package net.banutama.utamacraft;
|
package net.banutama.utamacraft;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.Subscribe;
|
||||||
import com.mojang.logging.LogUtils;
|
import com.mojang.logging.LogUtils;
|
||||||
|
|
||||||
import net.banutama.utamacraft.block.custom.ModBlocks;
|
import net.banutama.utamacraft.block.custom.ModBlocks;
|
||||||
import net.banutama.utamacraft.block.entity.ModBlockEntities;
|
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.item.ModItems;
|
||||||
|
|
||||||
import net.banutama.utamacraft.networking.ModMessages;
|
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.RecipeBookCategories;
|
||||||
import net.minecraft.client.gui.screens.MenuScreens;
|
import net.minecraft.client.gui.screens.MenuScreens;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.client.event.EntityRenderersEvent;
|
||||||
import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent;
|
import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.eventbus.api.IEventBus;
|
import net.minecraftforge.eventbus.api.IEventBus;
|
||||||
@ -30,6 +36,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import top.theillusivec4.curios.api.SlotTypeMessage;
|
import top.theillusivec4.curios.api.SlotTypeMessage;
|
||||||
import top.theillusivec4.curios.api.SlotTypePreset;
|
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
|
// The value here should match an entry in the META-INF/mods.toml file
|
||||||
@Mod(Utamacraft.MOD_ID)
|
@Mod(Utamacraft.MOD_ID)
|
||||||
@ -66,6 +73,7 @@ public class Utamacraft {
|
|||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onClientSetup(FMLClientSetupEvent event) {
|
public static void onClientSetup(FMLClientSetupEvent event) {
|
||||||
MenuScreens.register(ModMenuTypes.INSOLATOR_MENU.get(), InsolatorScreen::new);
|
MenuScreens.register(ModMenuTypes.INSOLATOR_MENU.get(), InsolatorScreen::new);
|
||||||
|
CuriosRenderers.register();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
@ -83,5 +91,10 @@ public class Utamacraft {
|
|||||||
return RecipeBookCategories.UNKNOWN;
|
return RecipeBookCategories.UNKNOWN;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void onRegisterLayers(EntityRenderersEvent.RegisterLayerDefinitions event) {
|
||||||
|
CuriousLayerDefinitions.register(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,27 +1,41 @@
|
|||||||
package net.banutama.utamacraft.item;
|
package net.banutama.utamacraft.item;
|
||||||
|
|
||||||
|
import net.banutama.utamacraft.Utamacraft;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.TooltipFlag;
|
import net.minecraft.world.item.TooltipFlag;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import top.theillusivec4.curios.api.type.capability.ICurioItem;
|
import top.theillusivec4.curios.api.type.capability.ICurioItem;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class FireWardItem extends Item implements ICurioItem {
|
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() {
|
public FireWardItem() {
|
||||||
super(getProperties());
|
super(getProperties());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFoil(@Nonnull ItemStack stack) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private static Properties getProperties() {
|
private static Properties getProperties() {
|
||||||
return new Properties().tab(ModCreativeModeTab.TAB).stacksTo(1);
|
return new Properties().tab(ModCreativeModeTab.TAB).stacksTo(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
|
||||||
pTooltipComponents.add(Component.translatable("tooltip.utamacraft.fire_ward")
|
pTooltipComponents.add(Component.translatable("tooltip.utamacraft.fire_ward")
|
||||||
.withStyle(ChatFormatting.DARK_RED)
|
.withStyle(ChatFormatting.DARK_RED)
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"replace": false,
|
||||||
"values": [
|
"values": [
|
||||||
"utamacraft:fire_ward"
|
"utamacraft:fire_ward"
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user