提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「==MOBの追加==」)
 
(継承の誤りを修正。)
 
(他の1人の利用者による、間の7版が非表示)
1行目: 1行目:
 +
{{前提MOD|reqmod="Minecraft Forge Universal 9.10.0.871~"}}
 +
{{ チュートリアル難易度 | difficulty=1 |clear=none}}
 +
{{チュートリアルカテゴリー|type=Entity| difficulty=1}}
 +
'''このページは、編集中です。'''
 
==MOBの追加==
 
==MOBの追加==
 +
EntityLivingを継承して、MOBを追加します。
 +
モデルやAIも実装します
 +
===ソースコード===
 +
*SampleEntityCore.java
 +
<source lang="java">
 +
package mods.entity;
 +
 +
import cpw.mods.fml.client.registry.RenderingRegistry;
 +
import cpw.mods.fml.common.FMLCommonHandler;
 +
import cpw.mods.fml.common.Mod;
 +
import cpw.mods.fml.common.event.FMLInitializationEvent;
 +
import cpw.mods.fml.common.registry.EntityRegistry;
 +
import cpw.mods.fml.relauncher.Side;
 +
import net.minecraft.entity.EnumCreatureType;
 +
import net.minecraft.world.biome.BiomeGenBase;
 +
 +
@Mod(modid = "SampleEntity", name = "SampleEntity", version = "1.0.0")
 +
public class SampleEntityCore {
 +
    @EventHandler
 +
    public void init(FMLInitialization event) {
 +
        EntityRegistry.registerModEntity(EntitySample.class, "SampleEntity", 0, this, 250, 1, false);
 +
        EntityRegistry.addSpawn(EntitySample.class, 20, 1, 4, EnumCreatureType.creature, BiomeGenBase.plains);
 +
        if(FMLCommonHandler.instance().getSide() == Side.CLIENT) {
 +
RenderingRegistry.registerEntityRenderingHandler(EntitySample.class, new RenderSample());
 +
        }
 +
}
 +
</source>
 +
 +
*EntitySample.java
 +
<source lang="java">
 +
package mods.entity;
 +
 +
import net.minecraft.block.Block;
 +
import net.minecraft.entity.EnumCreatureAttribute;
 +
import net.minecraft.entity.EntityLiving;
 +
import net.minecraft.entity.ai.EntityAIWander;
 +
import net.minecraft.entity.ai.EntityAILookIdle;
 +
import net.minecraft.init.Items;
 +
import net.minecraft.item.Item;
 +
import net.minecraft.world.World;
 +
 +
 +
public class EntitySample extends EntityCreature {
 +
    public EntitySample(World world) {
 +
        super(world);
 +
        // うろうろ移動するAIの追加
 +
this.tasks.addTask(1, new EntityAIWander(this, 1.0D));
 +
// 見回すAIの追加
 +
this.tasks.addTask(2, new EntityAILookIdle(this));
 +
    }
 +
 +
    @Override
 +
    public boolean isAIEnabled() { return true; }
 +
 +
    @Override
 +
    public String getLivingSound() { return /* MOBが生きている時の音のファイルパスを返す。 */ ; }
 +
 +
    @Override
 +
    public String getHurtSound() { return /* MOBがダメージを受けた時の音のファイルパスを返す。 */ ; }
 +
 +
    @Override
 +
    public String getDeathSound() { return /* MOBが死亡した時の音のファイルパスを返す。*/ ; }
 +
 +
    /*
 +
    * このMobが動いているときの音のファイルパスを返す.
 +
    * 引数のblockはMobの下にあるBlock.
 +
    */
 +
    @Override
 +
    protected void func_145780_a(int x, int y, int z, Block block)
 +
    {
 +
this.playSound("mob.skeleton.step", 0.15F, 1.0F);
 +
    }
 +
 +
  @Override
 +
    public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEFINED; }
 +
 +
    @Override
 +
    public Item getDropItem() { return /* ドロップするアイテム */ ; }
 +
}
 +
