2016-03-20 59 views
-1

我正在嘗試爲品牌牛編寫插件,並認爲這會非常容易,但我一直在尋找能夠幫助我做到這一點的信息。如何將紋理映射到Minecraft插件中的實體

我在哪裏可以找到幫助我將紋理(例如png)映射到實體的信息。雖然有關於玩家等內置紋理的信息,但我還沒有找到能夠幫助我理解如何在實體的一側渲染某些內容的資源。

我猜,我會使用類似如下的電話......

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

不能肯定我怎麼會強制他們到牛或馬的圖畫。

+1

Bukkit/Spigot是Minecraft服務器的變種,可以讓你爲服務器端編寫插件。由於渲染是在客戶端完成的,因此您需要編寫一個「我的世界」mod。你可以在服務器端做的一件事就是讓玩家下載一個自定義資源包,其中奶牛有一個自定義皮膚(儘管所有奶牛都會有相同的皮膚AFAIK)。 Minecraft Forge經常用於編寫客戶端修改。在Gaming Stack Exchange上有一個「minecraft-forge」標籤,人們可以更好地幫助你。 –

+0

謝謝 - 嗯 - 我應該知道的更好! –

+0

這是您提供的僞造代碼,而不是Bukkit。 ;) –

回答

2

這是不可能的,同時使用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.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上發佈(Gaming Stack Exchange也有一個minecraft-forge標籤,但這是爲了mod的使用,而不是開發)。