总览
让物品纹理在世界内渲染出来
就是像原版那样,把手上的东西渲染出来
分为以下几个步骤
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同样可以使用
但是逻辑上还有一些问题,比如,如果有多个古遗物都将被渲染到同一个位置上
这些就由你自己去修改吧