石橋を叩いて壊すページ

絵画や額縁のスポーンと向きの変更について調べてみた

絵画(Painting)や額縁(ItemFrame)といった壁掛けアイテムは、Hanging(=吊るす・壁掛け等の意味)インターフェースを実装している。
モンスターや動物などと異なり、壁掛けアイテムは壁が無いところにはスポーンできない。
また、向きなどに制約がある。その辺を調べてみた。

この記事では絵画を中心に記載するが、額縁も同様である。

まず、絵画をスポーンさせるには以下のようにする。
今回は、手に骨を持ってブロックを右クリックすると、そこに絵画がスポーンするようにした。

/**
 * プレイヤーがクリックしたときに呼ばれる
 */
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){

	//ブロックを右クリックしたのか
	if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)){

		//手に持っているのは骨か
		if(e.getPlayer().getItemInHand().getType() == Material.BONE){

			//クリックされたブロックの座標を取得
			Location loc=e.getClickedBlock().getLocation();

			//クリックされたブロックに絵画を貼り付ける
			loc.getWorld().spawnEntity(loc,EntityType.PAINTING);
		}
	}
}


ゲームを起動して木のブロックを骨で右クリックしたところ。ブロックの左側面に絵画が貼り付けられた。

ここで重要なのは、絵画をスポーンするには、spawnEntityメソッドの第1引数には絵画をかける固体ブロックの座標を与えなければならないことである。
もし動物を固体ブロックと同一座標にスポーンさせたら、(大きさにもよるが)動物はきっとブロックに埋まって窒息してしまうだろう。
このため、動物をスポーンさせるなら通常は空気ブロックの座標を指定する。
しかし壁掛けアイテムだけは例外で、空気ブロックの座標を指定するとスポーンしない。Exceptionも起こらないので問題が発覚しづらい。
固体ブロックの座標を指定するとスポーンする。このことを忘れないようにしよう。

絵画は、向きを指定してスポーンさせることができない。
絵画は指定したブロックの側面にスポーンするが、その向きは東→北→西→南の順に優先順位が決まっている。

このため、ブロックの東側面が空いていれば、絵画は常に東向きにスポーンする。
東側面が空いていない場合は、2番目の優先順位である北側面を確認し、空いていれば北向きにスポーンする。
以後同様に西向きと南向きがチェックされ、どの向きも空いていない場合は、絵画はスポーンしない。Exceptionも発生しない。



中央の木ブロックに絵画をスポーンさせる例。
1枚目の画像では、4方向すべてが空いているので、最も優先順位が高い東の向きに絵画がスポーンする。
東側面が埋まっている場合は、北向きの絵画がスポーンする。
以後同様に、西向き、南向きとなり、どのスペースも埋まっていると絵画はスポーンしない。

絵画の向きを変えたい場合は、以下のようにすればよい。
ここでは、リンゴを手に持って絵画を右クリックすると、絵画が回転するようにした。

/**
 * プレイヤーがエンティティを右クリックしたときに呼ばれる
 */
@EventHandler
public void onEvent(PlayerInteractEntityEvent e){

	//手に持っているのはリンゴか
	if(e.getPlayer().getItemInHand().getType() == Material.APPLE){

		//絵画を右クリックしたのか
		if(e.getRightClicked().getType() == EntityType.PAINTING){

			//絵画を南向きにする
			((Hanging) e.getRightClicked()).setFacingDirection(BlockFace.SOUTH);
		}
	}
}


絵画を右クリックしたところ。 北向きの絵画が、南向きに変化している。
絵画の設置時と異なり、今回は壁を中心とした回転ではなく、絵画自体が回転しているのが分かる。

絵画の設置時は、絵画は掛けられた固体ブロックを中心として向きを変えていた。
しかし絵画の向きの変更時は、絵画自体があるブロックを中心として向きが変わる。
うーん、ややこしいことこの上ない話である。

なお、絵画は東西南北の4方向しか向かないので、斜めや上下などを向かせることはできない。
また、絵画を回転させたとき、その向きに絵画を掛けられるブロックがない場合、回転は失敗し何も起こらない。やっぱりExceptionも起こらない。
(例えば上記画像で、ピンク色の羊毛ブロックが無かったら、回転させても絵画を掛ける壁がないので回転が失敗する。)


回転できないはずなのに、どういうわけか無理やり回転してしまう場合もある。
絵画を繰り返し回転させるようなコードを書く場合は、十分に注意しないと絵画がどっか他所へ行ってしまう可能性もある。

絵画を別の場所に移動する方法は分からなかった。移動させようとするとアイテム化してしまう。
移動は既存絵画の撤去と新規絵画の設置で対応するしかなさそうだ。

絵画の差し替えについては後日書く。

この記事を評価

この記事にコメント

  1. ...

【この記事にコメント】
お名前:
コメント:

Menu