</source>
 +
*RenderSample.java
 +
<source lang="java">
 +
package mods.entity;
 +
 +
import net.minecraft.client.renderer.entity.RenderBiped;
 +
import net.minecraft.entity.EntityLiving;
 +
import net.minecraft.util.ResourceLocation;
 +
 +
public class RenderSample extends Render {
 +
    public static final ResourceLocation texture = new ResourceLocation("entity:textures/entity/sample.png");
 +
    public RenderSample() {
 +
        // 引数:(ModelBase以降を継承したクラスのインスタンス、影の大きさ)
 +
        super(new ModelSample(), 0.6f);
 +
    }
 +
 +
    public ResourceLocation getEntityTexture(EntityLiving entity) { return texture; }
 +
}
 +
</source>
 +
 +
*ModelSample.java
 +
<source lang="java">
 +
package mods.entity;
 +
 +
import net.minecraft.client.model.ModelBase;
 +
import net.minecraft.client.model.ModelRenderer;
 +
 +
public class ModelSample extends ModelBase {
 +
    // モデルの直方体を代入する変数
 +
    ModelRenderer bottom;
 +
    ModelRenderer base;
 +
    ModelRenderer top;
 +
 +
    public ModelSample() {
 +
        super();
 +
        // テクスチャの縦と横のサイズ
 +
        textureWidth = 32;
 +
        textureHeight = 64;
 +
        // モデルの形を作る
 +
        base = new ModelRenderer(0, 14);
 +
        base.addBox(0F, 0F, 0F, 10, 8, 10);
 +
 +
        bottom = new ModelRenderer(32, 2);
 +
        bottom.addBox(1F, 8F, 1F, 8, 8, 8);
 +
 +
        top = new ModelRenderer(40, 18);
 +
        top.addBox(2F, 16F, 2F, 6, 8, 6);
 +
    }
 +
 +
    @Override
 +
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
 +
        // 描画
 +
        base.render(f5);
 +
        bottom.render(f5);
 +
        top.render(f5);
 +
    }
 +
}
 +
</source>
 +
 +
===解説===
 +
*SampleEntityCore.java
 +
このModのエントリクラス。
 +
*EntitySample.java
 +
うろついたり、見回したりする程度のAIを追加している。
 +
*RenderSample.java
 +
追加するMobの描画クラス。
 +
*ModelSample.java
 +
コンストラクタで、モデルの各直方体の大きさ、 回転軸、角度を決める。
 +
<source lang="java">
 +
ModelRenderer base;
 +
 +
public ModelSample() {
 +
    base = new ModelRenderer(0, 0); // 引数:(テクスチャ画像の始点のX座標、テクスチャ画像の始点のY座標)
 +
    base.addBox(0f, 0f, 0f, 1, 1, 1,); // 大きさの定義。引数:(始X, 始Y, 始Z, 終X, 終Y, 終Z)
 +
    base.setRotationPoint(0.5f, 0.5f, 0.5f); // 回転軸の定義。引数:(X, Y, Z)
 +
    base.rotateAngleX = 45f;
 +
    base.rotateAngleZ = 45f; // X軸とZ軸方向に45度ずつ回転
 +
}
 +
</source>

2018年1月11日 (木) 17:35時点における最新版

この記事は"Minecraft Forge Universal 9.10.0.871~"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。
C entity.png
Entityに関係のあるチュートリアルです。

このページは、編集中です。

MOBの追加[編集]

EntityLivingを継承して、MOBを追加します。 モデルやAIも実装します

ソースコード[編集]

  • SampleEntityCore.java
package mods.entity;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.world.biome.BiomeGenBase;

