昨天穿著鑽石裝的殭屍參考程式碼:
@SubscribeEvent
public void giveArmor(EntityJoinWorldEvent event) {
if(event.entity instanceof EntityZombie) {
event.entity.setCurrentItemOrArmor(0, new ItemStack(Items.diamond_sword));
event.entity.setCurrentItemOrArmor(1, new ItemStack(Items.diamond_chestplate));
event.entity.setCurrentItemOrArmor(2, new ItemStack(Items.diamond_leggings));
event.entity.setCurrentItemOrArmor(3, new ItemStack(Items.diamond_boots));
event.entity.setCurrentItemOrArmor(4, new ItemStack(Items.diamond_helmet));
}
}
回到正題,我們繼續完成前天未完成的課題 - 俄羅斯娃娃
今天我們需要再重新思考一次整個流程:
透過建立新的豬實體,產生另外一個縮小比例的豬實體
EntityJoinWorldEvent
事件
public class PigDoll_v2 {
@SubscribeEvent
public void pigDoll(EntityJoinWorldEvent event) {
}
}
BoundingBox
嗎?在官方網站其中文翻作碰撞箱。關於碰撞箱的一些介紹,有興趣的朋友可以點連結看一下,我們這邊的重點要放在另外一件事實體的初始化與變更大小影響的是碰撞箱範圍,而不是真實在畫面看到的樣子
根據以上的描述,我們接下來會需要處理兩塊:一個是碰撞箱的縮小、另一個是真實畫面渲染的縮小
entities
,並且加入二個類別,EntityScalePig、RenderScalePig
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
Set ids = EntityList.idToClassMapping.keySet();
int availableId = 1;
while (EntityList.getClassFromID(availableId) != null) {
availableId++;
}
EntityRegistry.registerGlobalEntityID(EntityScalePig.class, EntityScalePig.name, availableId);
}
這裡的FMLPreInitializationEvent
是Forge在初始化前會執行的事件。我們在這邊透過EntityRegistry的registerGlobalEntityID方法來註冊一個global的實體;其中
public class EntityScalePig extends EntityPig {
public static final String name = "MyPig";
public EntityScalePig(World worldIn) {
super(worldIn);
}
public void scale(float scale) {
this.setSize(width * scale, height * scale);
}
}
這裡我們透過extends
關鍵字來擴展實體豬類別EntityPig
,並且定義剛剛在主程式用到的name,注意:這個名字也必須要唯一。另外,因為這個類別需要能夠控制大小,我們額外加了一個scale(float scale)
方法來定義這個實體的大小。@SideOnly(Side.CLIENT)
public class RenderScalePig extends RenderLiving {
private static final ResourceLocation textures = new ResourceLocation("textures/entity/pig/pig.png");
private float scale = 1.0f;
public RenderScalePig(RenderManager renderManager, ModelBase modelBase, float shadowSize)
{
super(renderManager, modelBase, shadowSize);
}
public void setScale(float scale) {
this.scale = scale;
}
protected void preRenderCallback(EntityLivingBase entityLivingBase, float tickTime)
{
GlStateManager.scale(this.scale, this.scale, this.scale);
}
@Override
protected ResourceLocation getEntityTexture(Entity entity)
{
return textures;
}
}
這裡我們一步一步來說明:
好了,今天就先到這邊,我們明天會再繼續將PigDoll_v2類別的程式碼完成。
關於今天的程式碼內容,不是很了解沒關係,但還是希望有興趣的朋友們可以照順序也自己完成一次,這樣我們後面在說明模組的處理流程會有比較清楚的概念。
這個模組目前似乎還沒有人做出來過...若是有概念不清楚的地方歡迎提問,我會就我所理解的盡可能地回答~