昨年末からマインクラフトでミニゲームをぼちぼちと作っています。
ゲームの仕様としては
- 複数人協力プレイ
- みんなで宝を探して各プレイヤーが集めた宝の数をそれぞれ表示
- 全員が集めた宝の数が、一定数超えたらゲームクリア
と考えています。
宝としては、各宝に説明文を入れたいと思っていたので、「本と羽ペン」を選択しています。
アイテムに説明文を入れられたら他のアイテムもでも良いのですが、統合版ですとアイテムに説明文を付けられないんですよね。
また「記入済みの本」ですとアイテムのセレクターで指定できなかったので本と羽ペンを選択しました。
各プレイヤーの持っている宝の表示
まずは、各プレイヤーが取得した宝の数の表示をします。
以下のコマンドを実行します。
scoreboard objectives add books dummy 本の数
各プレイヤーのスコアを表示するのに ”scoreboard” を作成します。
スコアボードにオブジェクト ”books” を変動基準 “dummy” で作成して、表示名は「本の数」とする。
ということかな。
さらに以下のコマンドを実行します。
scoreboard objectives setdisplay sidebar books
このコマンドで、各プレイヤーの “books” のスコアをサイドバーに表示することができます。
各プレイヤーが持っている宝の数の取得
統合版では、各プレイヤーが持っている特定のアイテムの数を取得するために、以前書いた記事のようにする必要があります。
コマンドブロックを使う場合は
execute as @a[hasitem={item=アイテムのID,quentity=0}] run scoreboard players set @s アイテムのID 0
ブロックの種類:リピート
条件:無条件
レッドストーン:動力が必要
としたコマンドブロックに続けて
execute as @a[hasitem={item=diamond,quantity=1}] run scoreboard players set @s diamonds 1
ブロックの種類:鎖
条件:無条件
レッドストーン:常時実行
のように quantity= と最後の数字を1ずつ増やして、必要な数だけコマンドブロックを繋げます。
function を使う
ただこれですと手間がかかるので function を使ったほうが楽です。
function を使うには、以前の記事を見てみてください。
function が使える環境を作って、functions フォルダを開くと、中に tick.json というファイルがあります。
{
"values": [
]
}
この values の中に、fanction ファイル名を記述してやると、そこに書き込まれているコマンドが、常時リピートで実行されます。
例えば book_count.mcfunction というファイルを functions フォルダ内に作って以下のように記述します。
execute as @a[hasitem={item=writable_book,quantity= 0 }] run scoreboard players set @s books 0
execute as @a[hasitem={item=writable_book,quantity= 1 }] run scoreboard players set @s books 1
中略
execute as @a[hasitem={item=writable_book,quantity= 49 }] run scoreboard players set @s books 49
execute as @a[hasitem={item=writable_book,quantity= 50 }] run scoreboard players set @s books 50
宝探しなので、隠す宝の数だけ数字を増やしてあげればいいでしょう。
今回は50までとしました。
そして tick.json の中身を以下のように書き換えます。
{
"values": [
"book_count"
]
}
これで、各プレイヤーが持っている宝の数を、サイドバーに表示することができるようになります。
宝の総数をアクションバーに表示
各プレイヤーの持っている宝の数の合計が一定値を超えたらクリアとするので、宝の数の合計を求めます。
スコアボードに
scoreboard objectives add total_books dummy 本の合計
total_books というスコアを本の合計という名前で追加します。
function フォルダに total_books.mcfunction というファイルを作って以下の記述をします。
# total_books のリセット
scoreboard players reset 本の総数 total_books
# 各プレイヤーのbooksを合計してtotal_booksに代入
scoreboard players operation 本の総数 total_books += * books
# 本の合計をアクションバーに表示
titleraw @a actionbar {"rawtext":[{"text":"本の合計:"},{"score":{"name":"本の総数","objective":"total_books"}}]}
このファイルを tick.json で呼び出します。
{
"values": [
"book_count",
"total_books"
]
}
これで、ゲーム画面下部に「本の合計:5」のような表示が現れます。
ゲームのクリア処理
最後に、宝を全員で一定数以上集めたときの処理をします。
コマンドブロックを以下のようにします。
scoreboard players test 本の総数 total_books 10
ブロックの種類:リピート
条件:無条件
レッドストーン:常時実行
このコマンドブロックは本の総数が10以上になると、レッドストーン信号を出力します。
ですので、このコマンドブロックをレッドストーンコンパレーターで測定して、その先に例えば下記のようなコマンドブロックを置きます。
/title @a title Game Clear!!
ブロックの種類:インパルス
条件:無条件
レッドストーン:動力が必要
こうすることで、全プレイヤーの宝の総数が10以上になったら、タイトルで ”Game Clear!!” と表示させることができます。
続いてなにかの処理をさせたいときは、
ブロックの種類:鎖
条件:無条件
レッドストーン:常時実行
のコマンドブロックを繋いで、コマンドを記述します。
(コマンドブロックの矢印の方向に注意してください)
プレイヤー協力型の宝探しゲームの、基本的な部分はこんな感じで作ることができました。
java版でしたら、アイテムの数の取得など他の方法で簡単にできたり、統合版でももっとスマートな方法があるかもしれませんが、とりあえずはこんなやり方で。
コメント