石橋を叩いて壊すページ

エンティティのスポーン方法とその定数について調べてみた

エンティティとは、大雑把にいうとマインクラフトの世界で動きまわるもの。
プレイヤーや動物やモンスターはもとより、矢とか地面に落ちたアイテムとか。
TNTなどは手に持った状態ではアイテムだが、設置するとブロックになり、着火するとエンティティになるなど、慣れないとちょっと分かりづらい。

モンスターを呼び出すに当たってはひとつだけ注意。
普通に生活しているワールドにウィザーなんぞ呼び出したら危ないのは言うまでもないけれど、
ことエンダードラゴンに至っては、触れたブロックを例外除いてすべて空気に置き換えてしまうという、とんでもない能力を秘めている。
このため生活ワールドでドラゴンを呼び出したら、自宅が音も立てずに一瞬で消滅なんてことも冗談抜きでありえるので、
最初は必ずテスト用サーバで様子を見るようにしたほうがいい。


ノーマルワールドにエンダードラゴンを呼ぶと穴だらけになる。

エンティティを呼び出すには主に2パターンあり、以下のようにする。
以下のコードは、プレイヤーのいる場所にゾンビを生み出す。変数playerはプレイヤーを意味するPlayerクラスのオブジェクトである。

//パターン1:引数にClassを使う。戻り値はZombieオブジェクトになる。
Zombie zombie2=player.getWorld().spawn(player.getLocation(),Zombie.class);

//パターン2:引数に定数を使う。戻り値はEntityオブジェクトなのでZombieにキャストしている。
Zombie zombie1=(Zombie) player.getWorld().spawnEntity(player.getLocation(),EntityType.ZOMBIE);

基本的にはパターン1のほうが戻り値が直接Zombieクラスになるという点で楽だが、
パターン2の場合は定数部分をEntityType.valueOf("ZOMBIE")のように文字列にすることもできるので、
エンティティの種類をコードに埋め込まずに設定ファイルから読み込むような場合はパターン2が便利かと思われる。
要するに好みと状況の問題である。

例によってZOMBIEの部分をSKELETONに変えればスケルトンが湧くようになる。
FISHING_HOOK(釣り針)やPLAYER(プレイヤー)など一部のエンティティは呼び出すことはできず、呼び出そうとするとIllegalArgumentExceptionになる。

エンティティの詳細は以下のとおりである。
なお、対応クラスはそのエンティティタイプを指定したときにスポーンするエンティティを表すクラス(インターフェース)を記載した。
基本的には定数名と同じクラス名(COW→Cow)だが、一部異なる(MINECART_FURNACE→PoweredMinecart)ので参考まで。
現在の安定版Bukkit(V1.6.4)にないクラスは(dev)と注記のうえ開発版Bukkitへリンクしてあるので注意されたい。

モンスター系

定数名 対応クラス これ何? ポイント
BLAZE Blaze ブレイズ
CAVE_SPIDER CaveSpider 洞窟グモ
CREEPER Creeper クリーパー
ENDER_DRAGON EnderDragon エンダードラゴン
ENDERMAN Enderman エンダーマン
GHAST Ghast ガスト
GIANT Giant ジャイアント めっぽう強い巨大ゾンビ。ただし上半身に攻撃の当たり判定がない。
ジャイアントについては去年7月の記事を参照
MAGMA_CUBE MagmaCube マグマキューブ 下記参照。
PIG_ZOMBIE PigZombie ゾンビピッグマン 下記参照。
SILVERFISH Silverfish シルバーフィッシュ
SKELETON Skeleton スケルトン類 下記参照。
SLIME Slime スライム 下記参照。
SPIDER Spider クモ
WITCH Witch ウィッチ
WITHER Wither ウィザー
ZOMBIE Zombie ゾンビ類 下記参照。

