マケプレ、著書等あったりします!!

マケプレ作品は絶対におススメです!!!!

ScriptAPIで、ブロックを特定の場所に置くと発動する仕掛けを考える【マインクラフト】

はいどーも、ようこそぷっこ村へ、ししゃもです。

(・∀・)ノ

今回は、前回作ったデーモンイカの決戦場(アリーナ)を使って、「ブロックを特定の場所に置くと発動する仕掛け」を作ってみましょう。小難しい言い方になってますが、要するに追加ブロックを置いたらアリーナが出てくるってことです。

ちなみに現状では、試験機能なしでブロックを置いたときに何かしらのイベントが発生するような仕掛けは、ScriptAPIでしか作れません。今後はScriptAPIの方が充実してくる流れができてきてるので、できたら簡単な内容なら自分で作れるようになりましょう!ガンバ!

今回の仕様

  • 台座ブロックの上にデーモンイカの像を置くと、イベントが発生するようにする。

あれ?これだけか。整理すると簡単だね。

用意しないといけないもの

簡単ではありますが事前準備はいろいろと必要になります。最低限必要なのは

  1. アドオン本体(大前提)
  2. 台座ブロック
  3. デーモンイカの像ブロック
  4. アリーナをストラクチャ化しておく

ですかね。あとはクオリティを考慮するなら

  1. 効果音とか
  2. パーティクルとか

でしょうか?後は camerashake とか適度に使えばええんちゃう?

ScriptAPIで使うなにがし

ここからが結構大変で、基本的にまず公式のサイトを見て、VScodeいれて、自動でコンパイルしてくれる環境までは入れとかないといけないです(なくてもいいけどしんどい)

Build a gameplay experience with TypeScript
Use TypeScript to build a simple gameplay experience in Minecraft using the experimental Beta APIs feature

↑このページ見て環境を整えましょう。見た通りやればええけん大丈夫!ファミ通の攻略本だよ!で、使うAPIなのですが、特徴的なのを抜き出すと

  • playerPlaceBlock
  • hasTag()
  • below()

よく使ったり、いつ使うんか分からんかったりしますが、なんやかんやで便利なのをピックアップ

playerPlaceBlock はプレイヤーがブロックを置いたときのあらゆるデータが入ってます。誰が置いたとか、置かれたブロックとか、座標とかです。

hasTag()は追加ブロックにタグを持たせたときに判別できる関数です。ブロックのタグは component 内に “tag:mosq_syamo_stone”: {}, などの形で持たせたものを判別できます。便利!

below()は、ソースブロックの1マス下(引数で指定可)のブロックを返します。こんなんいつ使うねん?って思ってたけど、普通に使う機会あったわwていうかよく考えたらバリバリ便利やわ。

ScriptAPI解説

world.afterEvents.playerPlaceBlock.subscribe((e) => {
  const block_root = e.block;
  //@ts-expect-error
  const block_id = block_root.permutation.type.id
  //world.sendMessage(`${block_root.hasTag("mosq_syamo:boss_statue")}`);
  if(block_root.hasTag("mosq_syamo:boss_statue")){
    if(block_root.below()?.permutation.matches("mosq_syamo:base_boss_statue")){
      const block_location = block_root.location
      const current_dimension = block_root.dimension.id
      switch(block_id){
        case "mosq_syamo:statue_daimon":
          world.getDimension(current_dimension).runCommand(`summon mosq_syamo:marker_boss_initter ${block_location.x} ${block_location.y} ${block_location.z} 0 0 mosq_syamo:variant_daimon_squid`)
        break;
      }
    }
  }
});

で、主要な部分だけ抜き出すとこんな感じになります。こういうのって解説が難しいねんけど一応↓こういう風に解説してくれる人がいたら自分ならわかりやすいのになー、っていつも思ってる感じでやってみる。見比べながら理解してね。

プレイヤーがブロックを置いたら、そのイベントを引数にして実行する {
  変数 block_root を作って、これにイベントで置かれたブロックを入れる
  //@ts-expect-error(一行下のエラーを無視、理由は後述)
  変数 block_id を作って、これに block_root からブロックの名前(id)を入れる
  // block_root から mosq_syamo:boss_statue のタグがあるかチェックして結果を返す(テスト用)
  もし block_root に mosq_syamo:boss_statue のタグがあったら実行 {
    さらに、もし block_root の下(below()関数で判定できる)が mosq_syamo:base_boss_statue ってブロックだったら実行{
      変数 block_location を作って、block_root の座標 (location : Vector3) を入れる
      変数 current_dimension を作って block_root が置かれた時のディメンションを入れる
      block_id を使ってケースごとに判定して実行{
        block_id が mosq_syamo:statue_daimon なら:
          指定したコマンドを実行(summon mosq_syamo:marker_boss_initter 置かれた位置 0 0 mosq_syamo:variant_daimon_squid)
      }
    }
  }
}

//@ts-expect-error なのですが、本来は必要ないです。でも、執筆時にはTypescript君がまだ最新のAPIを理解しておらず、エラーを吐いてコンパイルしてくれません。マイクラ上では普通に動きます。コメント?めんどいし知らんよ。

なので、対応したら逆に教えてもらえるように @ts-expect-error でとりあえず回避しときます。ぶっちゃけ、こういうのめちゃくちゃ多いです。structure 関係のAPIもエラーまみれだけど普通に使えて、何を信用したらええんか相変わらず分からんグチャグチャ感です。

これらを何とか潜り抜けると以下のようなことができるようになります。

- YouTube
YouTube でお気に入りの動画や音楽を楽しみ、オリジナルのコンテンツをアップロードして友だちや家族、世界中の人たちと共有しましょう。

なんで縦動画なん?なんとなくだよ。ぶっちゃけ縦動画って見にくいよね。人間の脳って映像に関しては横方向に広く対応してると思うんですが……。進化を促してるの?

てなわけで、今回はこの辺で。気が向いたらScriptAPIの解説はボチボチしていきましょうかね。お帰りの際はお気を付けて~(・∀・)ノシ

コメント