MobのEntityについて

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.23134)

MobのEntityについて

投稿記事by ゲスト » 2012年2月05日(日) 12:36

現在mobを追加するmodを作成しています

そのmobに "mobを殺害した場合にアクションを起こす" という機能を追加したいのですが、
"DamageSource" や "EntityLiving" といったものを参照しても、そういった記述がみられません。

既存のクラスを書き換えずにこういった処理をするにはどうすればいいでしょうか?
ゲスト
ID:bd365d33
 

  • (PostNo.23186)

Re: MobのEntityについて

投稿記事by SpringMine » 2012年2月05日(日) 19:33

EntityLivingのonDeathかなぁ?
基本モブの死亡処理するメソッドかと思うけど、その前に入れたい処理を挟むとかすれば良いんじゃないかな。
SpringMine
ID:7bacda2c
石炭掘り
 
記事: 177
登録日時: 2011年12月07日(水) 22:14

  • (PostNo.23816)

Re: MobのEntityについて

投稿記事by ゲスト » 2012年2月10日(金) 20:53

回答ありがとうございます
onDeathは自分も試してみたんですが、そのmobに関してしか定義できませんでした。
javaを正式に学んだわけではないのでうまい記述ができないというのもあるのですが...

代案としては、wolfのようにListを利用してmobの種類とその有無によって処理を行おうと思っています。
基本の行動処理についてはupdateEntityActionStateでよいのでしょうか
ゲスト
ID:bd365d33
 

  • (PostNo.23847)

Re: MobのEntityについて

投稿記事by denpa » 2012年2月10日(金) 23:53

Mobが攻撃した際に、相手がhealth<0になったらフラグを立てるという処理なら実装できました。
手前味噌ですが、私のMODはsrc公開しているのでよろしければ参考にしてください。EntityDarkWraith.javaというファイルです。
自作MODトピック:http://forum.minecraftuser.jp/viewtopic.php?f=13&t=2686
久しぶりにマイクラ再開したら、見事に砂漠寺院で吹っ飛びました。
アバター
denpa
ID:7e0aa23a
石掘り
 
記事: 92
登録日時: 2012年1月07日(土) 03:35
お住まい: 火継ぎの祭祀場

  • (PostNo.23951)

Re: MobのEntityについて

投稿記事by _jx » 2012年2月11日(土) 21:27

ありがとうございます、人間性modはてっきりソース公開されてないものかとおもっていました。たいへんありがたいです。
早速参考にさせていただいて、以下のような記述をしました。

protected void updateEntityActionState()
{
super.updateEntityActionState();
if (entityToAttack == null && worldObj.rand.nextInt(100) == 0)
{
List list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityZombie.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(16D, 4D, 16D));
if (!list.isEmpty())
{
setEntityToAttack((Entity)list.get(worldObj.rand.nextInt(list.size())));
type = 3;
}
}else
if (entityToAttack == null && worldObj.rand.nextInt(100) == 0)
{
List list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntitySkeleton.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(16D, 4D, 16D));
if (!list.isEmpty())
{
setEntityToAttack((Entity)list.get(worldObj.rand.nextInt(list.size())));
type = 1;
}
}
}


public String getEntityTexture()
{
if (type == 3)
{
return "/MMD/HHz.png";

}else if (type == 1)
{
return "/MMD/HHs.png";
}

return super.getEntityTexture();
}


healthの管理を参考に組み立てようと思ったのですが、mob個別に分ける方法がさっぱりだったのでListを利用しています。
この状態では目標mobを発見した時点でテクスチャが切りかわる仕様になっていますが、ある程度は妥協することにしました。
ここにフラグ管理を追加することで完成となる予定です。


また度重なる質問で申し訳ないのですが、GiantZombieのようにテクスチャの配置を変えることなくモデルのサイズを変更するにはどこをいじればよいのでしょうか?
Render Entity Model と参考にしたのですが、影の大きさと当たり判定にのみ変更が加わりました。
アバター
_jx
ID:bd365d33
鉄鉱掘り
 
記事: 297
登録日時: 2011年9月03日(土) 10:01

  • (PostNo.23959)

