這是不可能的,同時使用Bukkit,由於Bukkit是服務器端,並且不能改變的紋理。但有一個例外:服務器可以發送播放器資源包。但是,似乎沒有辦法根據任何數據創建紋理,因此您必須使所有奶牛看起來都一樣。它不會真的做你想要的。 (玩家是另一個例外,但協議明智,他們的皮膚是任意的)。
但是,如果你想使用Minecraft Forge,這是更易於管理。您可以對實體進行子類化並更改一些渲染代碼。也許你也可以買一些某種東西(可能是品牌鐵),把現有的奶牛轉換成品牌奶牛(它們仍然會像普通奶牛一樣產卵)。我並不是Forge開發者太多,但是這樣的東西應該可以工作(儘管我沒有測試過)。這更多是一個大綱;像轉換實體和創建一個項目,我會留給你。
下面是跟蹤服務器和客戶端之間的粗糙感的entitiy基本輪廓:
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上發佈(Gaming Stack Exchange也有一個minecraft-forge標籤,但這是爲了mod的使用,而不是開發)。
Bukkit/Spigot是Minecraft服務器的變種,可以讓你爲服務器端編寫插件。由於渲染是在客戶端完成的,因此您需要編寫一個「我的世界」mod。你可以在服務器端做的一件事就是讓玩家下載一個自定義資源包,其中奶牛有一個自定義皮膚(儘管所有奶牛都會有相同的皮膚AFAIK)。 Minecraft Forge經常用於編寫客戶端修改。在Gaming Stack Exchange上有一個「minecraft-forge」標籤,人們可以更好地幫助你。 –
謝謝 - 嗯 - 我應該知道的更好! –
這是您提供的僞造代碼,而不是Bukkit。 ;) –