はじめに
前回の投稿から、だいぶん間が空いてしまいました。ドムドーラとメルキドの間をつなぐ地域の地形データを測量していたのですが、思いのほか広大でまだマップ生成に至っていないという状況です。測量の休憩がてら、毒の沼地を疑似的に再現する方法を思いついたので、今回はそちらを紹介したいと思います。
毒の沼地
ドラゴンクエストにおける毒の沼地は、一歩進むごとに小ダメージ(HP2相当)を受けるという地形です。マインクラフトでは、歩数に応じたダメージを計算することは難しいので、特定のブロックの上にいることを条件として時間経過でダメージを受ける形で毒の沼地を実装しようと思います。
マインクラフトにおいて、上にいることでダメージを受けるブロックとしては、「マグマブロック」があります。ただ、赤く発光する外観が沼地っぽくないことと、スニークすることでダメージ回避ができるため、毒の沼地を実装するブロックとしては採用を見送ります。
今回は外観的に毒の沼地に近い「泥」ブロックを採用し、泥ブロックの上にプレイヤーがいる時に定期的にダメージを受ける仕組みを実現したいと思います。
条件判定
プレイヤーが毒の沼地の上にいるかどうかを確認する方法として、testforblock
を使います。このコマンドは、指定した領域にあるブロックを判定するコマンドです。プレイヤーが毒の沼地=泥ブロックにいるかどうかは、プレイヤーの一つ下のブロックが泥ブロックかどうかをこのコマンドで判定することで確認できます。判定のためのコマンドは以下のようになります。
/testforblock ~ ~-1 ~ mud
このコマンドは、プレイヤーの一つ下のブロックが泥のときに真となります。
判定の定期実行
前節で上げた判定コマンドを定期実行させるためには、リピートのコマンドブロックを使います。ただし、コマンドブロックに前節のコマンドをそのまま投入すると、~ ~-1 ~の相対位置判定がコマンドブロックの位置を基準に実行されてしまうため、プレイヤーの現在地を基準に判定されるよう、以下のようにコマンドを改修する必要があります。
/execute as @p at @p run testforblock ~ ~-1 ~ mud
executeコマンドで実行対象と実行位置を@p(コマンドブロック最寄りのプレイヤー)とすることで、プレイヤーの位置を基準に泥ブロックの上にいるかどうかを判定することができるようになります。
ダメージ付与
プレイヤーへのダメージ付与には、effect
コマンドのinstant_damageを利用します。以下のコマンドを実行することで、プレイヤーにハート1.5個分のダメージを与えられます。
/effect @p instant_damage 1 0
前節で挙げたリピートのコマンドブロックに、チェーンのコマンドブロックをつなぎ、上記コマンドを設定することで、位置判定を繰り返すたびにプレイヤーにダメージを与えることができるようになります。
お試し動画
実際にコマンドブロックを実装してみた動画が以下となります。今回は、メルキドの南に広がる毒の沼地エリアにコマンドブロックを置き効果を発動させてみました。泥ブロックの上にいる時には定期的にダメージが発生し、別のブロックに退避した時にはダメージが発生しなくなっていることがわかると思います。
おわりに
今回は、testforblockとeffectの組み合わせで、特定のブロックの上にいる時に、定期的にダメージが発生する仕組みを実装し、毒の沼地を再現しました。ロトのよろいの効果でこのダメージを無効化するには、ロトのよろいを装備しているかどうかの判定ロジックを用意し、今回の仕組みで使っているリピートのコマンドブロックへの動力供給を判定結果に応じてオンオフするような仕組みを作れば実現できそうです。
しばらくは、地道な測量が続くと思いますので、測量の合間に実装してみたいと思います。
おまけ
これまでの投稿をまとめておきます。
No. | 内容 |
---|---|
Part1 | マインクラフトでの地形生成 |
Part2 | 町の再現① |
Part3 | メルキド as Code |
Part4 | 住民との会話システム |
Part5 | 海と森の生成 |
Part6 | 森の生成方法の改良 |
Part7 | ドムドーラ地方の生成 |
Part8 | ドムドーラの町づくり |
Part9 | マイクラ版ロト装備の検討 |