【解決済み】自分以外のモブにのみダメージを与えるブロックについて

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

【解決済み】自分以外のモブにのみダメージを与えるブロックについて

投稿記事by チカック » 2012年6月24日(日) 12:03

先日、触れたら即死するブロックについて質問したものです。
http://forum.minecraftuser.jp/viewtopic.php?f=21&t=5608
今回もトピック名通りです。

先日の質問後に製作したブロックの強化版として、以下のことをしてみようと思いました。
 ・自分以外のモブがふれた時にのみ、そのモブにダメージを与える。(自分が触れてもダメージは全くない。)
 ・ブロックの上にアイテムが落ちても消失しない。

以上の目標を持ち、ソースを記述したのですが、全く上の状態に近づきません。

最低限、「自分以外のモブがふれた時にのみ、そのモブにダメージを与える。」が出来れば十分です。

どなたか知っている方は、教えていただけると幸いです。

どうかよろしくお願いします!

一応ソースです。
mod_GvRigo.java
コード: 全て選択
package net.minecraft.src;


public class mod_GvRingo extends BaseMod
{

     public String getVersion() {
         return "1.2.5";
}

     public static Block GvRingo;
     public static Block GoldGvRingo;
     public static Block DeathGvRingo;
     public static Block DeathGoldGvRingo;
     public static Item DeliAppleRed;
     public static Item DeliAppleGold;


     public void load() {


        GvRingo = new BlockGvRingo(220,0).setHardness(1.5F).setBlockName("GvRingo");
        ModLoader.registerBlock(GvRingo);
        GvRingo.blockIndexInTexture = ModLoader.addOverride("/terrain.png","/GvRingo/GvRingo.png");
        ModLoader.addName(GvRingo, "GravityApple");

        GoldGvRingo = new BlockGoldGvRingo(221,0).setHardness(50F).setResistance(2000F).setBlockName("GoldGvRingo");
        ModLoader.registerBlock(GoldGvRingo);
        GoldGvRingo.blockIndexInTexture = ModLoader.addOverride("/terrain.png","/GvRingo/GvGoldRingo.png");
        ModLoader.addName(GoldGvRingo, "GoldGravityApple");

        DeathGvRingo = new BlockDeathGvRingo(222,0).setHardness(1.5F).setBlockName("DeathGvRingo");
        ModLoader.registerBlock(DeathGvRingo);
        DeathGvRingo.blockIndexInTexture = ModLoader.addOverride("/terrain.png","/GvRingo/DthGvRingo.png");
        ModLoader.addName(DeathGvRingo, "MOBDestroyer");

        DeathGoldGvRingo = new BlockDeathGoldGvRingo(223,0).setHardness(50F).setResistance(2000F).setBlockName("DeathGoldGvRingo");
        ModLoader.registerBlock(DeathGoldGvRingo);
        DeathGoldGvRingo.blockIndexInTexture = ModLoader.addOverride("/terrain.png","/GvRingo/DthGvGoldRingo.png");
        ModLoader.addName(DeathGoldGvRingo, "GoldMOBDestroyer");

        DeliAppleRed = new ItemDeliAppleRed(3000, 20, true).setItemName("DeliApple");
        DeliAppleRed.iconIndex = ModLoader.addOverride("/gui/items.png", "/GvRingo/DeliAppleRed.png");
        ModLoader.addName(DeliAppleRed, "DeliciousAppleRed");

        DeliAppleGold = new ItemDeliAppleGold(3001, 20, true).setPotionEffect(Potion.regeneration.id, 60, 5, 1.0F).setItemName("DeliGoldApple");
        DeliAppleGold.iconIndex = ModLoader.addOverride("/gui/items.png", "/GvRingo/DeliAppleGold.png");
        ModLoader.addName(DeliAppleGold, "DeliciousAppleGold");


        ModLoader.addRecipe(new ItemStack(GvRingo, 1),
        new Object[]{ "AAA","AAA","AAA",
        Character.valueOf('A'),Item.appleRed});

        ModLoader.addRecipe(new ItemStack(GoldGvRingo, 1),
        new Object[]{ "AAA","AAA","AAA",
        Character.valueOf('A'),Item.appleGold});

        ModLoader.addRecipe(new ItemStack(DeathGvRingo, 1),
        new Object[]{ "AAA","AAA","AAA",
        Character.valueOf('A'),GvRingo});

        ModLoader.addRecipe(new ItemStack(DeathGoldGvRingo, 1),
        new Object[]{ "AAA","AAA","AAA",
        Character.valueOf('A'),GoldGvRingo
        });


        ModLoader.addSmelting(GvRingo.blockID, new ItemStack(DeliAppleRed, 1));
        ModLoader.addSmelting(GoldGvRingo.blockID, new ItemStack(DeliAppleGold, 1));
     }
}


BlockDeathGvRingo.java
コード: 全て選択

package net.minecraft.src;

import java.util.Random;

public class BlockDeathGvRingo extends Block
{
    protected BlockDeathGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.rock);
    }
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, (float)(par3 + 1) - f, (float)(par4 + 1) - f);
    }

    public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, par3 + 1, (float)(par4 + 1) - f);
    }
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return mod_GvRingo.GvRingo.blockID;
    }

    public int quantityDroppedWithBonus(int par1, Random par2Random)
    {
        return quantityDropped(par2Random) + par2Random.nextInt(par1 + 1);
    }

    public int quantityDropped(Random par1Random)
    {
        return 9 + par1Random.nextInt(2);
    }

    public void onKillEntity(EntityLiving entityliving)
    {
        if ( entityliving instanceof EntityMob);
    }

    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
        par5Entity.attackEntityFrom(DamageSource.cactus, 200);
    }
}



