我试图写一个插件给品牌牛,并认为这很容易,但我一直在寻找可以帮助我做到这一点的信息。
在哪里可以找到有助于我将纹理(例如,从png)映射到实体的信息。虽然有关于玩家等内置纹理的信息,我还没有找到一个资源,可以帮助我理解如何在实体一侧渲染一些东西。
我猜测我会使用类似以下的电话......
Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("tc:textures/gui/my-icon.png"));
Minecraft.getMinecraft().ingameGUI.drawTexturedModalRect(etc);
不确定我是如何将它们强制用于绘制牛或马的。
答案 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.LayerSheepWool
和net.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_);
}
}
希望这至少可以让你开始。正如我所说,我不是锻造开发者,但这应该是基础知识。如果你想问更多关于伪造的问题,可以使用minecraft-forge在Stack Overflow上发布(游戏堆栈交换也有一个minecraft-forge标签,但这是用于mod,而不是开发)。