ウィザースケルトンは、スケルトンの一種として同一クラス(Skeleton)で扱われている。
このため通常ワールドではSKELETONをスポーンさせると通常の(白い)スケルトンが出るが、
ネザーでは低確率でウィザースケルトンも出る
どちらかを指定してスケルトンを呼び出したいなら、スポーンさせたSkeletonのオブジェクトに
setSkeletonTypeメソッドでスケルトンの種類を設定する。

ゾンビもまた、通常ゾンビ・村人ゾンビ・子供のゾンビ・子供の村人ゾンビが同一クラス(Zombie)で扱われている。
こちらも同様に、ZombieクラスのsetVillagerメソッドで通常/村人ゾンビを、setBabyメソッドで子供/大人ゾンビを設定できる。

ゾンビピッグマンも同様である。

スライムとマグマキューブにはsetSizeというメソッドがあり、ここでスライムのサイズを変えられる。
通常存在するスライムは、小サイズが1、中サイズが2、大サイズは4である。
しかしこの引数にはもっと大きな値を指定し、巨大なスライムを作ることができる。
サイズを1増加させると、スライムの大きさは0.5~0.6ブロック程度増加する。


サイズ30のスライムとマグマキューブ。窒息はしないが、水深1mの湖からも脱出できないのは相変わらず。
下にいるのは比較用の大小(サイズ1と4)の通常スライム。

実際のところ、スライムの物理的な当たり判定は見た目どおりだが、スライムに攻撃を当てるための当たり判定はそれよりも小さい。
(ちょうど、スライムの中心にある不透明な核部分を攻撃しないとダメージが通らないと想像していただきたい。)
スライムを大きくするとこの誤差が増加していき、あまり巨大化するとスライムの体内に入らないと攻撃が通用しない。
しかし攻撃当たり判定に近づこうとすると物理的当たり判定が先に働いてスライムが押し出されるため、
永遠に攻撃当たり判定までたどり着けない状態が発生する。そんなわけで、実用的な大きさはせいぜい15~20程度までだろう。
無事倒すことができれば、現在のサイズの半分のスライムが1~4匹発生する。つまりサイズ20のスライムを倒すとサイズ10のスライムが湧く。

サイズを変更すると、最大HPがサイズの2乗に変更され、HPが最大まで回復する。
たとえばサイズ1のスライムの最大HPは1だが、サイズを20にすると最大HPは400になる。マグマキューブも全く同じである。

緑のスライムのジャンプ力はサイズによらず一定だが、マグマキューブのジャンプ力はサイズに依存して増加する。
サイズ30のマグマキューブは、1回のジャンプでおよそ50m飛び上がる。


サイズ30のマグマキューブのジャンプ。その高さは雲にも達する。
(補足だが、マグマキューブは着地ダメージを受けない。これはバニラのマインクラフトの仕様である。)

ちなみにサイズにゼロを設定することもできるが、スライムは非表示になり、また最大HPがゼロになるため直後に死亡してしまう。

温厚な生物系

定数名 対応クラス これ何? ポイント
BAT Bat コウモリ
CHICKEN Chicken ニワトリ 下記参照。
COW Cow ウシ 下記参照。
HORSE Horse ウマ 他の動物はデフォルトで成獣のみスポーンするが、ウマに限っては20%の確率で子馬が湧く。
その他、下記参照。
IRON_GOLEM IronGolem アイアンゴーレム
MUSHROOM_COW MushroomCow ムーシュルーム 下記参照。
OCELOT Ocelot ヤマネコ 基本は親猫1頭のみスポーンするが、なぜか10%の確率で子猫2頭を加えた計3頭が同時にスポーンする。
その他、下記参照。
PIG Pig ブタ 下記参照。
SHEEP Sheep ヒツジ 下記参照。
SNOWMAN Snowman スノーマン
SQUID Squid イカ
VILLAGER Villager 村人 下記参照。
WOLF Wolf オオカミ 下記参照。