Re: MobのEntityについて

投稿記事by MMM » 2012年2月11日(土) 22:13

onKillEntityでは駄目なんですの?
画像
    独立支援型お役立ちユニット「littleMaid」です。           (画像提供 moyu氏)
MMM
ID:c1570943
レッドストーン掘り
 
記事: 511
登録日時: 2011年7月20日(水) 22:56

  • (PostNo.24001)

Re: MobのEntityについて

投稿記事by denpa » 2012年2月12日(日) 03:39

そんなメソッドあったんですね。無駄なことしてたなぁ。
GL11.glScalefで拡大縮小はできる。
自作MODトピック:http://forum.minecraftuser.jp/viewtopic.php?f=13&t=2686
久しぶりにマイクラ再開したら、見事に砂漠寺院で吹っ飛びました。
アバター
denpa
ID:7e0aa23a
石掘り
 
記事: 92
登録日時: 2012年1月07日(土) 03:35
お住まい: 火継ぎの祭祀場

  • (PostNo.24016)

Re: MobのEntityについて

投稿記事by _jx » 2012年2月12日(日) 09:54

onKillEntityを使うとすっきりまとめられました、ありがとうございます。
コード: 全て選択
protected void updateEntityActionState()
   {
        super.updateEntityActionState();
            if (head == 0 && entityToAttack == null && worldObj.rand.nextInt(100) == 0)
        {
            List list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityZombie.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(16D, 4D, 16D));
           
            if (!list.isEmpty())
            {
                setEntityToAttack((Entity)list.get(worldObj.rand.nextInt(list.size())));
            }
        }
            if (head == 0 && entityToAttack == null && worldObj.rand.nextInt(100) == 0)
        {
            List list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntitySkeleton.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(16D, 4D, 16D));
           
            if (!list.isEmpty())
            {
                setEntityToAttack((Entity)list.get(worldObj.rand.nextInt(list.size())));
            }
        }
            if (head == 0 && entityToAttack == null && worldObj.rand.nextInt(100) == 0)
        {
            List list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityCreeper.class, AxisAlignedBB.getBoundingBoxFromPool(posX, posY, posZ, posX + 1.0D, posY + 1.0D, posZ + 1.0D).expand(16D, 4D, 16D));
           
            if (!list.isEmpty())
            {
                setEntityToAttack((Entity)list.get(worldObj.rand.nextInt(list.size())));
            }
        }   
           
        }
       
    public void onKillEntity(EntityLiving entityliving)
    {
        if ( entityliving instanceof EntityZombie)
        {
            type = 1;
           
        }
        if (head == 0 && entityliving instanceof EntitySkeleton)
        {
            type = 2;
           
        }
        if (head == 0 && entityliving instanceof EntityCreeper)
        {
            type = 3;
           
        }
        if (head == 0 && entityliving instanceof EntitySpider)
        {
            type = 4;
           
        }
        if (head == 0 && entityliving instanceof EntityEnderman)
        {
            type = 5;
           
        }
    }

     public String getEntityTexture()
     {

            if (type == 1)
        {
            head = 1;
            return "/MMD/HHz.png";
           
            }else if (type == 2)
        {
            head = 2;
                return "/MMD/HHs.png";
           
            }else if (type == 3)
        {
            head = 3;
                return "/MMD/HHc.png";
               
            }else if (type == 4)
        {
            head = 4;
                return "/MMD/HHsp.png";
               
            }else if (type == 5)
        {
            head = 5;
                return "/MMD/HHe.png";
               
            }
       

            return super.getEntityTexture();
        }

例によってmobに対する敵対の記述は汚いままですが...

この段階で ”指定されたmobを攻撃” ”倒すとテクスチャと性能が変化” ”性能が変化している状態ではmobと敵対しない" "性能の上書きがされない"
といった機能を実装することができました。ひとまず完成といったところです。

回答者の皆様ありがとうございました。
アバター
_jx
ID:bd365d33
鉄鉱掘り
 
記事: 297
登録日時: 2011年9月03日(土) 10:01


Return to 質問:開発・制作関連

x