1.20.1forge and fabric自定义纹理渲染层——像原版那样让物品在世界内渲染出来

总览

让物品纹理在世界内渲染出来
就是像原版那样,把手上的东西渲染出来
分为以下几个步骤
1、继承ItemInHandLayer
2、添加这个layer
3、注册这个layer
另外,莱特兰团队制作的一系列模组也是很赞的,可以支持一下国内团队!

实现ItemInHandLayer

为什么是ItemInHandLayer?
因为只渲染纹理,没有模型的话,原版就是这样实现的
如果你想渲染模型,那就需要RenderLayer
这里,以ItemInHandLayer为例

public class TestLayer extends ItemInHandLayer{
	//纹理大小预设
    float scaleX=1;
    float scaleY=1;
    float scaleZ=1;
    ItemInHandRenderer itemInHandRenderer;
	//这里的EntityModelSet我们不需要,先不用管
    public TestLayer(RenderLayerParent parent, EntityModelSet set, ItemInHandRenderer renderer) {
        this(parent, set, 1.0F, 1.0F, 1.0F, renderer);
    }

    public TestLayer(RenderLayerParent parent, EntityModelSet set, float x, float y, float z, ItemInHandRenderer renderer) {
        super(parent,renderer);
        this.scaleX = x;
        this.scaleY = y;
        this.scaleZ = z;
        this.itemInHandRenderer = renderer;
    }

    public void render(PoseStack pose, MultiBufferSource buffer, int i, LivingEntity entity, float f0, float f1, float f2, float f3, float f4, float f5) {
        if (!(entity instanceof Player))//我们只给玩家渲染,如果你像给别的什么渲染,自行更改
            return ;
        List<SlotResult> list = CuriosApi.getCuriosHelper().findCurios(entity, stack -> stack.getItem() instanceof BaseArtifact);//这里使用了饰品栏的api,先不管,下面只要传入ItemStack就行

            if(list !=null){
                for (SlotResult result : list) {
                	//判断物品要不要渲染
                    ItemStack stack = result.stack();
                    BaseArtifact base = (BaseArtifact) stack.getItem();
                    pose.pushPose();//开始渲染的配置信息
                    //translate是平移,三个参数分别是xyz,这里我们要做的是达摩克里斯之剑的渲染
                    //想要玩家半血以下即死,再用sin加上daytime实现渲染物品上下浮动的效果
                    //做到半血的时候刚好贴着玩家的头,之后斩杀
                    pose.translate(0.58D,-0.62d+0.5-entity.getHealth()/entity.getMaxHealth()-Math.sin((double)entity.level().getDayTime()/20)/8-0.125, -0.5D);
                    pose.scale(this.scaleX, this.scaleY, this.scaleZ);//大小
                    pose.mulPose(Axis.ZP.rotationDegrees(135F));//按z轴旋转
                    this.itemInHandRenderer.renderItem(entity, stack, ItemDisplayContext.HEAD, false, pose, buffer, i);//玩家、物品、文本、是否在左手渲染、位置、一些信息、模型索引
                    pose.popPose();
                }
            }
    }
}

添加layer

注意这里只是加入layer,并不是注册

public class ArtifactRenderEvent {
	//注册名
    private static final String REG_NAME = "artifact";
    //资源路径
    public static final ModelLayerLocation ARTIFACT_LAYER = new ModelLayerLocation(new ResourceLocation("l2artifacts", "damocles"), "main");

    public ArtifactRenderEvent() {
    }
	//这里只是将layer添加入renderManager,并不是注册
    public static void registerArtifactLayer() {
        EntityRenderDispatcher renderManager = Minecraft.getInstance().getEntityRenderDispatcher();
        Map<String, EntityRenderer<? extends Player>> skinMap = renderManager.getSkinMap();
        Iterator var2 = skinMap.values().iterator();
		//判断需不需要渲染
        while(var2.hasNext()) {
            EntityRenderer<? extends Player> renderer = (EntityRenderer)var2.next();
            if (renderer instanceof LivingEntityRenderer) {
                LivingEntityRenderer ler = (LivingEntityRenderer)renderer;
                addLayer(renderManager, ler);
            }
        }
    }
    private static <T extends LivingEntity, M extends HumanoidModel<T>> void addLayer(EntityRenderDispatcher manager, LivingEntityRenderer<T, M> ler) {
        Minecraft mc = Minecraft.getInstance();
        //添加
        ler.addLayer(new TestLayer(ler, mc.getEntityModels(), manager.getItemInHandRenderer()));
    }

}

注册layer

@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = L2Artifacts.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ArtifactClient {
	@SubscribeEvent
	public static void registerReloadListener(RegisterClientReloadListenersEvent event) {
		event.registerReloadListener((ResourceManagerReloadListener) resourceManager -> ArtifactRenderEvent.registerArtifactLayer());
	}
}

至此

我们添加了一个糖果在头上
添加了一个糖果在头上侧面
因为这个糖果的大小是512*512,所以侧面看起来有锯齿
旁边的烟雾粒子是正在制作的自定义粒子
我们暂时只渲染饰品栏里的所有古遗物
关于纹理,因为你要显示的是已经完成注册的物品,纹理也请自己先行完成添加
所以你需要先完成添加物品的工作,但也可以使用原版的物品
这里使用的全都是原版的方式(除了饰品栏api),并不是必须使用forge
只是本文是在forgeApi下开发的,理论上代码在fabric同样可以使用
但是逻辑上还有一些问题,比如,如果有多个古遗物都将被渲染到同一个位置上
这些就由你自己去修改吧

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值