動物は基本的に成獣がスポーンする(上記表のとおりウマとヤマネコを除く)。
幼獣にしたい場合は、各動物の(CowやPigなどの)クラスが実装しているAgeableインタフェースのsetBabyメソッドを実行する。

ちなみに、ZombieクラスのsetBabyメソッドはBoolean型の引数をとり、trueなら子供、falseなら大人を指定できるが、
動物のsetBabyメソッドは引数を取らず常に子供になる。大人にするにはsetAdultメソッドを叩く。うん。ややこしい。

ウマやヤマネコの体表の模様、ウマの種類(ウマ/ロバ/ラバ)やチェストの有無、村人の職業といったパラメーターは、
それぞれのクラスにある設定メソッドで設定できる。


Ageableインターフェースを実装する生物を1000頭スポーンさせ、大人と子供の比率を調べた。
さすがに負荷がひどいのでスポーンさせた動物は即消去したが、ヤマネコだけは親が消えて子猫が残った。

乗り物系

定数名 対応クラス これ何? ポイント
BOAT Boat ボート
MINECART RideableMinecart トロッコ
MINECART_CHEST StorageMinecart チェスト付きトロッコ
MINECART_COMMAND CommandMinecart(dev) コマンドブロック付きトロッコ コマンドブロック不許可サーバではただのトロッコが生成される。
許可は設定ファイルを編集して設定する。
MINECART_FURNACE PoweredMinecart かまど付きトロッコ
MINECART_HOPPER HopperMinecart ホッパー付きトロッコ
MINECART_MOB_SPAWNER SpawnerMinecart スポーンブロック付きトロッコ 下記参照。
MINECART_TNT ExplosiveMinecart TNT付きトロッコ

スポーンブロック付きトロッコには、デフォルトではブタスポーンブロックが乗っている。
ブタ以外をスポーンさせる方法を調べてみたのだが、見つからなかった。
おそらくだがバグトラックを見る限り、いまはできないのだろう。

投射物系

定数名 対応クラス これ何? ポイント
ARROW Arrow 射られた矢 Worldクラスのspawnメソッドでもスポーンできるが、それより同spawnArrowのほうが初速と誤差が設定できて便利。
詳しくは去年9月の記事を参照
EGG Egg 投げられた卵 着地すると割れてしまう。
ENDER_PEARL EnderPearl 投げられたエンダーパール エンダーアイはENDER_SIGNALを参照。
FIREBALL LargeFireball 発射されたガストの火の玉 直線状に飛んで行く。
SMALL_FIREBALL SmallFireball 発射されたブレイズの火の玉 瞬間的に火が出てすぐ消えてしまう。理由は不明。
SNOWBALL Snowball 投げられた雪玉 着地すると割れてしまう。
SPLASH_POTION ThrownPotion 投げられたスプラッシュポーション 着地すると割れてしまう。
THROWN_EXP_BOTTLE ThrownExpBottle 投げられた経験値ボトル 着地すると割れてしまう。
WITHER_SKULL WitherSkull 発射された頭蓋骨 ウィザーが発射する頭蓋骨。デフォルトで黒い(低威力)。
青く(強威力に)するにはWitherSkullオブジェクトにsetCharged(true);を実行。
ただし、これもどういうわけか青い骸骨は出現直後にすぐ消えてしまう。
黒いほうはまっすぐ飛んで行く。

ここで言う投射物とは、発射するもの、投げるものを使用した状態を指す。
例えば雪玉や卵などを右クリックで使用すると、地面に当たって割れてしまう。
しかし雪玉や卵などをQキーを押して使用せずに投げた場合は、地面に落ちても割れない。
前者が投射物、後者はただのドロップアイテムである。ドロップアイテムについてはDROPPED_ITEMを参照。

物体系

