ドア追加について

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

ドア追加について

投稿記事by ShuperDark » 2017年4月18日(火) 21:03

ドアを追加するにあたって、Blockクラスを継承してならできたんですけど、BlockDoorを継承した場合のやり方がわかりません。
メインのクラスに、
コード: 全て選択
//略

public class MainCore {
public static Block door;

@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
door = new Door(Material.wood);
GameRegistry.registerItem(door, "Door");

//以下略


みたいな感じに書いていくと思うんですけど、
ドアを置くためのアイテムでそのドアを呼び出す際に、

コード: 全て選択
//略

@Override
public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
if(p_77648_7_ != 1) {
return false;
}
else
{
++p_77648_5_;
Block block;

if(this.doorMaterial == Material.wood) {
block = MainCore.door;

//以下略


とまあ、こんな感じに、「block = MainCore.door;」ってやると、Blockを継承してる場合なら普通に動作するんですが、BlockDoorを継承してる場合だと、アイテムで地面をタップしても何も起こりません・・・

かなり大雑把になってしまいましたが、どうかBlockDoorを継承した場合どう呼び出せばいいのか教えていただけると幸いです!

ちなみに開発環境のマイクラのバージョンは1.7.10です。
アバター
ShuperDark
ID:85d166a0
水から上がったとこ
 
記事: 10
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.303657)

Re: ドア追加について

投稿記事by 新人もっだー » 2017年6月17日(土) 22:37

ShuperDark さんが書きました:ドアを追加するにあたって、Blockクラスを継承してならできたんですけど、BlockDoorを継承した場合のやり方がわかりません。
メインのクラスに、
コード: 全て選択
//略

public class MainCore {
public static Block door;

@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
door = new Door(Material.wood);
GameRegistry.registerItem(door, "Door");

//以下略


みたいな感じに書いていくと思うんですけど、
ドアを置くためのアイテムでそのドアを呼び出す際に、

コード: 全て選択
//略

@Override
public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
if(p_77648_7_ != 1) {
return false;
}
else
{
++p_77648_5_;
Block block;

if(this.doorMaterial == Material.wood) {
block = MainCore.door;

//以下略


とまあ、こんな感じに、「block = MainCore.door;」ってやると、Blockを継承してる場合なら普通に動作するんですが、BlockDoorを継承してる場合だと、アイテムで地面をタップしても何も起こりません・・・

かなり大雑把になってしまいましたが、どうかBlockDoorを継承した場合どう呼び出せばいいのか教えていただけると幸いです!

ちなみに開発環境のマイクラのバージョンは1.7.10です。


block変数は何を参照して何に利用していますか。
大雑把すぎです。出来る限り省略はせずにお願いします。

--もしかして

メソッドの引数にはblockはありませんよ。
world.getBlock(x, y, z);
を代入して下さい。(引数名は察して下さい)

そして, それに
block = MainCore.door;
をしても, 参照先が変わるだけでは...

Javaの勉強をしろと強制はしませんが...

onItemUse(ItemStack iemstack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
というように、引数名はわかりやすいものが良いかと。


裏技。
net.minecraft.item.ItemDoorの静的関数, placeDoorBlockを使うと楽かも
instance().instance().instance() = null;
アバター
新人もっだー
ID:f4092567
石掘り
 
記事: 131
登録日時: 2015年6月22日(月) 17:58

  • (PostNo.303674)

Re: ドア追加について

投稿記事by defeatedcrow » 2017年6月18日(日) 15:11

なんていうかやばそうな回答が付いていたので横槍

初心者に上から目線で注意する前に回答解説できる技量があるのか自覚してるんでしょうか
この内容で何を伝えるつもりなんでしょう
まぁそれはいいとして…


Doorは設置時に「上半分」と「下半分」を同時に展開する特殊な挙動をするBlockで、
設置可能判定や、クリック時の挙動も複雑なのでBlockクラス継承だけでは設置ができません
ItemDoorを継承したアイテムクラスも用意して、これを設置に使います

設置後の開閉操作やテクスチャ指定、設置可能判定(下のブロックの上面が硬い平面かどうかですね)はBlockクラス、
設置の瞬間の上下ブロックの展開操作はIem側が受け持っています
ですので、ItemDoor継承のアイテムも作って、onItemUseおよびplaceDoorBlockのオーバーライドが必要になってきます
(上の方が裏技とかよくわからないことを書いていますがplaceDoorBlock利用は裏技ではなく正攻法です)

バニラドアと同仕様で良いならonItemUseのみで良いと思いますが、
バニラとメタデータ構成が異なる場合はplaceDoorBlockの設置メタも変える必要があります
(バニラは両開きドア化の判定などを持っています)

onItemUseのオーバーライド内容ですが
コード: 全て選択
//略

@Override
public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) {
if(p_77648_7_ != 1) {
return false;
}
else
{
++p_77648_5_;
Block block;

if(this.doorMaterial == Material.wood) {
block = MainCore.door;

//以下略


とまあ、こんな感じに、「block = MainCore.door;」ってやると、Blockを継承してる場合なら普通に動作するんですが、BlockDoorを継承してる場合だと、アイテムで地面をタップしても何も起こりません・・・


「何も起こらない」ならonItemUseでfalseが返っています
要するに、設置処理に至る前に、どこかの分岐処理でfalseに飛んでいると言うだけの話なので、順に確認してみて下さい

コード: 全て選択
public boolean onItemUse(/* 略 */)
    {
        if (p_77648_7_ != 1) // <- これはブロックの上面をクリックしたかどうか
        {
            return false;
        }
        else
        {
            ++p_77648_5_;
            Block block;

            if (this.doorMaterial == Material.wood) // <-ここであなたが作ったドアのブロックマテリアルが木か問われてますけど一致してますか?そもそも、ここ分岐処理を残す必要ありますか?
            {
                block = MainCore.door;
            }
            else
            {
                // 書いてないのでわからん、略
            }

            if (p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_, p_77648_6_, p_77648_7_, p_77648_1_) && p_77648_2_.canPlayerEdit(p_77648_4_, p_77648_5_ + 1, p_77648_6_, p_77648_7_, p_77648_1_))// <- 通常プレイではtrueの筈
            {
                if (!block.canPlaceBlockAt(p_77648_3_, p_77648_4_, p_77648_5_, p_77648_6_))// <- 自作BlockDoorの設置可能判定でミスがないか要確認
                {
                    return false;
                }
                else
                {
                    int i1 = MathHelper.floor_double((double)((p_77648_2_.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
                    placeDoorBlock(p_77648_3_, p_77648_4_, p_77648_5_, p_77648_6_, i1, block);
                    --p_77648_1_.stackSize;
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
    }


ちなみに、Itemを使って「何も起こらない」ってのは、プレイヤーは腕を振ってますか?
空振り挙動ならplaceDoorBlockメソッドまでは至ってます、trueが返っているので
腕も振らないならその前段階にミスがあります
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ダイヤモンド掘り
 
記事: 866
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東


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

x