@Mod(modid = "SampleEntity", name = "SampleEntity", version = "1.0.0")
public class SampleEntityCore {
    @EventHandler
    public void init(FMLInitialization event) {
        EntityRegistry.registerModEntity(EntitySample.class, "SampleEntity", 0, this, 250, 1, false);
        EntityRegistry.addSpawn(EntitySample.class, 20, 1, 4, EnumCreatureType.creature, BiomeGenBase.plains);
        if(FMLCommonHandler.instance().getSide() == Side.CLIENT) {
		RenderingRegistry.registerEntityRenderingHandler(EntitySample.class, new RenderSample());
        }
}
  • EntitySample.java
package mods.entity;

import net.minecraft.block.Block;
import net.minecraft.entity.EnumCreatureAttribute;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.world.World;


public class EntitySample extends EntityCreature {
    public EntitySample(World world) {
        super(world);
        	// うろうろ移動するAIの追加
		this.tasks.addTask(1, new EntityAIWander(this, 1.0D));
		// 見回すAIの追加
		this.tasks.addTask(2, new EntityAILookIdle(this));
    }

    @Override
    public boolean isAIEnabled() { return true; }

    @Override
    public String getLivingSound() { return /* MOBが生きている時の音のファイルパスを返す。 */ ; }

    @Override
    public String getHurtSound() { return /* MOBがダメージを受けた時の音のファイルパスを返す。 */ ; }

    @Override
    public String getDeathSound() { return /* MOBが死亡した時の音のファイルパスを返す。*/ ; }

    /*
    * このMobが動いているときの音のファイルパスを返す.
    * 引数のblockはMobの下にあるBlock.
    */
    @Override
    protected void func_145780_a(int x, int y, int z, Block block)
    {
	this.playSound("mob.skeleton.step", 0.15F, 1.0F);
    }

   @Override
    public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEFINED; }

    @Override
    public Item getDropItem() { return /* ドロップするアイテム */ ; }
}
  • RenderSample.java
package mods.entity;

import net.minecraft.client.renderer.entity.RenderBiped;
import net.minecraft.entity.EntityLiving;
import net.minecraft.util.ResourceLocation;

public class RenderSample extends Render {
    public static final ResourceLocation texture = new ResourceLocation("entity:textures/entity/sample.png");
    public RenderSample() {
        // 引数:(ModelBase以降を継承したクラスのインスタンス、影の大きさ)
        super(new ModelSample(), 0.6f);
    }

    public ResourceLocation getEntityTexture(EntityLiving entity) { return texture; }
}
  • ModelSample.java
package mods.entity;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;

public class ModelSample extends ModelBase {
    // モデルの直方体を代入する変数
    ModelRenderer bottom;
    ModelRenderer base;
    ModelRenderer top;

    public ModelSample() {
        super();
        // テクスチャの縦と横のサイズ
        textureWidth = 32;
        textureHeight = 64;
        // モデルの形を作る
        base = new ModelRenderer(0, 14);
        base.addBox(0F, 0F, 0F, 10, 8, 10);

        bottom = new ModelRenderer(32, 2);
        bottom.addBox(1F, 8F, 1F, 8, 8, 8);

        top = new ModelRenderer(40, 18);
        top.addBox(2F, 16F, 2F, 6, 8, 6);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
        // 描画
        base.render(f5);
        bottom.render(f5);
        top.render(f5);
    }
}

解説[編集]

  • SampleEntityCore.java

このModのエントリクラス。

  • EntitySample.java

うろついたり、見回したりする程度のAIを追加している。

  • RenderSample.java

追加するMobの描画クラス。

  • ModelSample.java

コンストラクタで、モデルの各直方体の大きさ、 回転軸、角度を決める。

ModelRenderer base;

public ModelSample() {
    base = new ModelRenderer(0, 0); // 引数:(テクスチャ画像の始点のX座標、テクスチャ画像の始点のY座標)
    base.addBox(0f, 0f, 0f, 1, 1, 1,); // 大きさの定義。引数:(始X, 始Y, 始Z, 終X, 終Y, 終Z)
    base.setRotationPoint(0.5f, 0.5f, 0.5f); // 回転軸の定義。引数:(X, Y, Z)
    base.rotateAngleX = 45f;
    base.rotateAngleZ = 45f; // X軸とZ軸方向に45度ずつ回転
}