定数名 対応クラス これ何? ポイント
DROPPED_ITEM Item ドロップアイテム 地面に落ちているアイテム。
地面におかれた卵やスプラッシュポーションなどもこれ。
スポーンさせるにはWorldクラスのdropItemメソッドを使う。
ENDER_CRYSTAL EnderCrystal エンダークリスタル 下記参照。
ENDER_SIGNAL EnderSignal エンダーアイ エンダーパールはENDER_PEARLを参照。
EXPERIENCE_ORB ExperienceOrb 経験値オーブ
FALLING_BLOCK FallingSand 落下中のブロック 対応クラスはFallingSandだが、クラスの説明にはDeprecated. See FallingBlock
(非推奨。FallingBlockを見よ。)と書いてあるのでそちらを見るべき。その他、下記参照。
FIREWORK Firework 打ち上げられた花火 飛んでいくだけ。爆発はしない。
花火の打ち上げ方については去年9月の記事を参照
PRIMED_TNT TNTPrimed 着火したTNT 着火していないTNTはブロックだが、着火するとブロックは空気に置換され、同時に着火したTNTがスポーンする。

FALLING_BLOCKは、落下中のブロックを意味する。
例えば、空中に石ブロックが設置されていて、その上に砂利ブロックが載っているとする。
石ブロックが破壊されると、砂利ブロックは空中に浮かび、BlockPhysicsEvent(落下判定)イベントが発生して、落下処理が開始される。
まず、砂利ブロックが空気ブロックに置換される。直後に、同じ場所に砂利を内包するFallingBlockエンティティが生まれる。
FallingBlockはブロックと異なり重力の影響を受け、自然落下を開始する。
やがてFallingBlockが床に着地すると、FallingBlockは消滅し、同じ場所に砂利ブロックが生成される。
これがマインクラフトにおけるブロック落下のプロセスである。

FallingBlockが内包するブロックは基本的に何のブロックでもいいので、プラグインを使えばガラスや岩盤など本来落下しないブロックを内包したFallingBlockを作ることもできる。
FallingBlockをスポーンさせるには、任意のブロックの座標を指定する。すると、その場所にあるブロックが自動的にFallingBlockに内包され、その場所は空気ブロックに置換される。


FallingBlockは透過性のテクスチャに対応していないので、落下時にテクスチャがおかしくなるが、着地すると正しく復元される。
看板は落下時にテキストが失われる。

FallingBlockは通常はまっすぐ落下するが、エンティティであるからsetVelocityメソッドで上向きや横向きの速度を与えることもできる。
ただ、FallingBlockの生成と速度の設定を同時に行うとどういうわけか落下がキャンセルされたりされなかったり動作が不安定。理由は不明。

エンダークリスタルとは聞きなれない名前とは思うが、ザ・エンドに設置され、エンダードラゴンを回復する紫のオブジェのことである。
見た目が面白いのでオブジェとしては利用価値が高そうだが、破壊するとすさまじい爆発を伴うので、マルチプレイで街中に飾る場合は安全措置が必須。
火を伴うので火災にも注意。

よく、エンダークリスタルを壊すとその場に岩盤が生成されると思われているが、
実はあれはザ・エンドのマップ生成時点で元々クリスタルと岩盤が重ねて配置されていて、クリスタルを壊すと岩盤が残るという動作によるもの。
このため、エンダークリスタルを飾る際に勝手に岩盤が生成されてしまうといった心配は不要。

壁掛け系

定数名 対応クラス これ何? ポイント
ITEM_FRAME ItemFrame 額縁 スポーン座標に固体ブロックを指定する必要がある。詳しくは先日の記事を参照
LEASH_HITCH LeashHitch 柵に巻いたリード(手綱) スポーン座標に柵ブロックを指定する必要がある。下記参照。
PAINTING Painting 絵画 スポーン座標に固体ブロックを指定する必要がある。詳しくは先日の記事を参照

LEASH_HITCHは、柵に巻いたリード(手綱)のエンティティである。
リードそのものはエンティティではなく、エンティティとエンティティを結ぶ線がリードである。


