【解決済み】触れたら即死するブロックの作り方について。

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

【解決済み】触れたら即死するブロックの作り方について。

投稿記事by チカック » 2012年6月16日(土) 14:11

トピック名どおりです。
・触れたら即死
・ツルハシのみで破壊可能
・破壊時にリンゴを9個ドロップ
と、上の3つができるブロックを作りたいのですが、なかなかうまくいきません。

エラーは起きないのですが、上に乗ってもダメージを食らわず、ツルハシで壊しても、リンゴでは無く、このブロック自体が9個ドロップしてしまうという状況です。

今回は、自分で作ってみたので、ソースを同梱します。どうか、アドバイスをお願いします。
mod_GvRingo.java
コード: 全て選択
package net.minecraft.src;


public class mod_GvRingo extends BaseMod
{

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

     public static Block GvRingo;


     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");


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


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

import java.util.Random;

public class BlockGvRingo extends Block
{
    protected BlockGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.rock);
    }
    public int idDropped(int i, int j,Random random)
    {
        return Item.appleRed.shiftedIndex;
    }
    public int quantityDropped(Random random)
    {
        return 9;
    }
    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
        par5Entity.attackEntityFrom(DamageSource.cactus, 1);
    }
}


以下、自分のミスの想像。
BlockGvRingo.java
コード: 全て選択
public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
        par5Entity.attackEntityFrom(DamageSource.cactus, 1);
    }
}
の、(DamageSource.cactus, 1)の部分。
ここを"cactus"ではなく、"このブロック"みたいな記述をすればいいと思ったのですが、その記述の方法がわからないのです。。。
最後に編集したユーザー チカック [ 2012年6月24日(日) 20:31 ], 累計 1 回
1.6.2のmodding難しスギィ!!!
アバター
チカック
ID:5c062486
木を殴ってる
 
記事: 27
登録日時: 2012年1月27日(金) 21:26
お住まい: 北の国から

  • (PostNo.43514)

Re: 【質問】触れたら即死するブロックの作り方について。

投稿記事by ayashige » 2012年6月16日(土) 14:58

ブロックの当たり判定がBlockクラスのままだとonEntityCollidedWithBlockイベントが発生しなかった覚えがあります。

これはサボテンのソースからの抜粋ですが
コード: 全て選択
    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);
    }

のように当たり判定をブロックいっぱいから小さくしないといけません。
ドロップアイテムは、Blockクラスのメソッドが
コード: 全て選択
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return blockID;
    }

なので、引数違いにより呼ばれていないのではないかと。
綾繁那人です、ねこによろしく。
ayashige
ID:35312126
大工さん
 
記事: 47
登録日時: 2012年5月03日(木) 12:52

  • (PostNo.43520)

Re: 【質問】触れたら即死するブロックの作り方について。

投稿記事by チカック » 2012年6月16日(土) 16:00

ayashigeさん、返信ありがとうございます!

教えていただいたとおりに試してみたところ、触れたら即死するブロックができました!

ですが、ドロップの事が未だによく分からず、グロウストーンのソースを見てドロップの部分を変更してみたのですが、3~4個ずつしかドロップしてくれません。

改変したソースを置きますので、分かる方がいらっしゃれば、ドロップについて教えていただけるとありがたいです。どうか、アドバイスをお願いします。

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


public class mod_GvRingo extends BaseMod
{

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

     public static Block GvRingo;


     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");


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


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

import java.util.Random;

public class BlockGvRingo extends Block
{
    protected BlockGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.cactus);
    }
    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 quantityDroppedWithBonus(int par1, Random par2Random)
    {
        return MathHelper.clamp_int(quantityDropped(par2Random) + par2Random.nextInt(par1 + 1), 1, 4);
    }


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


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

  • (PostNo.43522)

Re: 【質問】触れたら即死するブロックの作り方について。

投稿記事by ayashige » 2012年6月16日(土) 16:18

ソースを見る限り、MathHelper.clamp_intメソッドは、
 第1引数の値が第2引数より小さければ第2引数の値を、
 第3引数より大きければ第3引数の値を、
 それ以外ならば第1引数の値を返す。
メソッドです。

添付のソースだと第2引数が1、第3引数が4のため1~4の値しか返さないようです。
綾繁那人です、ねこによろしく。
ayashige
ID:35312126
大工さん
 
記事: 47
登録日時: 2012年5月03日(木) 12:52

  • (PostNo.43656)

Re: 【質問】触れたら即死するブロックの作り方について。

投稿記事by チカック » 2012年6月17日(日) 10:01

ayashige さんが書きました:ソースを見る限り、MathHelper.clamp_intメソッドは、
 第1引数の値が第2引数より小さければ第2引数の値を、
 第3引数より大きければ第3引数の値を、
 それ以外ならば第1引数の値を返す。
メソッドです。

添付のソースだと第2引数が1、第3引数が4のため1~4の値しか返さないようです。

ayashigeさん、返信ありがとうございます!

MathHelper.clamp_intメソッドの部分はまだ僕には難しいので、いつかチャレンジしてみようと思います。わざわざ教えていただいたのに申し訳ないです...。

グロウストーンより簡単な記述はないかと調べたところ、BlockRedstoneOre.javaにそれらしきものが書いていました。

BlockRedstoneOre.javaからドロップ部分を抜粋
コード: 全て選択
public int idDropped(int par1, Random par2Random, int par3)
    {
        return Item.redstone.shiftedIndex;
    }

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

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


こちらを見て、自分なりに改変した結果、理想のものができました!

色々と教えていただいて、本当にありがとうございました!

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


public class mod_GvRingo extends BaseMod
{

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

     public static Block GvRingo;


     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");


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


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

import java.util.Random;

public class BlockGvRingo extends Block
{
    protected BlockGvRingo(int par1, int par2)
    {
        super(par1, par2, Material.cactus);
    }
    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 Item.appleRed.shiftedIndex;
    }

    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)
    {
        par5Entity.attackEntityFrom(DamageSource.cactus, 200);
    }
}
1.6.2のmodding難しスギィ!!!
アバター
チカック
ID:5c062486
木を殴ってる
 
記事: 27
登録日時: 2012年1月27日(金) 21:26
お住まい: 北の国から


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

x