如何将纹理映射到Minecraft插件中的实体上

时间:2016-03-20 23:51:58

标签: minecraft bukkit

我试图写一个插件给品牌牛,并认为这很容易,但我一直在寻找可以帮助我做到这一点的信息。

在哪里可以找到有助于我将纹理(例如,从png)映射到实体的信息。虽然有关于玩家等内置纹理的信息,我还没有找到一个资源,可以帮助我理解如何在实体一侧渲染一些东西。

我猜测我会使用类似以下的电话......

Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("tc:textures/gui/my-icon.png"));
Minecraft.getMinecraft().ingameGUI.drawTexturedModalRect(etc);

不确定我是如何将它们强制用于绘制牛或马的。

1 个答案:

答案 0 :(得分:2)

使用 Bukkit 时这是不可能的,因为Bukkit是服务器端的,无法更改纹理。但是有一个例外:服务器可以发送玩家资源包。但是,似乎没有办法根据任何数据创建唯一纹理,因此您必须使所有奶牛看起来都一样。它不会真正做你想要的。 (玩家是另一个例外,但是在协议方面,他们的皮肤无论如何都是任意的。)

但是,如果您想使用 Minecraft Forge ,这将更易于管理。您可以对实体进行子类化并更改某些呈现代码。也许你也可以有一种某种物品(可能是品牌铁)将现有的奶牛转变为品牌奶牛(它们仍会产卵为普通奶牛)。我不是一个Forge开发者,但这样的东西应该有用(虽然我还没有测试过)。这更像是一个大纲;比如转换实体和创建我留给你的项目。

以下是跟踪服务器和客户端之间纹理的权利的基本概要:

import net.minecraft.entity.passive.EntityCow;
import net.minecraft.util.ResourceLocation;

public class EntityBrandedCow extends EntityCow {
    @Override
    protected void entityInit() {
        super.entityInit();
        // Data watcher lets you track data between the server and client
        // without handling packets yourself
        // http://wiki.vg/Entities
        this.dataWatcher.addObject(14, "minecraft:textures/entity/cow/cow.png");
    }

    public void setTexture(ResourceLocation texture) {
        this.dataWatcher.updateObject(14, texture.toString());
    }

    public ResourceLocation getTexture() {
        return new ResourceLocation(this.dataWatcher.getWatchableObjectString(14));
    }
}

您需要为新实体注册自定义渲染器。这将在客户端代理中进行。

RenderingRegistry.registerEntityRenderingHandler(EntityBrandedCow.class, new RenderBrandedCow(Minecraft.getRenderManager(), new ModelCow(), .7f));

这是你可以使用的渲染:

import net.minecraft.util.ResourceLocation;
import net.minecraft.client.model.ModelBase;
import net.minecraft.entity.Entity;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.client.renderer.entity.RenderManager;

public class RenderBrandedCow extends RenderLiving {
    public RenderBrandedCow(RenderManager manager, ModelBase model, float shadowSize) {
        super(manager, model, shadowSize);
    }

    @Override
    protected ResourceLocation getEntityTexture(Entity entity) {
        return ((EntityBrandedCow)entity).getTexture();
    }
}

该渲染器仅更改纹理,并且实际上不会覆盖任何内容。除其他外,这意味着纹理包不会在不创建其他纹理的情况下更改品牌奶牛。另一种方法是创建第二层。 (这取决于羊毛的工作方式 - 见net.minecraft.client.renderer.entity.layers.LayerSheepWoolnet.minecraft.client.renderer.RenderSheep)。您可以将渲染器更改为:

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.client.renderer.entity.RenderManager;

public class RenderBrandedCow extends RenderCow {
    public RenderBrandedCow(RenderManager manager, ModelBase model, float shadowSize) {
        super(manager, model, shadowSize);
        this.addLayer(new LayerCowBrand(this));
    }
}

这是某种图层渲染代码的开始。这本身不起作用;你需要写一个ModelBrand(参见ModelSheep1作为基础)。

public class LayerCowBrand implements LayerRenderer {
    private final BrandedCowRenderer renderer;
    private final ModelBrand model = new ModelBrand();

    public LayerCowBrand(BrandedCowRenderer renderer) {
        this.renderer = renderer;
    }

    public void doRenderLayer(EntityBrandedCow entity, float p_177162_2_, float p_177162_3_, float p_177162_4_, float p_177162_5_, float p_177162_6_, float p_177162_7_, float p_177162_8_) {
        // It's common to write a second method with the right parameters...
        // I don't know off my hand what the parameters here are.
        this.renderer.bindTexture(entity.getTexture());

        this.model.setModelAttributes(this.sheepRenderer.getMainModel());
        this.model.setLivingAnimations(p_177162_1_, p_177162_2_, p_177162_3_, p_177162_4_);
        this.model.render(p_177162_1_, p_177162_2_, p_177162_3_, p_177162_5_, p_177162_6_, p_177162_7_, p_177162_8_);
    }

    public boolean shouldCombineTextures() {
        // I don't know
        return true;
    }

    public void doRenderLayer(EntityLivingBase p_177141_1_, float p_177141_2_, float p_177141_3_, float p_177141_4_, float p_177141_5_, float p_177141_6_, float p_177141_7_, float p_177141_8_) {
        // This is the actual render method that implements the interface.
        this.doRenderLayer((EntityBrandedCow)p_177141_1_, p_177141_2_, p_177141_3_, p_177141_4_, p_177141_5_, p_177141_6_, p_177141_7_, p_177141_8_);
    }
}

希望这至少可以让你开始。正如我所说,我不是锻造开发者,但这应该是基础知识。如果你想问更多关于伪造的问题,可以使用在Stack Overflow上发布(游戏堆栈交换也有一个minecraft-forge标签,但这是用于mod,而不是开发)。