以下自分の想像
BlockDeathGvRingo.java
コード: 全て選択
    public void onKillEntity(EntityLiving entityliving)
    {
        if ( entityliving instanceof EntityMob);
    }

    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
        par5Entity.attackEntityFrom(DamageSource.cactus, 200);
    }
}

この部分をどうにか変更すればいいと考えましたが、どう変えればいいのかがわからない・・・
最後に編集したユーザー チカック [ 2012年6月24日(日) 20:31 ], 累計 1 回
1.6.2のmodding難しスギィ!!!
アバター
チカック
ID:5c062486
木を殴ってる
 
記事: 27
登録日時: 2012年1月27日(金) 21:26
お住まい: 北の国から

  • (PostNo.44673)

Re: 【質問】自分以外のモブにのみダメージを与えるブロックについて

投稿記事by ayamitsu » 2012年6月24日(日) 12:33

例としてあげるならば
コード: 全て選択
public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{
   if (par5Entity instanceof EntityMob)
   {
       par5Entity.attackEntityFrom(DamageSource.cactus, 200);
    }
}

これでEntityMobを継承しているmobだけにダメージを与えられるはずです。
アバター
ayamitsu
ID:b39d215b
ラピスラズリ収集家
 
記事: 1068
登録日時: 2011年8月10日(水) 19:04
お住まい: 琵琶湖の底らへん

  • (PostNo.44674)

Re: 【質問】自分以外のモブにのみダメージを与えるブロックについて

投稿記事by チカック » 2012年6月24日(日) 12:44

ayamitsuさん、返信ありがとうございます。

ayamitsu さんが書きました:例としてあげるならば
コード: 全て選択
public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{
   if (par5Entity instanceof EntityMob)
   {
       par5Entity.attackEntityFrom(DamageSource.cactus, 200);
    }
}

これでEntityMobを継承しているmobだけにダメージを与えられるはずです。


ということで、記述を変更して試したところ、やはりプレイヤー自身も死んでしまいます。

一体どこがいけないのでしょうか・・・

自分でもいろんな記述を試してみますので、別の方法や、何が間違ってるのかなど、引き続き教えていただければ幸いです。

BlockDeathGvRingo.java
コード: 全て選択
package net.minecraft.src;

import java.util.Random;

public class BlockDeathGvRingo extends Block
{
    protected BlockDeathGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.rock);
    }
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, (float)(par3 + 1) - f, (float)(par4 + 1) - f);
    }

    public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, par3 + 1, (float)(par4 + 1) - f);
    }
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return mod_GvRingo.GvRingo.blockID;
    }

    public int quantityDroppedWithBonus(int par1, Random par2Random)
    {
        return quantityDropped(par2Random) + par2Random.nextInt(par1 + 1);
    }

    public int quantityDropped(Random par1Random)
    {
        return 9 + par1Random.nextInt(2);
    }

    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
       if (par5Entity instanceof EntityMob)
       {
           par5Entity.attackEntityFrom(DamageSource.cactus, 200);
        }
    }
}
1.6.2のmodding難しスギィ!!!
アバター
チカック
ID:5c062486
木を殴ってる
 
記事: 27
登録日時: 2012年1月27日(金) 21:26
お住まい: 北の国から

  • (PostNo.44751)

Re: 【質問】自分以外のモブにのみダメージを与えるブロックについて

投稿記事by チカック » 2012年6月24日(日) 20:30

自己解決しました。すいません。

アドバイスをくれたayamitsuさん、ありがとうございます。

ソースを載せておきます。本当にありがとうございました。

BlockDeathGvRingo.java
コード: 全て選択
package net.minecraft.src;

import java.util.Random;

public class BlockDeathGvRingo extends Block
{
    protected BlockDeathGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.rock);
    }
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, (float)(par3 + 1) - f, (float)(par4 + 1) - f);
    }

    public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBoxFromPool((float)par2 + f, par3, (float)par4 + f, (float)(par2 + 1) - f, par3 + 1, (float)(par4 + 1) - f);
    }
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return mod_GvRingo.GvRingo.blockID;
    }

    public int quantityDroppedWithBonus(int par1, Random par2Random)
    {
        return quantityDropped(par2Random) + par2Random.nextInt(par1 + 1);
    }

    public int quantityDropped(Random par1Random)
    {
        return 9 + par1Random.nextInt(2);
    }

    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
       if (par5Entity instanceof EntityMob)
       {
           par5Entity.attackEntityFrom(DamageSource.generic, 200);
        }
    }
}


これですね。
コード: 全て選択
public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
       if (par5Entity instanceof EntityMob)
       {
           par5Entity.attackEntityFrom(DamageSource.generic, 200);
        }
    }
}


par5Entity.attackEntityFrom(DamageSource.cactus, 200);

par5Entity.attackEntityFrom(DamageSource.generic, 200);
のように、cactus(サボテン)からではなくgeneric(通常ダメージ?)によってダメージを与えることが必要なんですね。
1.6.2のmodding難しスギィ!!!
アバター
チカック
ID:5c062486
木を殴ってる
 
記事: 27
登録日時: 2012年1月27日(金) 21:26
お住まい: 北の国から


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

x