柵につながれたウシ。
柵にぐるぐると巻きつけられたリードの部分がLEASH_HITCHで、そことウシを結んでいる部分がリードである。

動物にリードを掛けるには以下のようにする。
変数locは、柵ブロックからgetLocation()で取り出したLocationオブジェクトである。

LivingEntity entity=(LivingEntity) loc.getWorld().spawnEntity(loc,EntityType.COW);
Entity holder=loc.getWorld().spawnEntity(loc,EntityType.LEASH_HITCH);
entity.setLeashHolder(holder);

setLeashHolderメソッドは、読んで名の如くリード(Leash)を握る者(Holder)を決める(set)メソッドである。
このため上記のコードを実行すると、ウシ(COW)と柵に巻いたリード(LEASH_HITCH)がスポーンし、
両者の間にリードが張られ、柵に巻いたリードがウシを曳く状況になる。

setLeashHolderメソッドの引数は、Entityオブジェクトであれば大抵受け付ける。
例えば、引数にVillagerオブジェクトを指定すれば、村人に曳かれるウシが実現できる。
クモやクリーパーに曳かれるウシに留まらず、経験値オーブに曳かれるウシや、飛んで行く矢に曳かれるウシや、
走るトロッコに引っ張られるウシや、果ては着火したTNTに繋がれて逃げられないウシなど、
突っ込みどころには事欠かない実装になっている。
特に意味は無いが、自分にかけたリードを自分自身が持つことさえ可能。
プレイヤーがリードを持つことはできるが、プレイヤーをお縄に掛けることはできない。


いろいろなエンティティに曳かれるウシ。
数珠繋ぎや相互リンクにすることもできる。

なお、あるエンティティが同時に複数のエンティティを曳くことも可能である。
(たとえば、1人の村人が2頭のウシを曳くことは可能。)

逆に、あるエンティティが同時に複数のエンティティに曳かれることはできない。
(たとえば、2人の村人が1頭のウシを曳くことはできない。)
この場合、先に曳いていたリードが消去され、後に設定したリードだけが残る。

リードはもともと、強く引っ張ると切れてしまう性質があることを忘れないように。
特に、10m以上離れたエンティティ同士を接続すると直後にリードが音も無く切れてしまったりする。
setLeashHolderを実行したのにリードでつながれてない!なんて不具合を延々調査して
よく考えたら仕様で切れてただけだったなんてつまらない発見に時間を費やすのはよくある話である。

その他

定数名 対応クラス これ何? ポイント
FISHING_HOOK Fish 釣り針 スポーン不可
PLAYER Player プレイヤー スポーン不可
LIGHTNING LightningStrike 落雷 音はすれども姿は見えずな場合が多い。雷を落としたいなら先日の記事を参照
COMPLEX_PART ComplexEntityPart エンティティの構成単位 ひとつのエンティティが複数のエンティティで構成される場合に、その構成ひとつひとつのエンティティを指す。
現時点でエンダードラゴンのみ該当。スポーン不可。
UNKNOWN 不明 不明 スポーン不可
WEATHER Weather 天候関連 雷などのエンティティのベースクラス。スポーン不可。

PLAYERをスポーンすることはできない。
エンティティオブジェクトがプレイヤークラスのオブジェクトであるかどうかは、entity interfaceof Playerのようにすると、
entityがPlayerクラスのオブジェクトかどうか調べることができる。

ちなみにFISHING_HOOKに対応するクラスはFishである。
Fishは魚であって釣り針ではない気がするのだが、Fishの説明にはRepresents a fishing hook(釣り針を表す)とはっきり書いてある。なんでだ?


件のボスモンスタープラグインを、Lv30以上かつHPが3割以下になるとウィザースケルトンに変身するように弄ってみた。
普段は憎いけど防具を着せたらなんだかかわいく見えてきたのは気のせいか。

この記事を評価

この記事にコメント

  1. ...

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

Menu